2016-12-13 13 views
1

실행 파일을 ld으로 링크 할 때 실행 파일이 의존하는 라이브러리 목록을 제공합니다. 이 라이브러리에 대한 위치 정보의 유일한 소스입니까, 아니면 오브젝트 파일에 메타 데이터로 저장된 종속 라이브러리의 기본 버전에 대한 정보입니까?ELF 오브젝트 파일은 종속 라이브러리의 파일 시스템 경로를 저장합니까?

구체적인 문제는 이것이다 : 나는 모두 제 3 라이브러리 lC에 따라 두 개의 종속 라이브러리 lAlB을, 링크, 그리고 링크 라인이 라이브러리에 대한 참조를 배치합니다. lA의 C++ 클래스 메서드가 lB의 클래스 메서드와 다른 버전 lC을 호출하고있는 것 같습니다. 이것이 어떻게 가능한지? 나는 이것이 백 트레이시를보고 gdb에서 보는 것을 안다.

+0

:

내가 DT_RPATHDT_SONAME에 대한 통찰력의 몇 내 블로그에 당신을 보낼 수 있습니다 * 일어날 수 없다. 따라서 설명이 잘못되었거나 관찰 된 결과에 대한 해석이 잘못되었습니다. 유감스럽게도 실험을 복제 할 수있을만큼 자세하게 설명하지 않았으므로 더 이상 도움을 드릴 수 없습니다. 질문을 수정하고 최소한의 예를 보여 주면 모든 것이 공개됩니다. –

답변

1

수도 있습니다. 심볼 해상도는 DT_RPATH입니다. 그들은 또한 에 버전 번호가 포함 된 전체 개체 이름을 포함하고 라이브러리가 버전 관리를 올바르게 사용하면 기호가 실제로 충돌하지 않습니다. 당신이 설명한 것을 정적 라이브러리와

+0

정적 연결에 대해 묻고 있음을 분명히해야합니다. – ThomasMcLeod

+0

당신은 정적 라이브러리의 연결을 의미합니까? 그렇다면 좀 더 재미 있고 조금 다른 문제가 될 수 있습니다. 이러한 클래스 메소드가 인라인 인 경우, 컴파일러는'libA' 및'libB' 객체 각각에 다른 심볼 사본을 생성하여 주소를 변경할 수 있습니다. 그렇지 않으면 가시성 규칙 문제 일 수 있습니다. –