2011-01-14 2 views
6

gcc와 GNU binutils가 링크 시간에 오류를 생성하도록 일부 기능을 표시하는 방법이 있습니까? 필자의 상황은 기존 바이너리와의 호환성을 위해 제거하지 않는 라이브러리 함수가 있지만 새로 컴파일 된 바이너리가 함수를 사용하지 못하도록하려는 것이다. 문제의 코드가 내 머리글을 무시하고 configure 스크립트를 사용하여 함수의 존재를 감지하고 프로토 타입을 작성하기 때문에 컴파일 타임 gcc 특성을 사용할 수 없습니다. 내 목표는 잘못된 configure 스크립트에 대한 링크 타임 오류를 생성하여 함수의 존재를 감지하는 것을 중지하는 것입니다.더 이상 사용되지 않는 함수에 대한 링크 시간 오류 생성

편집 : 새로운 프로그램을 링크 할 때 생각은 .. 동적 링커와 호환 엔트리 포인트에 대한 잘못된 .type를 지정하고 링크 오류를 생성하는 어셈블리를 사용하는 것?

답변

0

사람들이 사용하지 않으려는 deprecated 함수에 대한 링크 타임 오류를 생성하는 가장 좋은 방법은 사용되지 않는 함수가 라이브러리에 없는지 확인하는 것입니다. 그러면 'deprecated'이상의 한 단계가됩니다.

아마도 보조 라이브러리에 사용되지 않는 기능을 제공 할 수 있습니다. 주의를 기울이지 않는 사람들은 보조 도서관과 연결될 수 있지만 주류의 사람들은 보조 도서관을 사용하지 않으므로 그 기능을 사용하지 않을 것입니다. 그러나 여전히 '비추천'단계를 넘어서고 있습니다.

링크 타임 경고 받기는 까다 롭습니다. 분명히 GCC는 일부 기능 (mktemp() 그 외)을 위해 이것을 수행하며, gets()을 사용하는 프로그램을 실행하면 GCC에 경고 메시지가 표시됩니다. 나는 그들이 그렇게하기 위해 무엇을하는지 모른다.


의견에 비추어 볼 때 링크 시간이나 실행 시간까지 기다리는 대신 컴파일 타임에 문제를 해결해야한다고 생각합니다.

GCC는 속성합니다 (GCC 4.4.1 수동으로) 포함

error ("message") 

이 특성 함수 선언과 같은 함수 호출에 사용되는 경우가 죽은 코드를 통해 제거되지 제거 또는 기타 최적화를 수행하면 메시지가 포함될 오류 이 진단됩니다. 이것은 컴파일 시간에 유용합니다. 특히 __builtin_constant_p와 인라인 함수 과 함께 인라인 함수 인수를 검사하는 것이 extern char [(condition)]을 통해 불가능한 지 확인하는 데 유용합니다. 1 : -1]; 속임수. 함수 을 정의되지 않은 상태로두고 링크 실패를 호출 할 수는 있지만 인라인 함수가 있거나 디버깅 정보를 표시하지 않는 경우에도이 속성을 사용하면 문제가 더 일찍 진단되고 정확한 위치로 호출됩니다. 이 속성은 함수 선언에 사용되며, 이러한 함수를 호출 죽은 코드 제거 또는 다른 최적화를 통해 제거되지 인 경우

warning ("message") 

는 메시지를 포함하는 경고 진단됩니다. 이 옵션은 특히 __builtin_constant_p 및 인라인 함수와 함께 컴파일 시간 검사에 유용합니다. .gnu에 메시지가있는 함수를 정의하는 것이 가능하지만.경고 * 섹션에서이 속성을 사용하면 인라인 함수가있는 경우 또는 디버깅 정보를 표시하지 않는 경우에도 문제가 먼저 진단되고 전화의 정확한 위치로 진단됩니다.

구성 프로그램이 오류를 무시하면 오류가 발생합니다. 즉, 함수를 사용하여 새 코드를 컴파일 할 수 없지만 기존 코드는 라이브러리에서 더 이상 사용되지 않는 함수를 계속 사용할 수 있습니다 (다시 컴파일해야 할 때까지).

+0

에 해당되지 ttyslot()을 커밋하지만, 나는 오류를 발생시키는 것에 대한 동등한 것을 모른다. 유감스럽게도 솔루션이 최고이지만 ABI와 새로운 응용 프로그램의 연결에 대한 나의 요구를 충족시키지 못합니다. –

+0

@R .. : 충분합니다. 설치되어있는 라이브러리 사본 하나를 원한다고 말하는 것이 공평합니다. 사전 컴파일 된 응용 프로그램 (비추천 인터페이스를 사용 중일 수 있음)을 계속 실행하려면 다음과 같이하십시오. 더 이상 사용되지 않는 인터페이스를 사용하여 새로 컴파일 된 앱을 연결하지 못하게 하시겠습니까? 그렇다면 설정 감지기가 비추천 함수를 찾아 낼 수 있다면 사람들이 일을 수정하여 현대적인 (비추천 API가 아닌) 인터페이스와 연결되게 할 계획을 어떻게 세우겠습니까? –

+0

새로운 대체 인터페이스가 없습니다. 이러한 비추천 인터페이스를 사용하는 것은 해로울 뿐이며 올바른 동작은이 인터페이스를 전혀 사용하지 않는 것입니다.불행하게도 나는 그것을 사용하려고하는 깨진 소프트웨어에 대한 통제권을 가지고 있지 않으며, 유지 보수 자에게 새 버전을 고칠 수는 있지만, 사용자는 여전히 좋은 버전으로 오래된 버전을 컴파일하려고 할 수도 있습니다. –

0

이러한 기호가 있지만 예기치 않은 속성이있는 스텁 라이브러리를 생성하는 것이 하나의 아이디어 일 수 있습니다.

  • 아마도 함수의 이름이 객체를 생성하므로 구성 단계에서 링커는 기호
  • 해결되지 않습니다 " dont_use_symbol_XXX"종속성이 함수를 만들 호환되지 않습니다 불평 수
  • 가짜 당신의 기능을 가지고 있지만, 아카이브에서 .o 인 회원에
2

의 FreeBSD 9.x에서 아주 가까운 무언가를 잘못 형식이 어디에 당신이 ttyslot()으로 원하는 것이 글로벌 인덱스와 운영자와 파일 기능 . 이 함수는 utmpx에서는 의미가 없습니다. 트릭은이 기호의 기본값이 아닌 버전 만 있다는 것입니다. 따라서 ld은 찾을 수 없지만 rtld는 이전 바이너리가 실행될 때 버전이 지정된 정의를 찾습니다. 오래된 이진 파일에 버전이없는 참조가있는 경우 어떻게 될지 모르겠지만 정의가 하나만있는 경우에는 유용 ​​할 것입니다. 예를 들어

,

__asm__(".symver hidden_badfunc, [email protected]_1.0"); 

일반적으로도

__asm__(".symver new_badfunc, [email protected]@MYLIB_1.1"); 

또는 솔라리스 호환 버전 스크립트를 통해

처럼 기본 버전이있을 것이지만, 트릭 하나를 추가 할 수 없습니다.

일반적으로 asm 지정 문은 매크로로 래핑됩니다.

트릭은 .symver 어셈블러 지시어로 심볼 버전을 정의하는 GNU 확장에 따라 다르므로 리눅스와 FreeBSD에서만 작동합니다. Solaris 호환 버전 스크립트는 심볼 당 하나의 정의 만 표현할 수 있습니다.

더 많은 정보 : .symver 지침 info gas에, 울리히 드레 퍼의는 "공유 라이브러리를 작성하는 방법"는이 경고가`.gnu.warning` 노트와 함께 할 수 http://gitorious.org/freebsd/freebsd/commit/3f59ed0d571ac62355fc2bde3edbfe9a4e722845

+0

어떻게 작동하는지 더 잘 설명하거나 링크를 제공 할 수 있습니까? 내 요구를 충족시킬 것 같은데. –

+0

@R .. 편집에 더 많은 정보를 추가했습니다. – jilles

관련 문제