2012-04-30 3 views
1

기존 glibc 대상 gcc/binutils 툴체인에서 uClibc를 사용할 수 있도록하기 위해 스크립트 작업을하고 있습니다. 남아있는 한 가지 문제는 pthread_canceldlopenlibgcc_s.so.1 일 필요가 있다는 것입니다. 호스트 GCC와 함께 제공되는 버전의 glibc에 의존 연결되어, 그래서 대신 교체 libgcc_s.so.1libgcc_eh.a에서 필요한 문자 (및 의존성)에 끌어 ld-u 옵션을 사용하고 있습니다 :숨겨진 가시성 기호를 GNU binutils로 숨기려면 방법이 있습니까?

gcc -specs uclibc.specs -Wl,-u,_Unwind_Resume -Wl,-u,__gcc_personality_v0 \ 
    -Wl,-u,_Unwind_ForcedUnwind -Wl,-u,_Unwind_GetCFA -shared -o libgcc_s.so.1 

원칙적으로 완료되었지만 libgcc_eh.a의 모든 기호는 가시성이 숨김으로 설정되어 있으므로 .so 파일의 출력은 모두 로컬이되어 .dynsym 기호 테이블에 추가되지 않습니다.

나는 바이너리 유틸리티를 사용하는 방법을 찾고 있어요 (아마도 objcopy? 또는 링커 스크립트?)을 .so 파일 또는 다음의 기호를 취소 숨기기에 libgcc_eh.a 원래 .o 파일 중 하나에. 이것이 가능한가?

답변

1

objcopy에서 --globalize-symbol을 사용할 수 있어야한다고 생각합니다.

 
$ nm /usr/lib/gcc/i686-redhat-linux/4.6.3/libgcc_eh.a | grep emutls_alloc 

00000000 t emutls_alloc 
$ objcopy --globalize-symbol=emutls_alloc /usr/lib/gcc/i686-redhat-linux/4.6.3/libgcc_eh.a /tmp/libgcc_eh.a 
$ nm /tmp/libgcc_eh.a |grep emutls_alloc 
00000000 T emutls_alloc 

당신은 --globalize 심볼을 objcopy의 여러 번 제공 할 수 있습니다,하지만 당신은 명시 적으로 세계화 할 모든 기호의 전체 심볼 이름을 언급해야합니다.

libgcc_eh.a는 아마도 -fpic/-fPIC없이 컴파일되므로 libgcc_eh.a를 공유 객체로 변환 할 때 어떤 종류의 중단이 발생할 수 있는지 잘 모르겠지만. libgcc_eh.a는 위치 독립적 코드로 컴파일됩니다.

+0

아마도'libgcc_eh.a'의 오브젝트 파일은 공유 된'libgcc_s.so'가 사용되지 않을 때 PIC 공유 라이브러리 나 PIE 실행 파일로 가져올 것이기 때문에 PIC 공유 라이브러리 나 PIE 실행 파일에서 사용할 수 있어야합니다. 어쨌든 textrel이 허용되는 i386에서는 적어도 작동 할 것입니다. –

+0

편집을 보았습니다. 내 의견을 떠나는 이유는 * 왜 * 코드가 PIC로 컴파일되는지 설명하기 때문입니다. –