2011-03-15 2 views
2

.so 파일로 컴파일 된 여러 구성 요소를 사용하는 이진 파일을 작성하고 있습니다. .so 파일로 인해 링커 오류가 발생합니다. 그러나 정의되지 않은 함수를 호출하는 파일 또는 정의되지 않은 함수가 호출되는 소스 코드 위치에 대한 정보를 얻을 수 있습니까? 많은 오버로드와 템플릿들이 사용되고 있기 때문에 (너무 많은 장소에서 같은 이름을 의미하는) 기능 esp를 사냥하기에는 너무 지루하다는 것을 알게되었습니다. 윈도우즈에서는 어떤 .o 파일이 정의되지 않은 심볼을 발생 시켰는지 보여 주지만, 리눅스의 라이브러리 레벨에서는 멈춘다. 나는 리눅스에서 g ++를 사용한다. 모든 포인터가 유용 할 것입니다.g ++에서 링커 오류를 일으키는 파일 가져 오기

+0

왜 도서관 단계를 건너 뛰지 않으시겠습니까? 객체를 라이브러리에 결합하고 동적으로로드하는 대신 객체를 직접 바이너리에 연결하십시오. – Beta

답변

3

"공유 라이브러리 안의 어떤 오브젝트 파일이 오류를 일으키는 지"묻는 중입니다.

문제는 공유 라이브러리가 링크 될 때까지 모든 객체 파일이 "융합"되었으며 공유 라이브러리 내에 별도의 엔티티로 존재하지 않으므로 귀하의 질문이 다소 의미가 없음을 의미합니다.

은 ( -g 플래그) 디버그 빌드를 할 경우 소스 파일과 줄 당신이 다음 개체 파일로 변환 할 수 있습니다 문제를 일으키는, 링커가 당신을 말할 것이다, 말했다.

할 수 없습니다 (예를 들어, 문제의 기호 헤더 파일에서 참조되기 때문에), 당신이 도움을 링커를 요청할 수 있습니다 경우 : 링커에게 -y 플래그 통과, 다시 라이브러리를 재 구축

g++ -fPIC -shared ${OBJECTS} -o foo.so -Wl,-y,my_unresolved_symbol 

것 어떤 객체가 my_unresolved_symbol을 참조하는지 알려줍니다.

참고 : 링커는 C++의 "아래"에서 작동하므로 사용자가 변경 한 이름을 전달해야합니다. _Znw.

+0

정보를 제공해 주셔서 감사합니다. 매우 유용했습니다. 정적 인 라이브러리가 아닌 정적 인 라이브러리를 생성하기 위해 빌드 시스템을 조정할뿐 아니라 gcc가 원하는 정보를 제공합니다. – Venkatesan

0

ldd (인쇄 공유 라이브러리 종속성)을 사용하면 so의 종속성을 확인할 수 있고 해결 여부를 확인할 수 있습니다.

nm -Aa --demangle을 사용하면 제거되거나 제거되지 않은 한 * .so 파일에서 사용되거나 정의 된 기호 목록을 가져올 수 있습니다. 사용되지 않은 기호가 있는지 확인할 수 있도록 사용 된 기호가 최소한 남아 있어야합니다.

+0

고마워,하지만 이미 파일에서 오류를 일으키는 오류 메시지를 알고 있습니다. 어떤 객체 파일이 정의되지 않은 함수를 사용하는지 알고 싶습니다. – Venkatesan