내 문제는 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
실제로 내부적으로 나를 도주 작품.
또한 내 문제가 완전히 다른 무언가에 기인 한 것일 수도 있습니다.
감사합니다.
gdb/ddd와 같은 디버거를 사용해 보셨습니까? – Frodon