我试图了解符号表与 ELF 中的 .data 部分有何关系。首先是一些我用来作为基础的假设。
符号是函数或变量的人类可读(或“写在源文件中”)表示,它映射到其实际二进制值(CPU 对其进行操作)。
这是一个例子
//simple.c
int var_global_init = 5;
int main(void)
{
return 0;
}
让我们构建它并检查二进制文件:
$ gcc simple.c -o simple
$ objdump -t simple | grep var_global_init
0000000000201010 g O .data 0000000000000004 var_global_init
它列出了.data
ELF 文件部分中的符号。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
readelf
表明.symtab
ELF 中有一个专门的部分用于保存该符号。
该.data
部分是否需要实际的符号表。第一个示例指出该data
部分中有一个,但它不应该只执行二进制值吗?
通过检查hexdump
,我只能检测到一个条目,所以要么我的概念错了,要么其中一些在撒谎。:)
该
.data
部分包含数据本身,即int
包含值 5的四个字节。该.symtab
部分包含符号,即赋予二进制文件各个部分的名称;var_global_init
符号名称指向该节中的四个存储字节.data
。这就是为什么您只能看到一个条目:符号表中只有一个符号。但是,如果您想从名称转到值,则确实需要这两个部分:符号表告诉您在哪里可以找到与
var_global_init
符号对应的值,而数据部分包含该值的存储。