繁体   English   中英

查找谁在ELF文件中使用符号

[英]Find who uses a symbol in an ELF file

我有一个包含符号的大二进制文件。 我可以在nmobjdump看到符号。
我知道使用了符号,因为否则链接器不会包含它(更准确地说,我知道在同一个源文件中使用了某些符号)。
我正试着找出它是如何使用的。

如果引用是通过函数(例如函数调用函数,函数使用全局变量),我可以使用objdump -rd来反汇编文件并找到引用。
但是如果引用是通过变量(例如,初始化为指向某个变量的全局指针),则反汇编不会显示它。
我没有找到任何方法。

这是一个演示它的例子。 在这个例子中,很明显谁使用x ,但我不知道如何检查生成的二进制文件并找到它。

// x.c
int x = 3;

// main.c
extern int x;
static int *y = &x;
int main() { 
    return *y;
}

// Build process
gcc -o x.o -c x.c
ar r libx.a x.o
gcc -o main.o -c main.c
gcc -o main main.o -L. -lx

我编译了相同的代码(和相同的命令)并运行了objdump -x main.o 有一节

RELOCATION RECORDS FOR [.data]:
OFFSET           TYPE              VALUE
0000000000000000 R_X86_64_64       x

这意味着它是64位重定位记录( R_X86_64_64 )。 它位于数据部分的偏移0处(这是数据部分中y的偏移量)。 并且要重定位的值是x (实际上是变量x的地址,因为它是标签)。

为了更好地理解这一点,我添加了另一个

extern int ** z = &y;

现在符号表看起来像 -

0000000000000000 l     O .data  0000000000000008 y
0000000000000008 l     O .data  0000000000000008 z

第一个显示数据部分中两个变量的偏移量,第二个数字是它们的大小。

重定位表现在看起来像 -

0000000000000000 R_X86_64_64       x
0000000000000008 R_X86_64_64       .data

您现在可以看到有两个条目。 一个用于x的地址存储在y (偏移0)中,另一个用于y的地址存储在z (偏移8)中。 取而代之的y你看.data ,因为数据部分的地址相同的地址y因为y在偏移0

因此,通过查看重定位表,您可以找到所有变量(或函数)的绝对引用。

这是我找到的方法。 它适用于这个简单的例子,但不幸的是不是我的真实情况。 我不确定有什么区别。

我正在寻找二元main符号x用户:

$ objdump -t main | grep -w x
0000000000000000 l    df *ABS*  0000000000000000              x.c
0000000000601040 g     O .data  0000000000000004              x

所以x在偏移00601040 我寻找这个地址,反过来(因为我觉得是字节顺序):

$ objdump -s main | egrep '^Contents of section|40106000'
... omitted irrelevant sections ...
Contents of section .data:
 601028 00000000 00000000 40106000 00000000  ........@.`.....

因此.data中偏移601030处的符号包含此地址。

$ objdump -t main | grep 601030
0000000000601030 g     O .data  0000000000000008              y

所以引用来自y

在我的实际情况中,地址在.dynsym部分中找到,而objdump -t在那里找不到任何符号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM