我想在可执行elf文件的bss部分添加一个4KB空间。如何做到这一点?
如果不是bss部分,我可以增加数据部分的大小或定义一个新的数据部分吗并初始化该区域?
如果可能的话,这可以用elf以外的二进制文件格式完成吗?
PS:我需要这个来添加一些额外的指令,用于仪器仪表和将数据保存在专用位置,这些位置稍后必须打印。
我想在可执行elf文件的bss部分添加一个4KB空间。如何做到这一点?
假设您想对已经链接的ELF
可执行文件执行此操作,请注意,链接完成后,部分根本不会被任何东西使用(可能不是调试工具(;您想要修改相应的段。
通常情况下,您所要求的内容是不可能的,但对于您的特定可执行文件来说可能是。特别地,如果LOAD
段";覆盖";则.bss
区段是最后一个区段或者如果该区段与下一个LOAD
区段之间存在存储器内间隙。
如果(内存中(有空间扩展有问题的LOAD
段,那么您所要做的就是修补其程序头的.p_memsz
并将其递增4096。
您需要详细了解readelf -Wl a.out
的输出。
更新:
假设bss出现在最后,是否有工具可以更改一两行中最后一段的.pmemsz?
我不知道有什么工具可以做到这一点,但这很简单:程序头是固定大小的表,从文件偏移ehdr->e_phoff
开始。该表包含ehdr->e_phnum
记录。您读取每条记录,直到找到最后一个PT_LOAD
段,更新.p_memsz
成员,查找并在现有记录的基础上写入更新的记录。
libelf
或elfio
库可以(也可以不(使编写此工具变得更容易。
我想为了使elf一致,我们还需要相应地更改bss的节大小?
不,你不会:
- 不要求
.bss
和负载段的大小匹配 - 实际上根本不要求存在任何部分
- 就像我说的,没有东西关心二进制链接后的任何部分