[英]How to find which shared library exported which imported symbol in my binary?
我正在嘗試查找導入外部符號的共享庫。 目前,我可以使用 nm 或許多替代方法(例如使用radare2)來獲取所有導入的符號。 我還可以通過使用 ldd 來獲取二進制文件所依賴的庫。 但是,我被困在這一點上,因為我找不到一種有效的方法來獲取二進制文件中的哪個外部符號取決於哪個共享庫。 那么,例如,我怎樣才能找到導出名為 foo 或 printf 的 function 或任何有效方式的共享庫? 我舉個例子:
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)
那么,例如,我怎樣才能找到導出名為 foo 或 printf 的 function 或任何有效方式的共享庫?
您可以使用env LD_DEBUG=bindings./a.out
運行您的程序。 這將產生很多 output,您可以為foo
和grep
和printf
。
請注意,“我的二進制文件中的哪個外部符號取決於哪個共享庫”的答案是“哪個庫首先定義了這個符號”。
因此,如果今天您的二進制文件依賴於lifoo.so
用於foo
並且依賴於libc.so.6
用於printf
,那么明天沒有什么能阻止您使用不同的libfoo.so
運行,並且不同版本的libfoo.so
可能會定義不同的符號。 如果新版本的libfoo.so
定義了printf
,這將導致您對符號printf
問題的答案從libc.so.6
更改為libfoo.so
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.