[英]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.