【问题标题】:Difference between .dynamic .dynsym and .dynstr in an ELF executableELF 可执行文件中 .dynamic .dynsym 和 .dynstr 之间的区别
【发布时间】:2019-04-08 22:10:10
【问题描述】:

我的初步了解是:

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

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

【问题讨论】:

  • .dynamic 包含一个标记指针数组,其中包含指向.dynsim.dynstr 的指针。你的陈述是正确的,虽然不是很详细。但是,快速的 Google 搜索会找到所有详细信息。

标签: linux x86 elf


【解决方案1】:

我上面的说法正确吗?

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的回答。那是非常清楚和彻底的。非常感谢!
猜你喜欢
  • 2019-04-12
  • 2013-05-16
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多