【问题标题】:Dynamic symbol lookup fails with statically embedded Python on Mac OS X在 Mac OS X 上使用静态嵌入的 Python 动态符号查找失败
【发布时间】:2011-05-10 18:17:37
【问题描述】:

我正在构建一个要嵌入 Python 的 Mac OS X 应用程序。我的应用程序在技术上是一个包(即它的主要可执行文件是 MH_BUNDLE);它是另一个应用程序的插件。我希望它静态嵌入 Python,但希望能够动态加载扩展。

我做了以下事情:我包含了整个库 (-force_load path/to/libpython2.7.a),还重新导出了所有 Python 符号 (-exported_symbol_list path/to/list),并添加了 -u _PyMac_Error,这是我使用 this linking advice 获得的。捆绑包本身加载正常,所有内部 Python 代码似乎都可以工作,但是当它尝试导入动态库 (time.so) 时失败,并显示以下消息:

Traceback (most recent call last):
  ...
ImportError: dlopen(/<stripped>/time.so, 2): Symbol not found: _PyExc_OverflowError
  Referenced from: /<stripped>/time.so
  Expected in: dynamic lookup

这个符号是 Python API 的一部分,它必须已经在我的包中。我可以检查一下:

nm -g Build/Debug/pyfm | grep _PyExc_OverflowError
00172884 D _PyExc_OverflowError
0019cde0 D _PyExc_OverflowError

(它列出了两次,因为我有两种架构,i386 和 ppc)。

time.so 没有引用任何内容,据我了解,这是设计使然:

otool -L "/<stripped>/time.so"
/<stripped>/time.so (architecture ppc):
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)
/<stripped>/time.so (architecture i386):
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)

我的问题似乎与this 相似,但反过来:我确实静态链接 Python,而另一张海报动态链接它(我们的平台也不同)。对他来说,静态链接解决了这个问题。

为什么找不到符号?

更新。我怀疑这是因为主应用程序使用RTLD_LOCAL 加载了它的插件(以及我的包)。

【问题讨论】:

    标签: python macos dynamic lookup


    【解决方案1】:

    我所做的“更新”表明它是正确的:主插件包是在本地加载的 (RTLD_LOCAL),所以没有人可以看到那里的任何符号,除非使用显式的 dlopen 后跟 dlsym

    如果是 Linux,我可以通过 dlopen 再次使用 RTLD_GLOBAL 标志将捆绑包提升到全局命名空间,但在 Mac OS X 下这不起作用。但是 Mac OS X 很好地将东西打包成包,所以我只是制作了一个动态库并将其放入插件包目录中。该库会自动加载为RTLD_GLOBAL,并且所有 Python 符号都可用。

    【讨论】:

      猜你喜欢
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多