重新排序ELF文件节的简单方法

MrS*_*ers 6 linux elf

我正在寻找一种简单的方法来重新排序ELF文件部分.我有一系列自定义部分,我希望所有部分按特定顺序对齐.

我发现如何做到这一点的唯一方法是使用链接器脚本.但是,文档指出指定自定义链接描述文件会覆盖默认值.默认的链接描述文件中包含很多内容,我不想在自定义脚本中复制只是为了让三个部分按特定顺序排在一起.对链接器行为进行硬编码似乎不太灵活.

我为什么要这样做?我有一段数据需要知道(开始和结束)的运行时内存位置.所以我创建了两个额外的部分并将sentinel变量放入其中.然后,我想使用这些变量的内存位置来了解内存中未知部分的范围.

.markerA 
    int markerA;
.targetSection
    ... Lots of variables ...
.markerB
    int markerB;
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我知道.targetSection中的数据位于markerA和markerB的地址之间.

还有另一种方法来实现这一目标吗?是否有库可以让我读取当前正在执行的ELF图像并确定部分位置和大小?

Uhl*_*hli 4

您可以通过分析 ELF 文件格式来获取加载节的地址。详细信息可以在例如

  • 工具接口标准 (TIS) 可移植格式规范,版本 1.2 (http://refspecs.freestandards.org/elf/elf.pdf)

为了获得简短的印象,哪些信息是可用的,值得一看 readelf

readelf -S <filename> 
Run Code Online (Sandbox Code Playgroud)

返回 中包含的所有节的列表。

  1. 映射到内存的部分被键入 PROGBITS。
  2. 您要查找的地址显示在“地址”列中。
  3. 要获取内存位置,您必须添加可执行文件/共享对象的加载地址

有几种方法可以确定可执行文件/共享对象的加载地址:

  1. 您可以解析/proc/[pid]/maps(第一列包含加载地址)。[pid] 是进程 ID
  2. 如果您知道文件中包含的一个函数,您可以申请dlsym接收指向该函数的指针。dladdr该指针是用于返回Dl_info包含请求的加载地址的结构的输入参数

去图书馆获取一些ELF信息

  • 诽谤

可能是一个有用的同伴(我在研究了上面提到的TIS后发现了它,所以我只简单地看了一下它,我不知道更深入的细节)

我希望这个可能的解决方案的草图能够有所帮助。