我试图了解符号表如何与 ELF 中的 .data 部分相关。首先是一些我作为基础的假设。
符号是映射到实际二进制值(CPU 对其进行操作)的函数或变量的人类可读(或“写在源文件中”)表示。
这是一个例子
//simple.c
int var_global_init = 5;
int main(void)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
让我们构建它并检查二进制文件:
$ gcc simple.c -o simple
$ objdump -t simple | grep var_global_init
0000000000201010 g O .data 0000000000000004 var_global_init
Run Code Online (Sandbox Code Playgroud)
它列出了.dataELF 文件部分中的符号。ELF 文档的第 20 页
将该.data部分定义为:
这些部分保存有助于程序内存映像的初始化数据。
好吧,这样的搭配。那么我问自己Does this mean that the symbol table is
embedded in the .data section?。但这似乎被下面的例子反驳了:
$ readelf -s simple
Symbol table '.symtab' contains 66 entries:
....
50: 0000000000201010 4 OBJECT GLOBAL DEFAULT 23 var_global_init
Run Code Online (Sandbox Code Playgroud)
readelf 显示有专门的 .symtabELF部分保存符号。
是否 .data部分需要实际的符号表。第一个示例指出该data部分中有一个的结论,但它不应该只执行二进制值吗?
通过检查,hexdump我只能检测到一个条目,所以要么我弄错了概念,要么其中一些在撒谎。:)
该.data部分包含数据本身,即包含int值 5的四个字节。该.symtab部分包含符号,即二进制文件各个部分的名称;这var_global_init符号名指向四个字节存储在的.data部分。
这就是为什么您只能看到一个条目:符号表中只有一个符号。但是如果你想从一个名字到一个值,你确实需要这两个部分:符号表告诉你在哪里可以找到与var_global_init符号对应的值,而数据部分包含值的存储。