0

我正在尝试查找导入外部符号的共享库。目前,我可以使用 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)
4

1 回答 1

1

那么,例如,我怎样才能找到以有效方式导出名为 foo 或 printf 的函数或任何东西的共享库?

您可以使用env LD_DEBUG=bindings ./a.out. 这将产生大量输出,您可以将其grep用于fooprintf

请注意,“我的二进制文件中的哪个外部符号取决于哪个共享库”的答案是“哪个库首先定义了这个符号”。

因此,如果今天您的二进制文件依赖于lifoo.soforfoo和 on libc.so.6printf那么没有什么能阻止您以不同的libfoo.so明天运行,并且不同版本的libfoo.so可能定义不同的符号。如果新版本的libfoo.so定义printf,那将导致您的符号问题的答案printf更改为。libc.so.6libfoo.so

于 2021-12-26T23:46:30.893 回答