用于附加字符串元数据的自定义ELF部分

时间:2016-06-02 18:48:15

标签: linux gcc elf

我希望能够将一些具有线索,易于提取的键值对与我的ELF可执行文件相关联。

我注意到gcc编译的ELF有一个.comment部分

$ readelf -p .comment a.out 

所以我试图复制它:

main.c中:

#include <stdio.h>
int main(){ puts("Hello world"); return 0; }
const char str[] __attribute__((section(".meta"))) = "hello meta world";

测试:

$ readelf -p .meta a.out 
String dump of section '.meta':
  [     0]  hello meta world

 $ readelf -p .meta a.out | sed -n 's/^[^]]*]  //p'
   hello meta world

这很有效。

是否有更好的方法将这些字符串键值对附加到ELF文件(不将其分解为多个文件)?用户部分是否有命名空间(例如.user.meta)会阻止我破坏某些内容?

2 个答案:

答案 0 :(得分:1)

根据spec,所有带点前缀的部分名称都是保留的,没有点前缀的用户部分可以安全使用:

  

带有点(。)前缀的节名称是为系统保留的,   虽然应用可能会使用这些部分,如果它们存在   意思是令人满意的。应用程序可能使用没有的名称   前缀以避免与系统部分冲突。目标文件格式   让我们定义一个不在上面列表中的部分。目标文件可以   有多个具有相同名称的部分。

答案 1 :(得分:0)

此外,Linux内核经常使用此技巧(通常通过内联汇编和.pushsection指令)来存储频繁访问或重要的数据结构(通常为结构数组)。它具有非标准的ELF部分,例如__ex_table和__fixup。