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

Difference between .dynamic .dynsym and .dynstr in an ELF executable

我的初步了解是:

总的来说,我对这些部分如何协同工作来创建二进制文件感到有点困惑——特别是 .dynsym.dynstr。所以我的问题有两个方面。我的上述陈述是否正确?如果是这样,这三个部分如何协同工作以创建二进制文件?

Are my statements above correct?

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

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

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

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

.dynsym 包含 Elf32_SymElf64_sym 描述导入符号 setsockopt,并引用 "setsockopt" 字符串在 .dynstr节。

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

它包含 Elf64_DynElf32_Dyn 的固定长度条目,其中一些(例如带有 .d_tag == DT_NEEDEDDT_RPATH 的条目)可能引用 [=13] 中的字符串=] 通过他们的偏移量。动态加载程序以某种方式解释这些条目——DT_NEEDED 为 "must load this other library",DT_RPATH 为 "must search these colon-separated paths",等等