[英]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
,以及在uname
和ls
運行時直接或間接引入的庫。
編輯:
我剛剛證實了這一點。 修復此錯誤的方法是將您的共享對象鏈接到libdl。 將-ldl
添加到其LDFLAGS應該可以解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.