强制符号到ELF文件的顶部

时间:2013-10-15 09:36:14

标签: c++ c linker elf symbols

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

这是通过创建version.c文件并使得结果对象文件成为link命令中的第一个可链接对象来实现的。

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

因此,有一种方法可以保证ELF文件中符号的绝对位置,使得符号始终通过链接器命令或代码属性指令位于文件的顶部?

2 个答案:

答案 0 :(得分:1)

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

例如:

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

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

答案 1 :(得分:0)

在ELF文件的顶部,它应该是魔术签名0x7f,' E',' L',' F'根据{{​​3}}。 相反,将您的代码版本放在可执行文件的顶部,我想您可以使用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];       
};