ELF .data 部分中的符号表

The*_*eer 5 linker elf binary

我试图了解符号表如何与 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我只能检测到一个条目,所以要么我弄错了概念,要么其中一些在撒谎。:)

Ste*_*itt 7

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

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