2009-03-19 6 views
1

나는 동일한 섹션에 몇 가지 코드와 관련 데이터를 갖고 싶습니다. 내가 좋아하는, 속성 태그 데이터와 함수를 선언 :리눅스 커널 모듈의 같은 섹션에 코드와 데이터 넣기

error: foo causes a section type conflict 

나는 특정 섹션 이름으로 함수를 선언하지 않는 경우 :이 작업을 수행 할 때

void * foo __attribute__ ((section ("SEC_A"))) = NULL; 
void bar(void) __attribute__ ((section("SEC_A"))); 

그러나, GCC는 함께 불만 , gcc는 괜찮습니다. 하지만 함수와 변수가 같은 섹션에 있어야합니다.

gcc로 할 수있는 방법이 있습니까? 내 GCC 버전은 GCC 설명서에서 gcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2

답변

1

입니다 : 섹션의 속성은 모든 플랫폼에서 사용할 수 없습니다 있도록

일부 파일 형식은 임의의 부분을 지원하지 않습니다. 모듈의 전체 내용을 특정 섹션에 매핑해야하는 경우 대신 링커의 기능을 사용하는 것이 좋습니다.

IIRC, linux는 플랫 메모리 모델을 사용하므로 단일 섹션에 "강제로"강제로 아무것도 얻지 못합니다. 어쨌든 그렇습니다.

흠. 나는 당신이 공간을 확보하기 위해 asm 함수를 만들 수 있다고 가정하고 foo 포인터를 가져 와서 그 주소를 얻는다. 반으로 문제를 분할하는 것입니다 ... 매크로에서

또 다른 생각을 추악한을 마무리 할 수 ​​있습니다; 가능한 가장 가까운 것의 작은 예제 케이스를 작성하고 컴파일하고, asm 코드를 얻고, 다운 스트림 스테이지를 통과 할 수있는 것을보기 위해 땜장이를하십시오. 그 밖의 것이 없다면, 당신은 무언가를 작성하여 그 모듈을위한 asm 코드를 작성하고, 파일을 만들고, 좋은 것을 호출 할 수 있습니다.

는 또 다른 생각 : (dB 년대 나, E, G 무엇이든 오른쪽 부분 선언 포함)을 작은 ASM 모듈의 변수 정의를 넣어 시도하고 링커가 그것을 처리 할 수 ​​있습니다.

+0

감사합니다. 그렇습니다, 나는 설명서에서 그것을 보았습니다. 문제는 내가 전체 모듈을 별도의 섹션에두고 싶지 않고 단지 몇 가지 함수와 전역 변수에 넣고 싶지 않다는 것이다. 이것은 몇 가지 실험적인 작업을위한 것이며, 우리는 밑에있는 페이지 테이블에 일을 할 것이므로이 레이아웃이 필요합니다. – samgrover

+0

섹션 속성은 Linux (2.6, x86)에서 확실히 사용할 수 있습니다. –

0

나는 (일부) 운영체제가 프로세스 재사용는 .text 섹션 유형의 불변을 가정하기 때문에이 같은 섹션에 텍스트 (기능) 및 데이터 (BSS) 물건을 올려 놓지 수 있다고 생각합니다.

+0

데이터가 const 인 경우 OP가 수행하려고하는 작업이 효과가있을 수 있습니다. 그 결론에 동의 하시겠습니까? – ephemient

+0

거푸집 없음, 같은 오류 - "const char foo __attribute__ ((SEC_A"))) = 'x'; "시도했습니다. –

+0

const는 불변성을 의미하지 않습니다. – sigjuice