我的初步知识是:
.dynamic
包含可执行文件需要加载的库.dynsym
包含外部符号,例如setsockopt@GLIBC_2.0
.dynstr
包含功能要求的字符串总体而言,对于这些部分如何协同工作以创建二进制文件-尤其是.dynsym
和.dynstr
,我有些困惑。所以我的问题有两个方面。我上面的陈述正确吗?如果是这样,这三个部分如何协同工作以创建二进制文件?
答案 0 :(得分:2)
我的上述说法正确吗?
.dynsym
部分包含一组Elf32_Sym
或Elf64_Sym
类型的定长记录。
由于这些都是固定的长度条目,因此它们本身无法描述二进制文件导出或导入的任意长度符号(字符串)。
因此,这些条目不包含字符串。取而代之的是,它们在.dynstr
(在.st_name
字段中)中包含一个 offset ,并且在此偏移量处找到符号名称。
因此“ .dynsym
包含setsockopt@GLIBC_2.0”和“ .dynstr
包含函数要求的字符串”(无论最后一条语句的含义是什么)都是不正确的。
.dynsym
包含描述导入符号Elf32_Sym
的{{1}}或Elf64_sym
,并引用{{1}中字符串setsockopt
的偏移量}部分。
同样,“ "setsockopt"
包含可执行文件需要加载的库”为false –该节不包含任何库。
它包含.dynstr
或.dynamic
的固定长度条目,其中某些条目(例如带有Elf64_Dyn
或Elf32_Dyn
的条目)可以引用来自.d_tag == DT_NEEDED
的字符串通过它们的偏移量。动态加载程序以某种方式解释这些条目-对于DT_RPATH
表示为“必须加载该另一个库”,对于.dynstr
表示为“必须搜索这些冒号分隔的路径”,等等。