ELF .data 部分中的符号表

ELF .data 部分中的符号表

我试图了解符号表如何与 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表明.symtabELF 中有一个专用部分保存该符号。

.data部分是否需要实际的符号表。第一个示例表明该data部分中有一个,但它不应该只能执行二进制值吗?

通过检查,hexdump我只能检测到一个条目,所以要么我的概念错误,要么其中一些概念在撒谎。 :)

答案1

.data部分包含数据本身,IE保存值 5 的四个字节int。该.symtab部分包含符号,IE二进制文件各部分的名称;符号var_global_init名称指向该.data节中存储的四个字节。

这就是为什么您只看到一项:符号表中只有一个符号。但是,如果您想从名称转换为值,则确实需要这两个部分:符号表告诉您在哪里可以找到与符号对应的值var_global_init,而数据部分包含该值的存储空间。

相关内容