部分和静态链接
传统的ELF文件,如ET_REL、ET_DYN和ET_EXEC,都包含节。对于ET_REL类型的ELF文件,节必须存在,而ET_DYN和ET_EXEC不能有节。但是由于Linux系统版本碎片严重,可执行文件也可能需要节,否则无法执行(比如Android更高版本的系统),这就要看系统动态链接了。
ET_REL类型的ELF包含一些符号定义和部分属性(可读、可写和可执行)。readelf工具可以轻松查看以下信息:
上述readelf输出一个。文件(REL类型),其中可执行代码存储在。文本部分、数据(如全局变量、静态变量等。),常量数据(如字符串等。)和未初始化或初始化为零的数据存储在。bss。本节将介绍这些细节。节表
节表是一个Section Header的数组,它的位置和个数由Elf_Ehdr的e_shoff和e_shnum指定。
节头包含节名、节属性、文件偏移量等内容,定义如下:
sh_name节名,是一个节字符串表的偏移量,节字符串的索引在Elf_Ehdr的e_shstrndx中指定。
sh_type截面类型,以下是ET_REL常用的截面类型定义:
sh标志(_ f)区段的标志位可以组合起来描述区段的属性,定义如下:
sh_addr对于ET_REL,该部分的虚拟地址通常为0。
sh_offset
该节的文件偏移量。
sh_size
部分的大小。
sh链接(_ l)
与其他章节相关(不同的章节代表不同的含义,后面会介绍)。
sh_info
附加章节信息(不同的章节代表不同的含义,这将在后面介绍)。
sh_addralign
地址对齐。
sh_entsize
如果节内容是特定元素的数组,则该值代表元素大小,例如,对于SHT _ SYMTAB,地址是sizeof(Elf_Sym)。
每种截面类型的sh_info和sh_link的含义如下:
符号部分和字符串部分符号段分为静态符号段(ST_SYMTAB)和动态符号段(SHT_DYNSYM),可以通过枚举段表得到。一个ELF文件中每种类型只有一个符号段,动态符号段只存在于ET_EXEC和ET_DYN类型的ELF中,不出现在ET_REL类型的ELF中。
符号部分包含Elf_Sym类型的符号表,Elf_Sym定义如下:
32位定义:
64位定义:
st_name符号名,它是与符号节关联的字符串节的字符串索引。
st_info符号信息,描述符号类型和符号绑定信息。
符号类型可以通过ELF_ST_TYPE(st_info)获得,定义如下:
符号绑定可以通过ELF_ST_BIND(st_info)获得,符号绑定的定义如下:st_other
符号的可见性描述和定义如下:
STV_INTERNAL和STV_PROTECTED很少见(至少我以前没见过)。对于SO库(ET_DYN),是否导出符号不是通过遍历符号表,而是通过查找哈希表,检查符号类型。后续章节将介绍哈希表。st_shndx
符号所在部分的部分索引有一些特殊定义:
st_value符号地址
st_size
符号大小
1.《elf ELF格式详解》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《elf ELF格式详解》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guoji/731737.html