2011-10-25 2 views
7

아, GCC와 MAC 및 Makefile의 초보자입니다. 나는이 정보를 봤"___emutls_get_address"기호 란 무엇입니까?

Undefined symbols: 
    "___emutls_get_address", referenced from: 
     _malloc in michael.o 
     _malloc in michael.o 
ld: symbol(s) not found 

,하지만 난 이해할 수 없다 : .o 만 파일을 링크 할 때 오늘은 MAC OS X 및 GCC 4.4.2를 사용하여 동적 lib 디렉토리를 구축하도록하지만, 컴파일러는 다음과 같이 불평 결과는 잘, 나는 상징 의미, 그리고 왜 프로그램의 많은이 연결 오류가 궁금해. 나는이 오류의 원인이 무엇인지 궁금는 연결 명령은 다음과 같습니다

g++ -Dx86 -D_GNU_SOURCE -D_REENTRANT -Wall -m32 \ 
    -fno-strict-aliasing -fno-pic -O3 -ggdb \ 
    michael.o malloc_new.o -o libmichael.so \ 
    -lpthread -lm -lstdc++ -shared 
+0

'-lstdC++ '를 명시 적으로 링크 할 필요는 없으며, g ++은 올바른 것을 선택해야합니다. 그것을 제거하십시오. – Mat

답변

5

이 기호는 TLS (스레드 로컬 저장소) 맥 OS X 용 GCC에 의해 에뮬레이션의 일부가 GCC에 약간의 버그가 있습니다 이것에 대해 버그질라, 예를 들면 : 다윈 에 스레드 로컬 저장소 (예 : OpenMP를 ThreadPrivate 변수)를 사용하여 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39888

수동으로 하나 -lgcc_s.so.1 또는 -lgcc_eh

를 통해 TLS의 emutls에 연결 요구를 참조하십시오 스레드 : http://gcc.gnu.org/ml/gcc/2008-12/msg00145.html http://gcc.gnu.org/ml/gcc/2008-12/msg00107.html

위의 스레드에서 보면, 이것은 분명히 꽤 혼란 스럽습니다. 그러나 나는 단지 비트로이 문제를 추적하는 것이 유용 할 것으로 기대했다. 위에서 언급 한 바와 같이 내가 수동으로 gcc_s.so.1 또는 gcc_eh에 연결하면

...

TLS 잘 작동합니다.

그래서 가능한 해결책 중 하나는 연결 단계에 -lgcc_s.so.1 또는 -lgcc_eh 옵션을 추가하는 것입니다. 그리고 다른 것은 gcc를 업데이트하는 것입니다. gcc의 버그이기 때문입니다.

+0

나는이 두 라이브러리를 시도했지만 첫 번째 라이브러리를 찾지 못했습니다. 두 번째 것을 사용하면 emutls 심볼을 발견 할 수 있지만 GCC는 "michael.o의 _DescRetire에서 절대 주소 지정 (아마도 -mdynamic-no-pic)이 슬라이딩 가능 이미지에서 허용되지 않는다고 불평을 계속합니다. '-read_only_relocs suppress '텍스트 유물을 가능하게하기 위해', 나는 그것에 대해 아직 생각하지 못했다. – JustQieTry

+1

JustQieTry, 이건 '-fno-pic'옵션에서 온 것 같아요. 이 옵션을 사용하지 않고 프로젝트를 다시 컴파일하십시오. .so 라이브러리 및 동적 라이브러리를 빌드하려는 경우 -fpic 모드로 컴파일해야합니다. – osgx

+0

-fpic이 켜져있는 경우 또 다른 문제가 있습니다. "asm '을 다시로드하는 동안"BREG'클래스의 레지스터를 찾을 수 없다는 불평을합니다. 그걸 찾아 가서 mac의 경우 -fpic이에 있습니다. 기본, 그래서 그것을 전환 ....... 그 잘못인가? – JustQieTry