是否可以更改共享对象文件中的共享库引用?

时间:2012-11-09 23:32:25

标签: python c macos shared-libraries cpython

我有一个.so文件,其中包含对/Library/Frameworks/Python.framework/Versions/2.7/Python的引用(我可以在.so文件中看到以明文形式硬编码的此路径)。我无权访问构建.so文件的源代码。

我想使用不同版本的python库(存储在/opt/local/Library中)。是否可以编辑.so文件以重新分配此路径?

1 个答案:

答案 0 :(得分:3)

您可以使用OS X Xcode命令行工具附带的install_name_tool永久更改引用。

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

但是,如果new-path比原始old-path长,则捆绑文件(.so)中的字段可能没有空间来执行此操作。 man提醒的install_name_tool页面:

  

当安装名称或路径较大时,此工具可以正常工作   应使用ld(1)-headerpad_max_install_names构建二进制文件   选项。

此外,无法保证您希望使用的新Python的构建方式与您尝试修改的.so所期望的旧共享库兼容。通用CPU架构,OS X部署目标和Python构建选项(例如,UCS-2与UCS-4)之间可能存在差异,这可能会妨碍成功。在尝试修改.so之前,您应该复制.so。