2010-12-08 56 views
6

我收到以下錯誤,當我試圖運行一個腳本,我只有執行權限:這是後我已經設置LD_PRELOAD環境設置我的LD_PRELOAD LIB使得一些工藝生產裝載機錯誤

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

變量爲/home/dumindara/random/sotest/a.out

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

運行時我沒有遇到這個問題ls。大多數進程確實會出現此錯誤。爲什麼會發生這種情況,我能做些什麼才能使其發揮作用?

+0

這是一般的好只能爲a.out設置LD_PRELOAD,而不是修改shell環境。在大多數UNIX shell中,你可以輸入:`LD_PRELOAD = xyz。/ a.out`。否則,請嘗試`(LD_PRELOAD = xyz; ./a.out)`。 – 2010-12-08 08:08:59

+0

@Tony:我認爲a.out在這種情況下是一個共享對象,儘管它的名字很不恰當。 OP顯然試圖用自己的版本覆蓋`malloc()`,然後傳遞給真正的malloc。 – thkala 2010-12-08 08:25:13

+0

@tkhala:啊,很好的接受......會更像`LD_PRELOAD = \`pwd \`/a.out program_to_test`那麼...... – 2010-12-08 08:52:39

回答

13

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

dlsym()從libdl庫,它通常存在於共享libdl.so.2功能在現代Linux系統上的對象。

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

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

我會用ldd檢查自己的共享對象針對libdl鏈接,因爲它應該,也什麼庫都直接或間接地拉在當unamels運行。

編輯:

我剛剛證實了這一點。解決這個錯誤的方法是將你的共享對象與libdl鏈接起來。將-ldl添加到它的LDFLAGS應該有訣竅。

16

我無法對接受的答案發表評論,但是在這裏值得一提的是,在編譯命令前面使用-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