【发布时间】:2015-12-21 08:19:41
【问题描述】:
有什么方法可以说明从 ARM elf 二进制文件中调用了哪个 glibc 函数?例如,考虑以下反汇编:
8300 <printf@plt-0x40>:
....
8320: e28fc600 add ip, pc, #0, 12
8324: e28cca08 add ip, ip, #8, 20 ; 0x8000
8328: e5bcf344 ldr pc, [ip, #836]! ; 0x344
....
83fc <main>:
...
8424:ebffffbd bl 8320 <_init+0x2c>
在这里,我们怎么能说 bl 8320 是对 printf 的调用呢?这些信息是否存储在 ELF 二进制文件中?
【问题讨论】:
-
该二进制文件是否还有符号表或已被剥离(链接时
-s)?nm a.out报告什么? -
符号表和动态符号都存在。 nm 报告二进制文件中的所有符号。有办法吗?
-
如果真的 所有 符号,甚至 printf,都在 a.out 中,那么你有一个静态链接的二进制文件,可能无法确定哪个符号来自特定库,而不是为每个库制作符号列表并将列表与 a.out 中的符号进行比较。
-
我的意思是,printf 在动态符号表中。二进制是动态链接的。我只想知道哪个库例程“bl 8310”实际上是通过 plt 调用的?.. 二进制文件中应该有一些关于此的信息,否则动态链接器将如何知道在运行时调用哪个例程?
标签: binaryfiles elf