我試圖凍結和分發我的Solaris11的機器中,下述的Python代碼,這使得使用多處理器模塊的多模塊:故障凍結(與PyInstaller)Python源,包括Solaris中
import multiprocessing
def f(name):
print 'hello', name
if __name__ == '__main__':
p = multiprocessing.Process(target=f, args=('fer',))
p.start()
p.join()
然而,即使可執行作品的編譯機(Solaris11)下細...
[[email protected] pyinstaller]# testfer/dist/testfer
hello fer
[[email protected] pyinstaller]# echo $?
0
...抱怨在任何其他機器(Solaris11)多進程庫:
[email protected] # ./testfer.r004
Traceback (most recent call last):
File "testfer.py", line 1, in <module>
File "/root/pyinstaller/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module
File "multiprocessing/__init__.py", line 84, in <module>
File "/root/pyinstaller/PyInstaller/loader/pyimod03_importers.py", line 546, in load_module
ImportError: ld.so.1: testfer.r004: fatal: relocation error: file /tmp/_MEIlBa4uh/_multiprocessing.so: symbol __xnet_sendmsg: referenced symbol not found
Failed to execute script testfer
[email protected] # echo $?
255
PyInstaller命令已啓用--onefile
標誌,因此每個需要的庫都應包含在最終的ELF文件中(多處理也包含在內)。但我也嘗試通過編輯.spec文件中的hidden-import
部分明確包含多處理庫。
我也嘗試在較舊的Solaris 10計算機中凍結源以確保向後兼容。編譯PyInstaller引導加載程序有和沒有特殊的LDFLAGS,如-lrt
。使用--debug
標誌。但到目前爲止,沒有任何工作,也沒有給我一個線索。
顯然二進制正確建爲正確的架構,也沒有圖書館的問題:
[email protected] # file testfer.r004
testfer.r004: ELF 32-bit MSB executable SPARC32PLUS Version 1, V8+ Required, UltraSPARC1 Extensions Required, dynamically linked, stripped
[email protected] # crle
Platform: 32-bit MSB SPARC
Default Library Path (ELF): /lib:/usr/lib (system default)
Trusted Directories (ELF): /lib/secure:/usr/lib/secure (system default)
[email protected] # ldd -r testfer.r004
libdl.so.1 => /lib/libdl.so.1
libm.so.2 => /lib/libm.so.2
libz.so.1 => /lib/libz.so.1
librt.so.1 => /lib/librt.so.1
libc.so.1 => /lib/libc.so.1
[email protected] # ldd -r /lib/libsocket.so.1
libnsl.so.1 => /lib/libnsl.so.1
libc.so.1 => /lib/libc.so.1
libmp.so.2 => /lib/libmp.so.2
libmd.so.1 => /lib/libmd.so.1
libsoftcrypto.so.1 => /lib/libsoftcrypto.so.1
libelf.so.1 => /lib/libelf.so.1
libcryptoutil.so.1 => /lib/libcryptoutil.so.1
libz.so.1 => /lib/libz.so.1
libm.so.2 => /lib/libm.so.2
所以我跑出的想法。 在此先感謝您的任何見解。
更新:感謝Andrew Henle評論我已經能夠取得一些進展。我已經重新編譯了PyInstaller引導加載程序,但是這次建立的LDFLAGS環境變量爲LDFLAGS="-lsocket -lrt"
。
現在它不是在抱怨__xnet
符號,而是symbol get_fips_mode
。你可以看到:
[email protected] # ./testfer.r004
ld.so.1: testfer.r004: fatal: relocation error: file /lib/libsoftcrypto.so.1: symbol get_fips_mode: referenced symbol not found
Killed
所以可能我只需要添加一些額外的標誌來編譯過程。我會通過互聯網尋找他們,但如果有人知道缺少什麼,那將是非常值得歡迎的。
'ldd'不帶選項不會告訴你有沒有圖書館的問題。它只是告訴你所有需要的庫都可以找到 - 並不是所有使用的符號都可以找到,或者你完全錯過了一個庫。嘗試'ldd -r ...'來強制執行所有需要的重定位。請參閱https://docs.oracle.com/cd/E23823_01/html/816-5165/ldd-1。html看起來你錯過了對'libsocket.so'的依賴。 –
你說得對。我昨天也試過,但顯然編譯器和目標機器上的'libsocket.so'都很好。我編輯了帖子以顯示'ldd -r'輸出。 –
運行'。/ testfer.r004'時仍然會得到'symbol __xnet_sendmsg:引用的符號未找到',那麼呢? –