在我们通过GCC链接器生成的ELF文件中,ELF文件的顶部始终是可执行代码的版本标识符。
这是通过创建version.c文件并使得结果对象文件成为link命令中的第一个可链接对象来实现的。
然而,对于一个可执行文件,它无法工作,我们可以找到的唯一区别是可执行文件包含C和C ++代码的混合,并且版本符号正在其他地方重新定位。
因此,有一种方法可以保证ELF文件中符号的绝对位置,使得符号始终通过链接器命令或代码属性指令位于文件的顶部?
答案 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];
};