我试图了解符号表如何与 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 文件部分中的符号。第 20 页ELF文档
将该部分定义.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
我只能检测到一个条目,所以要么我的概念错误,要么其中一些概念在撒谎。 :)
答案1
该.data
部分包含数据本身,IE保存值 5 的四个字节int
。该.symtab
部分包含符号,IE二进制文件各部分的名称;符号var_global_init
名称指向该.data
节中存储的四个字节。
这就是为什么您只看到一项:符号表中只有一个符号。但是,如果您想从名称转换为值,则确实需要这两个部分:符号表告诉您在哪里可以找到与符号对应的值var_global_init
,而数据部分包含该值的存储空间。