2012-11-09 7 views
1

/Library/Frameworks/Python.framework/Versions/2.7/Python에 대한 참조를 포함하는 .so 파일이 있습니다. (이 경로는 .so 파일 내의 일반 텍스트로 하드 코딩되어 있습니다.) 나는 .so 파일을 만든 소스에 액세스 할 수 없습니다.공유 객체 파일에서 공유 라이브러리 참조를 변경할 수 있습니까?

다른 버전의 파이썬 라이브러리 (/opt/local/Library에 저장 됨)를 사용하고 싶습니다. 이 경로를 다시 할당하기 위해 .so 파일을 편집 할 수 있습니까?

+1

나중에 참조하기 위해 파일을'strings '하는 대신 의존성을 찾는 가장 좋은 방법은'otool -L foo.so'입니다 (그리고'man otool' 또는'otool -h'는 다른 유용한 것들을 볼 수 있습니다 그것은 당신을 위해 할 수 있습니다). – abarnert

+0

호기심에서 벗어나서 시스템과 함께 제공되는 Python 2.7 빌드 외에 왜 (최소한) 두 개의 Python 2.7 빌드가 필요합니까? 이것은 거의 항상 문제가되는 조리법입니다. 그 사이에 모듈을 공유하여 작업을 복잡하게하기 전에 ... – abarnert

답변

3

OS X Xcode 명령 줄 도구에 포함 된 install_name_tool을 사용하여 참조를 영구적으로 변경할 수 있습니다. new-path는 더 이상 원래의 old-path보다 긴 경우

install_name_tool -change old-lib-path new-lib-path path-to.so 

그러나, 번들 파일 (.so를) 이렇게하려면의 필드에 공간이되지 않을 수 있습니다. install_name_tool주의에 대한 man 페이지 : 설치 이름이나 rpaths이 큰 바이너리가 LD로 구축해야 할 때

이 도구는 일 (1) 옵션을 -headerpad_max_install_names.

또한, 새로운 파이썬 당신이 .so를 수정하려고 예상 이전 공유 라이브러리와 호환되는 방식으로 지어진 사용하고자한다는 보장이 없습니다. 성공을 방해 할 수있는 범용 CPU 아키텍처, OS X 배포 대상 및 Python 빌드 옵션 (예 : UCS-2와 UCS-4)에는 차이가있을 수 있습니다. .so를 수정하기 전에 .so 복사본을 만들어야합니다.

+0

마지막 단락의 경우 +1입니다. MacPorts 당신이 아주 운이 좋다면, 파이썬은 아마 애플 파이썬과 호환되지 않을 것이다. – abarnert

+0

나머지 +1은 다시 +1 할 수 없기 때문에 +0입니다. 나는 적어도 Apple과 python.org의 최신 버전이 이것이 효과가있을만큼 충분한 패딩을 가질 것이라고 믿는다 ("성공적으로 경로를 변경"에서와 같이, 반드시 "실제로 적절히로드되고 충돌하지는 않는다"). 물론 실패 여부를 확인해야합니다. – abarnert

+0

원래의 라이브러리 경로는 다른 사용자가 설치 한 파이썬이 아니라 파이썬.org의 파이썬이 아닌 애플이 제공 한 파이썬이 아니라는 것입니다 (즉,'/ System/Library/... '). 이 경우 파이썬 2.7에서 파이썬 2.7이 무엇인지 알아야합니다. 하나는 32 비트 전용 10.3+이고 다른 하나는 64/32 비트 10.6+입니다. –

관련 문제