簡體   English   中英

為LD_PRELOAD設置我的lib會使某些進程產生加載器錯誤

[英]Setting my lib for LD_PRELOAD makes some processes produce loader errors

當我嘗試運行腳本時,我收到以下錯誤:我只有執行權限:

uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym

這是在我將LD_PRELOAD環境變量設置為/home/dumindara/random/sotest/a.out

a.out有一個測試malloc函數,並在內部調用dlsym

運行ls時我沒有遇到這個問題。 大多數進程都會出現此錯誤。 為什么會發生這種情況,我該怎么做才能使它發揮作用?

我無法對接受的答案發表評論,但是值得一提的是,當在編譯命令前使用-ldl時,可能會遇到沒有正確鏈接libdl.so.2的問題(假設鏈接和編譯已執行)通過相同的命令;這是可能的,因為LD_PRELOAD庫通常基於一個源文件)。

所以最后用-ldl調用gcc:

gcc -shared -fPIC fakeuname.c -o libfakeuname.so -ldl

在我的情況下,在前面使用-ldl導致錯誤與問題相同:

uname: symbol lookup error: ./libfakehostname.so: undefined symbol: dlsym

我假設您的a.out文件是共享對象而不是可執行文件並繼續...

dlsym()是libdl庫中的一個函數,它通常駐留在現代Linux系統上的libdl.so.2共享對象中。

我猜你的a.out共享對象沒有鏈接到libdl。 這意味着當你加載一個簡單的二進制文件,比如uname,它不會引入很多其他庫時,libdl.so.2可能不會被拉入並且你得到一個未定義的符號錯誤。

另一方面,如果將它預加載到鏈接到的二進制文件並最終拉入libdl.so.2,則共享對象可以正常工作。

如果您自己的共享對象與libdl鏈接,我會檢查ldd ,以及在unamels運行時直接或間接引入的庫。

編輯:

我剛剛證實了這一點。 修復此錯誤的方法是將您的共享對象鏈接到libdl。 -ldl添加到其LDFLAGS應該可以解決問題。

暫無
暫無

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

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