【问题标题】:How to find which shared library exported which imported symbol in my binary?如何在我的二进制文件中找到哪个共享库导出了哪个导入的符号?
【发布时间】:2022-01-26 00:31:03
【问题描述】:

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

【问题讨论】:

    标签: linux binary reverse-engineering elf radare2


    【解决方案1】:

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

    您可以使用env LD_DEBUG=bindings ./a.out 运行您的程序。这将产生大量输出,您可以通过grepfooprintf 输出。

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

    所以如果今天你的二进制文件依赖于lifoo.so 对应foolibc.so.6 对应printf,没有什么能阻止你明天使用不同的libfoo.so 运行libfoo.so 的版本可能会定义不同的符号。如果libfoo.so 的新版本定义了printf,这将导致您对符号printf 的问题的答案更改libc.so.6libfoo.so

    【讨论】:

      猜你喜欢
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      相关资源
      最近更新 更多