【问题标题】:Forcing a symbol to the top of a ELF file将符号强制到 ELF 文件的顶部
【发布时间】: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排序方面是否有特殊要求

标签: c++ c linker elf symbols


【解决方案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 映像时肯定会影响它),您必须自己进行试验。

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 2016-03-21
      • 2010-11-08
      • 2014-07-11
      • 2013-09-18
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      相关资源
      最近更新 更多