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

时间:2018-11-05 14:23:43

标签: linux x86 elf

我的初步知识是:

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

总体而言,对于这些部分如何协同工作以创建二进制文件-尤其是.dynsym.dynstr,我有些困惑。所以我的问题有两个方面。我上面的陈述正确吗?如果是这样,这三个部分如何协同工作以创建二进制文件?

1 个答案:

答案 0 :(得分:2)

  

我的上述说法正确吗?

.dynsym部分包含一组Elf32_SymElf64_Sym类型的定长记录。

由于这些都是固定的长度条目,因此它们本身无法描述二进制文件导出或导入的任意长度符号(字符串)。

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

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

.dynsym包含描述导入符号Elf32_Sym的{​​{1}}或Elf64_sym,并引用{{1}中字符串setsockopt的偏移量}部分。

同样,“ "setsockopt"包含可执行文件需要加载的库”为false –该节不包含任何库。

它包含.dynstr.dynamic的固定长度条目,其中某些条目(例如带有Elf64_DynElf32_Dyn的条目)可以引用来自.d_tag == DT_NEEDED的字符串通过它们的偏移量。动态加载程序以某种方式解释这些条目-对于DT_RPATH表示为“必须加载该另一个库”,对于.dynstr表示为“必须搜索这些冒号分隔的路径”,等等。