簡體   English   中英

在Mac OS X上使用靜態嵌入式Python進行動態符號查找失敗

[英]Dynamic symbol lookup fails with statically embedded Python on Mac OS X

我正在構建一個嵌入Python的Mac OS X應用程序。 我的應用程序在技術上是一個bundle(即它的主要可執行文件是MH_BUNDLE); 它是另一個應用程序的插件。 我希望它能靜態嵌入Python,但希望能夠動態加載擴展。

我做了以下內容:我包含了一個完整的庫( -force_load path/to/libpython2.7.a ),還-exported_symbol_list path/to/list所有Python符號( -exported_symbol_list path/to/list ),並添加了-u _PyMac_Error ,我使用了它這個鏈接建議 捆綁包本身加載正常,所有內部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)

我的問題看起來與類似,但反過來說:我是靜態鏈接Python,而另一張海報動態鏈接它(我們的平台也不同)。 對他來說靜態鏈接解決了這個問題。

為什么不找到符號?

更新。 我懷疑它發生是因為主應用程序使用RTLD_LOCAL加載其插件(以及我的包)。

我做的“更新”表明它是正確的:主插件包在本地加載( RTLD_LOCAL ),因此沒有人可以在那里看到任何符號,除非使用顯式dlopen后跟dlsym

如果是Linux的我可以促進捆到全局命名空間dlopen與荷蘭國際集團再次它RTLD_GLOBAL標志,但在Mac OS X這是行不通的。 但Mac OS X很好地將東西打包成捆綁包,所以我只創建了一個動態庫並將其放入插件包目錄中。 該庫自動加載為RTLD_GLOBAL並且所有Python符號都可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM