增加 elf 和其他文件格式中 BSS 部分的大小

Increase size of the BSS section in the elf and other file formats

我想添加一个 4KB space 到可执行 elf 文件的 bss 部分。如何做到这一点?

如果不是bss段,我可以增加数据段的大小或者定义一个新的数据段吗 并初始化区域 ?

如果可能,是否可以使用 elf 以外的二进制文件格式来完成此操作?

PS:我需要它来添加一些额外的检测说明,并将数据保存在稍后必须打印的专用位置。

I want to add a 4KB space to the bss section of an executable elf file. How can this be done?

假设您想对 已经 linked ELF executable 执行此操作,请注意 部分在 link 完成后, 根本 不会被任何东西(可能调试工具除外)使用 ;你要修改对应​​的.

您所要求的通常是不可能的,但是对于您的特定执行者table,可能是可能的。特别是,如果“覆盖”.bss 部分的 LOAD 部分是最后一个部分,或者如果该部分与下一个 LOAD 部分之间存在内存间隙,则应该是可能的段。

如果有 space(在内存中)来扩展有问题的 LOAD 段,那么您所要做的就是修补其程序头的 .p_memsz 并将其递增 4096 .

您需要详细了解 readelf -Wl a.out 的输出。

更新:

assuming that bss occurs last, is there a tool to change .p_memsz of the last segment in a line or two ?

我不知道有什么工具可以做到这一点,但这很简单:程序头的大小固定 table,从文件偏移量 ehdr->e_phoff 开始。 table 包含 ehdr->e_phnum 条记录。您读取每条记录,直到找到最后一个 PT_LOAD 段,更新 .p_memsz 成员,向后查找并将更新的记录写在原来的记录之上。

libelfelfio 库可能(或可能不会)使编写此工具更容易。

I guess to make the elf conformant, we also need to change the section size of bss accordingly ?

不,你没有:

  • 不要求 .bss 的大小和负载段匹配
  • 事实上,根本没有任何部分存在的要求,
  • 就像我说的,没有关心二进制文件link编辑后的任何部分。