2017-12-12 26 views
1

LD_PRELOAD을 사용하여 라이브러리를 미리로드하는 프로그램을 실행하려고합니다. 런타임에 프로그램이 다음 오류를 던지고 있습니다.참조 된 기호를 찾을 수 없습니다.

ld.so.1: gdbser64: fatal: relocation error: file libmy.so: symbol _ZN10__cxxabiv118register_exit_codeEPFYvvE: referenced symbol not found

libmy.so 어디 register_exit_code 기호를 사용하지 않습니다. libmy.so에 의해 링크 된 표준 라이브러리가이 기능을 사용하는 경우 일 수 있습니다. 그러나 나는이 기호를 사용하고있는 사람이나 그것을 정의한 사람을 찾을 수 없습니다.

Solaris에 있으며, CC(solaris cpp compiler)을 사용하여 컴파일됩니다.

+1

를 사용해야하는 것이 좋습니다, 당신은 파일이 심볼을 필요로하는 아이디어를 얻을 정의되지 않은 기호에 대한 objdump를 함께 검색 할 수 있습니다 . 그리고 자연스럽게 당신은 그들을 제공하는 파일을 검색 할 수 있습니다 ... – Klaus

+0

libmy.so에 동적으로 링크 된 프로그램이나 실행 파일이 libmy.so shared-lib의 심볼'register_exit_code '를 기대할 수 있습니다. 따라서 libmy.so에 의존하는 실행 가능 파일이나 공유 라이브러리에서 가장 많이 발생합니다. –

+0

@Klaus objdump는 기호를 정의되지 않은 것으로 표시하지만 정의/호출 된 파일/라이브러리는 표시하지 않습니다. 나는 'objdump -t libmy.so'를 사용했다. – user2137306

답변

1

모든 소스 파일/라이브러리가 -std = C++ 0x로 빌드되어 있습니까?

그렇지 않으면, Oracle docs 당신이 -lstdc로 연결하는 경우 솔라리스는 ELF 파일 형식을 사용하는 경우 ++ 다음 -lstdc++ -lgcc_s -lCrunG3

+0

솔라리스에서 g ++ 컴파일 바이너리가 g ++ 컴파일 라이브러리와 잘 작동하며 gcc, CC 컴파일 라이브러리와는 잘 맞지 않습니다. 이 올바른지? 왜 그렇습니까? – user2137306

+1

일반적으로 다른 C 컴파일러로 컴파일 된 객체는 혼합 할 수 있지만 다른 C++ 컴파일러와는 혼합 할 수 없습니다. 그 이유는 Itanium과 같은 일부 플랫폼을 제외하고 C++에는 표준 이진 인터페이스 (ABI)가 없다는 것입니다. 특히 C++ 런타임 라이브러리 (예외 처리 방법을 정의)는 일반적으로 서로 다르며 호환되지 않습니다. –