2016-04-25 231 views
3

我想將LD_PRELOAD設置爲指向共享庫,我可以運行64位或32位應用程序。很明顯,共享庫和可執行文件必須在比特級上匹配。在Linux中使用LD_PRELOAD混合64位/ 32位環境

$ LD_PRELOAD=/lib64/lib_init.so ./hello32 
ERROR: ld.so: object '/lib64/lib_init.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS64): ignored 

其中hello32是一個32位應用程序。有一些網頁出來在說,我應該能夠做到世界:

$ LD_PRELOAD='/$LIB/lib_init.so' ./hello32 
ERROR: ld.so: object '/$LIB/lib_init.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored 

其中$ LIB將自動lib和lib64的根據應用是32位還是64位之間進行切換。但顯然這是行不通的。

是否有一些技巧可以使這項工作? LD_PRELOAD_32,LD_PRELOAD_64? 謝謝!

+0

我會用一個包裝腳本,檢查應用程序的位數和相應 – user3159253

+1

設置庫儘量不要指定完整路徑設置$ LIB時,只是不要忘了單引號。動態鏈接器將選擇正確的一個,例如LD_PRELOAD = lib_init.so – kofemann

+0

@kofemann這正是我正在尋找的。你能否給我一個答案,以便我可以批准它。 –

回答

5

通過指定庫的完整路徑,您不會讓動態鏈接器根據二進制體系結構調整其搜索路徑。只定義庫名稱並讓鏈接器爲您選擇正確的庫。例如:

$ LD_PRELOAD=lib_init.so ./hello32 

將搜索/ lib目錄lib_init.so,而

$ LD_PRELOAD=lib_init.so ./hello64 

將在搜索/ lib64的

2

事實證明,你可以設置LD_PRELOAD設置時使用$ LIB(或者設置文件/etc/ld.so.preload)。麻煩的是$ LIB設置的值取決於你的linux發行版。啊!

在我有限的測試中,我發現基於Redhat的系統將$ LIB擴展爲64位應用程序的「lib64」和32位應用程序的「lib」。但是,在基於debian的發行版中,我發現$ LIB針對64位應用程序擴展爲「lib/x86_64-linux-gnu」,針對32位應用程序擴展爲「lib/i386-linux-gnu」。我一直沒有找到任何文件,但我已經測試過這個。

這意味着,如果我有:

$ LD_PRELOAD='/$LIB/lib_init.so' ./hello64 

和像Ubuntu基於Debian的系統上,我有:

/lib/x86_64-linux-gnu/lib_init.so (for 64bit apps) 

/lib/i386-linux-gnu/lib_init.so (for 32bit apps) 

這將正常工作(上一個基於Ubuntu的Linux電腦)

否則您需要基於redhat的發行版

/lib64/lib_init.so and /lib/lib_init.so 

適用於64位和32位應用程序。

使用LD_PRELOAD ='/ $ LIB/lib_init.so'的優點是不依賴於$ LD_LIBRARY_PATH的值。

在LD_PRELOAD

相關問題