2014-01-19 2 views
0

Linux에서 GCC와 GNU Binutils를 사용하여 i386 Linux 용 코드를 컴파일하고 링크합니다. 나는 .custom라는 이름의 섹션을 허용하고 싶습니다, 그래서 컴파일 오류 또는 링크 오류와 함께 실패 할 다음 싶습니다특정 섹션에서 링커 오류를 강제하는 방법

__attribute__((section(".custom"))) int foo() { return 42; } 
int main(void) { return 0; } 

하지만,이 사람은 평소와 같이 성공한다 :

__attribute__((section(".other"))) int foo() { return 42; } 
int main(void) { return 0; } 

__attribute__((section(".custom"))) 코드는 내 제어 할 수 없으므로 (.c 파일의 #error으로 바꿀 수는 없지만) gccld 명령 줄 플래그 (및 빌드 프로세스)는 내 제어하에 있습니다.

gcc 또는 ld에 대한 명령 줄 플래그 또는 오류를 유발할 수있는 다른 트릭이 있습니까? 맨 페이지와 관련된 내용을 찾을 수 없습니다.

내 대체 솔루션은 생성 된 실행 파일 (예 : objdump -x 사용)을 구문 분석하고 .custom 섹션에서 최종 실행 파일로 만들면 오류 메시지와 함께 실패합니다.

답변

2

당신은 .custom 섹션의 모든 기호를 폐기하기 위해 링커 스크립트를 사용할 수 있습니다 :

SECTIONS 
{ 
    /DISCARD/ : { *(.custom) } 
} 

당신이 정말로 오류와 사용자를 처벌하기보다는 단순히 기호를 폐기하고 싶었을, 당신이 대신 할 수 있다고 가정 .custom 섹션의 크기가 0 인 링커 스크립트 ASSERT이 있어야합니다. 그래도 작동하도록 섹션을 생성해야한다고 생각합니다. 그렇지 않으면 섹션에없는 오류가 발생합니다. 있다.

+0

통찰력에 감사드립니다. 사용자가 그가 요구하는 기능이이 빌드에 존재하지 않는다는 사실을 알게되도록 오류가 실제로 필요합니다. – pts

관련 문제