2016-09-21 49 views
1

我試圖凍結和分發我的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 

所以可能我只需要添加一些額外的標誌來編譯過程。我會通過互聯網尋找他們,但如果有人知道缺少什麼,那將是非常值得歡迎的。

+0

'ldd'不帶選項不會告訴你有沒有圖書館的問題。它只是告訴你所有需要的庫都可以找到 - 並不是所有使用的符號都可以找到,或者你完全錯過了一個庫。嘗試'ldd -r ...'來強制執行所有需要的重定位。請參閱https://docs.oracle.com/cd/E23823_01/html/816-5165/ldd-1。html看起來你錯過了對'libsocket.so'的依賴。 –

+0

你說得對。我昨天也試過,但顯然編譯器和目標機器上的'libsocket.so'都很好。我編輯了帖子以顯示'ldd -r'輸出。 –

+0

運行'。/ testfer.r004'時仍然會得到'symbol __xnet_sendmsg:引用的符號未找到',那麼呢? –

回答

0

原來,這不是一個海灣合作委員會的錯誤。在深入分析這兩種環境之後,我意識到/lib/libsoftcrypto.so.1庫的差異很大。作爲事實上,在編譯機庫包含get_fips_mode符號...

[[email protected] pyinstaller]# nm /lib/libsoftcrypto.so.1 | grep -i get_fips_mode 
[3438] | 623016|  212|FUNC |GLOB |0 |18  |get_fips_mode 

...而目標計算機不:

[email protected] # nm /lib/libsoftcrypto.so.1 | grep -i get_fips_mode 
[3755] |   0|   0|FUNC |GLOB |0 |UNDEF |get_fips_mode 

試圖用類似的庫另一個編譯器機後版本,編譯與-lsocket ldflag的pyinstaller引導程序是不夠的:

[email protected] # ./testferv3 
hello fer 
[email protected] # echo $? 
0