我試圖找到匯入外部符號的共享庫。目前我可以通過使用 nm 或許多替代方法(例如使用radare2)來獲取所有匯入的符號。我還可以使用 ldd 獲取二進制檔案所依賴的庫。但是,我在這一點上陷入了困境,因為我找不到一種有效的方法來獲取二進制檔案中的哪個外部符號取決于哪個共享庫。那么,例如,我怎樣才能找到以有效方式匯出名為 foo 或 printf 或任何東西的函式的共享庫?我提供一個例子:
Output of nm -D myfile
w __cxa_finalize
U foo
w __gmon_start__
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
U __libc_start_main
U printf
U puts
Output of ldd
linux-vdso.so.1 (0x00007ffd30904000)
libfoo.so => /home/user/Desktop/dynamic_link_example/libfoo.so (0x00007f1b08aaf000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1b088a1000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1b08abb000)
uj5u.com熱心網友回復:
那么,例如,我怎樣才能找到以有效方式匯出名為 foo 或 printf 或任何東西的函式的共享庫?
您可以使用env LD_DEBUG=bindings ./a.out. 這將產生大量輸出,您可以grep為foo和printf。
請注意,“我的二進制檔案中的哪個外部符號取決于哪個共享庫”的答案是“哪個庫首先定義了這個符號”。
因此,如果今天您的二進制檔案依賴于lifoo.soforfoo和 on libc.so.6for printf,那么沒有什么可以阻止您以不同的libfoo.so明天運行,并且不同版本的libfoo.so可能定義不同的符號。如果新版本的libfoo.so定義printf,這將導致回答你的符號問題printf,以改變從libc.so.6到libfoo.so。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/395577.html
下一篇:glibc函式在大檔案上失敗
