2012-11-09 99 views
1

我有一个.so文件,其中包含对/Library/Frameworks/Python.framework/Versions/2.7/Python的引用(我可以看到这个路径在.so文件中以明文形式硬编码)。我无法访问构建.so文件的源代码。是否可以在共享对象文件中更改共享库引用?

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

+1

为了将来的参考,而不是'字符串'文件,找到依赖关系的最好方法是'otool -L foo.so'(和'man otool'或'otool -h'来查看其他有用的东西它可以为你做)。 – abarnert

+0

出于好奇,为什么除了系统附带的Python 2.7版本外,还有(至少)两个Python 2.7版本?这几乎总是一个麻烦的秘诀,即使在通过尝试在它们之间共享模块使事情变得更复杂之前... – abarnert

回答

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)这样做。该maninstall_name_tool注意事项:

对于这个工具,当安装名称或rpaths较大的 二进制文件应与LD建工作(1)-headerpad_max_install_names 选项。

此外,不能保证您希望使用的新Python是以与您想要修改的.so期望的旧共享库兼容的方式构建的。通用CPU体系结构,OS X部署目标和Python构建选项(例如,UCS-2与UCS-4)可能存在差异,这可能会妨碍成功。在尝试修改之前,您应该制作一份.so的副本。

+0

对于最后一段而言+1。 MacPorts Python可能不会与Apple Python兼容,除非你非常幸运。 – abarnert

+0

其余的只有+0,因为我不能再+1。我相信至少苹果和python.org最近的版本将有足够的填充,这将工作(如“成功改变路径”,不一定“实际加载正确,不会崩溃”)。但当然你应该检查失败。 – abarnert

+0

请注意,原始库的路径不是* Apple *提供的Python(也就是'/ System/Library/...'),而是另一个用户安装的Python,可能来自python.org。在这种情况下,您需要知道它是哪一个python.org Python 2.7:一个是32位只有10.3+,另一个是64位/ 32位10.6+。 –