将符号强制到 ELF 文件的顶部

Posted

技术标签:

【中文标题】将符号强制到 ELF 文件的顶部【英文标题】:Forcing a symbol to the top of a ELF file 【发布时间】:2013-10-23 01:22:21 【问题描述】:

在我们通过 GCC 链接器生成的 ELF 文件中,ELF 文件的顶部始终是可执行代码的版本标识符。

这是通过创建 version.c 文件并将生成的目标文件作为链接命令中的第一个可链接对象来实现的。

但是对于一个可执行文件,这无法正常工作,我们可以发现的唯一区别是可执行文件包含 C 和 C++ 代码的混合,并且版本符号正在重新定位到其他地方。

因此,问题是有没有办法通过链接器命令或代码属性指令来保证 ELF 文件中符号的绝对位置,从而使符号始终位于文件的顶部?

【问题讨论】:

e_ident[EI_ABIVERSION] and e_type 之间使用 7 个未使用的字节怎么样? :) 我想你正在使用 GNU 链接器?如果是这样,它带有可以根据您的口味进行调整的脚本。我不认为您可以更改脚本以在特定位置强制使用符号,但是,您可以创建一个特殊的 .appversion 部分并确保这个新部分首先出现。现在不要问我如何做到这一切......我只知道你能做到。 链接器脚本似乎是一种选择,尽管正如您所说,尚不清楚如何使用它们将符号放在 ELF 文件的顶部。谜团在于为什么会发生这种情况。以前链接顺序决定符号位置。包含 C++ 库似乎影响了这一点。不知道C++目标代码在ELF排序方面是否有特殊要求 【参考方案1】:

根据ELF specification,在 ELF 文件的顶部,它应该是魔术签名 0x7f、'E'、'L'、'F'。 我想您可以使用 Elf 标头中的一些无关紧要的字段,而不是将您的代码版本放在可执行文件的顶部,例如 ei_pad

struct E_Ident 
  unsigned long ei_magic;       
  unsigned char ei_class;        
  unsigned char ei_data;        
  unsigned char ei_version;      
  unsigned char ei_pad[9];       
;

【讨论】:

【参考方案2】:

您可以通过脚本控制链接器的输出。在您的情况下,您可以查看:https://sourceware.org/binutils/docs/ld/SECTIONS.html#SECTIONS 以获得可能的解决方案。

例如:

SECTIONS  
  .version 0x2020 :  version.o 
  .text :  *(.text) 
  .data :  *(.data)  
  .bss :   *(.bss)  *(COMMON)  
 

这不能控制这些部分在链接的可执行文件中的确切位置,但它可能会影响它(在处理 ROM 映像时肯定会影响它),您必须自己进行试验。

【讨论】:

以上是关于将符号强制到 ELF 文件的顶部的主要内容,如果未能解决你的问题,请参考以下文章

强制 UITextView 光标到视图顶部

将 Swiper 分页移动到 Swiper 容器的顶部

matplotlib colorbar:需要在bar顶部使用指数强制科学记数法

ggplot2:顶部图例键符号大小随图例键标签而变化

如何强制 div 位于视口的顶部/底部,同时不将其从文档流中取出?

如何强制 UIButton 始终位于顶部