ELF文件中节组(section groups)相关介绍(readelf -g选项)

前言

由于项目需要实现ELF文件解析器,所以在研究readelf的-g选项时,遇到了概念问题,不清楚什么是section groups。在这里插入图片描述
在滕启明的《ELF文件格式分析》一文中,因为年代久远,section group可能是在之后更新的,所以未曾提到。我用中文在网上也搜索不到相关信息,最后是用英文在国外网站上搜索到的信息,所以用中文写这一篇博客分享一下。

本人是初次接触ELF格式,尚且只知九牛一毛,若有错误、不当之处,烦请各位大佬包容、指出。

Group Section介绍

它用于将部分分组在一起,告诉链接器如果它在组中包含一个部分,那么它也必须包括其他部分。组也可以携带 GRP_COMDAT 标志,它告诉链接器如果同一个组出现在两个 .o 文件中,那么它只需要包含其中一个。可能用于消除重复的 C++ 模板实例。

某些部分出现在相互关联的组中。例如,内联函数的外联定义可能需要除包含可执行指令的部分之外的其他信息。此附加信息可以是包含引用的文字的只读数据部分、一个或多个调试信息部分或其他信息部分。

组段之间可以有内部引用。但是,如果其中一个部分被删除,或者其中一个部分被另一个对象的副本替换,则这些引用没有任何意义。因此,这些组作为一个单元从链接对象中包含或省略。

SHT_GROUP类型的节定义了这样的节分组。包含对象的符号表之一中的符号名称为节组提供签名。SHT_GROUP节的节头指定标识符号元素。该sh_link成员包含包含条目的符号表节的节头索引。该sh_info成员包含标识元素的符号表索引。sh_flags节头的成员包含值零。sh_name未指定节 ( )的名称。

SHT_GROUP节的节数据是一个Elf32_Word数组。第一个元素是一个标志字。其余元素是节头索引序列。

在这里插入图片描述

GRP_COMDAT介绍

GRP_COMDAT是一个COMDAT组。该组可以复制另一个对象文件中的另一个COMDAT组,其中重复定义为具有相同的组签名。在这种情况下,链接编辑器仅保留一个重复组。其余组的成员被丢弃。

SHT_GROUP部分中的部分标题索引,标识组成该组的部分。这些部分必须在其部分标题成员中设置SHF_GROUP标志sh_flags。如果链接编辑器决定删除节组,链接编辑器将删除该组的所有成员。

为了便于删除组而不留下悬空引用,并且只需对符号表进行最少的处理,遵循以下规则:

  • 必须通过带有STB_GLOBAL或STB_WEAK绑定和节索引SHN_UNDEF 的符号表条目从组外的节中引用组成一个组的节。包含引用的对象中相同符号的定义必须具有与引用不同的符号表条目。组外的部分不能引用带有STB_LOCAL绑定的符号,用于包含在组部分中的地址,包括类型为STT_SECTION 的符号。
  • 不允许从组外对组成组的部分进行非符号引用。例如,您不能在sh_link或sh_info成员中使用组成员的节标题索引。
  • 如果丢弃组成员,则可以删除相对于组节之一定义的符号表条目。如果符号表条目包含在不属于该组的符号表部分中,则会发生这种删除。

ELF 节组语义确保组成员作为一个单元被保留或丢弃。当一个函数符号被丢弃时,这允许链接器也丢弃与该函数符号关联的计数器、数据和值。

请注意,在 ELF 中,noduplicates COMDAT 被降低到零标志节组。我们只为那些不在COMDAT 中的函数和那些没有 available_externally 链接的函数设置这个,因为我们已经
为这些函数使用了常规的 COMDAT 组。

参考内容:
Group Section
[InstrProfiling] Use ELF section groups for counters, data and values
What is the appointment of the “.group” sections of Elf-file?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值