ELF 可执行文件中 .dynamic .dynsym 和 .dynstr 之间的区别

pea*_*een 6 linux x86 elf

我的初步了解是:

  • .dynamic 包含可执行文件需要加载的库
  • .dynsym 包含外部符号,例如 setsockopt@GLIBC_2.0
  • .dynstr 包含功能要求字符串

总体而言,我有点困惑,这些部分是如何共同创造一个二进制-特别是.dynsym.dynstr。所以我的问题有两个方面。我上面的说法正确吗?如果是这样,这三个部分如何协同工作以创建二进制文件?

Emp*_*ian 9

我上面的说法正确吗?

.dynsym部分包含一组类型为Elf32_Sym或的固定长度记录Elf64_Sym

由于这些是固定长度的条目,它们本身不能描述二进制导出或导入的任意长度的符号(字符串)。

因此,这些条目不包含字符串。相反,它们包含一个到(在字段中)的偏移量,并且在这个偏移量处找到符号名称。.dynstr.st_name

因此,“.dynsym包含setsockopt@GLIBC_2.0”和“.dynstr包含函数要求的字符串”(无论最后一条语句的含义如何)都不是真的。

所述.dynsym包含一个Elf32_Sym或一个Elf64_sym描述一个导入的符号setsockopt,并引用的偏移量"setsockopt"中的字符串.dynstr部分。

同样,“.dynamic包含可执行文件需要加载的库”为假——该部分不包含任何库。

它包含Elf64_Dyn或 的固定长度条目Elf32_Dyn,其中一些(例如带有.d_tag == DT_NEEDED或 的条目DT_RPATH)可以.dynstr通过它们的偏移量引用字符串。动态加载器以某种方式解释这些条目——DT_NEEDED例如“必须加载这个其他库”、DT_RPATH“必须搜索这些以冒号分隔的路径”等。