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

11

我的初步了解是:

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

总体而言,我对这些部分如何共同创建一个二进制文件有些困惑 - 特别是.dynsym.dynstr。因此,我的问题有两个方面。以上述语句是否正确?如果是,则这三个部分如何共同创建二进制文件?


.dynamic 包含一个标记指针数组,其中包含指向 .dynsim.dynstr 的指针。你的陈述是正确的,但不是很详细。然而,快速的谷歌搜索可以找到所有的细节。 - Margaret Bloom
1个回答

16
我的上述陈述正确吗?
“.dynsym”部分包含一组固定长度的记录,类型为“Elf32_Sym”或“Elf64_Sym”。
由于这些是固定长度记录,它们本身无法描述二进制文件导出或导入的任意长度符号(字符串)。
因此,这些条目不包含字符串。相反,它们包含一个指向“.dynstr”中偏移量的偏移量(在“st_name”字段中),并且在该偏移量处找到符号名称。
因此,它不是真的“ dynsym 包含 setsockopt@GLIBC_2.0”,也不是“ dynstr 包含函数要求的字符串”(无论最后一句话是什么意思)。
“ .dynsym ”包含描述导入符号“setsockopt”的“Elf32_Sym”或“Elf64_sym”,并引用“ .dynstr ”部分中“setsockopt”字符串的偏移量。
同样,“ dynamic 包含可执行文件需要加载的库”是错误的-该部分不包含任何库。

这个文件包含固定长度的Elf64_DynElf32_Dyn条目,其中一些条目(例如.d_tag == DT_NEEDEDDT_RPATH)可能会通过它们的偏移量引用来自.dynstr的字符串。动态加载器以特定方式解释这些条目-对于DT_NEEDED,表示“必须加载此其他库”,对于DT_RPATH,表示“必须在这些以冒号分隔的路径中搜索”,等等。


谢谢您的回答。非常清晰和详细。我非常感激! - peachykeen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接