在我们通过 GCC 链接器生成的 ELF 文件中,ELF 文件的顶部始终是可执行代码的版本标识符。
这是通过创建 version.c 文件并使生成的对象文件成为链接命令中的第一个可链接对象来实现的。
然而,对于一个可执行文件,这无法正常工作,我们可以发现的唯一区别是可执行文件包含 C 和 C++ 代码的混合,并且版本符号正在重新定位到其他地方。
因此,问题是有没有办法通过链接器命令或代码属性指令来保证 ELF 文件中符号的绝对位置,从而使符号始终位于文件的顶部?
您可以通过脚本控制链接器的输出。在您的情况下,您可以检查:https ://sourceware.org/binutils/docs/ld/SECTIONS.html#SECTIONS以获得可能的解决方案。
例如:
SECTIONS {
.version 0x2020 : { version.o }
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) *(COMMON) }
}
这不能控制这些部分在链接的可执行文件中的确切位置,但它可能会影响它(在处理 ROM 映像时肯定会影响它),您必须自己进行试验。
根据ELF 规范,在 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];
};