2013-07-25 3 views
4

내 문제는 Python, Qt, PyQt 및 기타 문제를 다루지 만 실제로 Linux의 ld.so이 실제로 어떻게 작동하는지에 대한 질문입니다.동일한 함수 이름을 정의하는 두 개의 Linux 공유 객체 사이의 충돌

는 버전을 알 수있는 방법을 질문

프로그램로드가 같은 진입 점 이름이 두 개의 서로 다른 공유 라이브러리가 (둘 다 같은 이름 및 서명 함수를 정의 예) 경우를

입니다 부름? 내가 C로 작성된 타사 독점 리눅스 응용 프로그램이

내 문제 ++ (원래 언어는 무관하지만)과는 Qt3.3에 동적으로 링크 된 것. 응용 프로그램에는 스크립트를 작성하는 데 사용할 수있는 파이썬 인터프리터가 내장되어 있습니다.

당신은 같은 명령을 사용하여 원래 대신 응용 프로그램의 임베디드 파이썬을 사용할 수 있습니다

/path/to/the/program/python 

그리고 다음을 보여줍니다

Python 2.7.1 (r271:86832, Sep 16 2011, 18:16:32) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

GCC 내가 가지고있는 4.1.2을 사용하여 소스로부터의 PyQt4를 시스템이 가지고있는 Qt4 라이브러리와 비교하여 빌드하고 설치했다. 그것이 첫 번째 PyQt4 호출에 충돌,

/path/to/the/program/python mypyqtapp.py 

을하지만, 나는 그것의 GUI와 프로그램을로드하고 동일한 스크립트를로드하는 경우 : 내가 사용하는 작은 PyQt4 응용 프로그램을 실행할 수 있기 때문에 빌드가 성공 생각 QApplication 클래스의 인스턴스화.

파이썬 환경이 동일하기 때문에 Qt3과 Qt4간에 공유 라이브러리 충돌이있을 수 있습니다. 그러나, strace -e trace=file 명령은 파이썬이 두 가지 경우 모두에서 올바른 Qt4 라이브러리를 찾아로드한다는 것을 나타냅니다.

내 질문은 프로그램이 동일한 함수를 정의하는 두 개의 공유 된 다른 라이브러리를로드하는 경우 어떻게 올바른 함수를 호출 하는지를 알 수 있습니까? 리눅스 로더 ld.so이 어떻게 든 엔트리 포인트를 파일 이름이나 다른 것으로 한정 짓는가? 내 문제는 그 응용 프로그램이 결국 QApplication의 두 개의 다른 인스턴스를로드하고 그 중 하나를 잘못하고있다 의심,하지만 어떻게 ld.so 실제로 내부적으로 나를 도주 작품.

또한 내 문제가 완전히 다른 무언가에 기인 한 것일 수도 있습니다.

감사합니다.

+0

gdb/ddd와 같은 디버거를 사용해 보셨습니까? – Frodon

답변

1

충돌 심볼 만 링키지 (ld) 단계에서 탐지되고 로더 (ld-linux.so)는 충돌 심볼을 확인하지 않습니다.

중복 된 심볼을 제공하는 라이브러리가 여러 개인 경우 처음로드 된 라이브러리가 사용됩니다.

실제로 누군가가이 기능을 사용할 수 있습니다. LD_PRELOAD = overwrite.so를 제공함으로써 overwrite.so는 프로그램에서 필요한 모든 함수를 덮어 쓸 수 있습니다.

+0

이 질문을하게 된 진짜 worl 문제는 오래 전에 쓸모없고 지금 사라졌습니다.LD_PRELOAD 솔루션을 시도해 보면 응용 프로그램이 다른 지점에서만 똑같이 중단된다는 것을 추측 할 수 있습니다. 이 답변은 ld.so가 어떻게 작동하는지에 대해 공식화 된 특정 질문에 대한 직접적인 대답을 제공하기 때문에 받아들입니다. 고맙습니다. – deStrangis