【问题标题】:Is it possible to change shared library references in a shared object file?是否可以更改共享对象文件中的共享库引用?
【发布时间】:2012-11-09 23:32:25
【问题描述】:

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

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

【问题讨论】:

  • 为了将来参考,而不是 strings-ing 文件,查找依赖项的最佳方法是 otool -L foo.so(和 man otoolotool -h 以查看它可以做的其他有用的东西给你)。
  • 出于好奇,为什么除了系统附带的版本之外,您还有(至少)两个 Python 2.7 版本?这几乎总是会带来麻烦,甚至在您尝试在它们之间共享模块使事情变得更复杂之前……

标签: python c macos shared-libraries cpython


【解决方案1】:

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

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

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

要让此工具在安装名称或 rpath 较大时工作 二进制文件应使用 ld(1) -headerpad_max_install_names 构建 选项。

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

【讨论】:

  • +1 表示最后一段。 MacPorts Python 可能与 Apple Python 兼容,除非你非常幸运。
  • 其余的 +0 只是因为我不能再 +1。我相信至少 Apple 和 python.org 的最新版本将有足够的填充,这将起作用(如“成功更改路径”,不一定“实际加载正确且不会崩溃”)。但是你当然应该检查失败。
  • 请注意,原始库路径不是指向 Apple 提供的 Python(即/System/Library/...),而是指向另一个用户安装的 Python,可能来自 python .org。在这种情况下,您需要知道它是哪个 python.org Python 2.7:一个是 32-bit-only 10.3+,另一个是 64-/32-bit 10.6+。
  • 我试图编写通用的 cmets(我在第二条评论中确实说过“Apple and python.org”),但你是对的,我搞砸了第一条评论;它应该说“Apple、python.org 等 Python”。在这种情况下,Python 可能是 python.org 或 Enthought,因为这些是最常见的方式,那些不知道自己在做什么的人最终会在 /Library 中使用 Python。
  • 这是一个很好的有用的解释。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 2010-09-21
  • 1970-01-01
  • 2013-11-27
  • 2018-05-30
  • 2011-08-27
相关资源
最近更新 更多