我的初步了解是:
-
.dynamic
包含可执行文件需要加载的库
-
.dynsym
包含外部符号,例如setsockopt@GLIBC_2.0
-
.dynstr
包含功能需求字符串
总的来说,我对这些部分如何一起创建二进制文件有点困惑 - 特别是.dynsym
and .dynstr
。所以我的问题有两个方面。我上面的说法正确吗?如果是这样,这三个部分如何协同工作来创建二进制文件?
我上面的说法正确吗?
The .dynsym
节包含一组固定长度的记录类型Elf32_Sym
or Elf64_Sym
.
由于这些是fixed长度条目,它们本身无法描述随意的二进制文件导出或导入的长度符号(字符串)。
因此这些条目不包含字符串。相反,它们包含一个offset into .dynstr
(在里面.st_name
字段),并且在此偏移量处找到符号名称。
所以这不是真的“.dynsym
包含setsockopt@GLIBC_2.0”并且“.dynstr
包含功能要求的字符串”(无论最后一条语句的含义是什么)。
The .dynsym
包含一个Elf32_Sym
or an Elf64_sym
描述导入的符号setsockopt
,并引用偏移量"setsockopt"
中的字符串.dynstr
部分。
同样地, ”.dynamic
包含可执行文件需要加载的库”为 false - 该部分不包含any图书馆。
它包含固定长度的条目Elf64_Dyn
or Elf32_Dyn
,其中一些(例如.d_tag == DT_NEEDED
or DT_RPATH
) 可以引用来自的字符串.dynstr
通过它们的偏移量。动态加载器以某种方式解释这些条目——例如DT_NEEDED
作为“必须加载另一个库”,对于DT_RPATH
如“必须搜索这些冒号分隔的路径”等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)