如何在 linux 中查看动态链接的 ELF 二进制文件中的外部函数调用?

逆向工程 数据库 静态分析 动态分析 动态链接 转储
2021-07-04 07:58:53

file在 Linux 中使用该命令来获取有关二进制文件的信息。我也在寻找这些调用所在的地址。我想我可以从 GDB 获取这些信息,或者objdump我还不太擅长 Linux 命令和程序,因此非常感谢任何帮助。file 命令的输出如下:

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x6d232dd468b2344847a4b9c81eb064ffe257d5d0, stripped

然后使用strings命令我得到了这个输出(我看到了几个 C 函数调用,但哪些是外部的?):

/lib/ld-linux.so.2
-#mH4
__gmon_start__
libc.so.6
_IO_stdin_used
exit
strncmp
strncpy
puts
printf
malloc
atoi
__libc_start_main
GLIBC_2.0
PTRh
QVh>
UWVS
[^_]
testing
strncmp: %s;
atoi
Complete
;*2$"
2个回答

使用 nm 而不是字符串。未定义的符号(由 a 表示U)将在外部解析(通过libc或 其他),并且T(或t) 符号是本地定义的。小写表示局部符号,大写表示全局符号。

当然,这假设存在符号表。在您的示例中,它已被剥离。

在这种情况下,您可以执行objdump -Tfile 来列出外部引用。

你的问题的答案很简单。您可以将nm命令与-D开关(或--dynamic)一起使用,也可以objdump-T开关一起使用这两个命令都将输出动态符号表条目和它们源自的库。