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

时间:2010-07-16 14:57:22

标签: linux elf

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

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

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

.markerA 
    int markerA;
.targetSection
    ... Lots of variables ...
.markerB
    int markerB;

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

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

4 个答案:

答案 0 :(得分:4)

您可以通过分析ELF文件格式获取已加载部分的地址。可以找到细节,例如在

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

有一个简短的印象,哪些信息值得一看readelf

readelf -S <filename> 

返回包含的所有部分的列表。

  1. 映射到内存的部分是键入的PROGBITS。
  2. 您要查找的地址显示在地址栏中。
  3. 要获取内存位置,您必须添加您的加载地址 可执行/共享对象
  4. 有几种方法可以确定可执行文件/共享对象的加载地址:

    1. 你可以解析/ proc / [pid] / maps(第一列包含加载地址)。 [pid]是流程ID
    2. 如果您知道文件中包含的一个函数,则可以应用dlsym来接收指向该函数的指针。该指针是dladdr返回包含请求的加载地址的Dl_info结构的输入参数
    3. 获取一些ELF信息库

      • libelf函数

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

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

答案 1 :(得分:1)

您可以考虑使用GCC的初始值设定项来引用变量,否则这些变量将进入单独的部分,并将所有指针保存在数组中。我建议使用初始值设定项,因为它可以独立于文件。

答案 2 :(得分:0)

您可以查看ELFIO library。它包含WriteObj和Writer示例。通过使用该库,您将能够以编程方式创建/修改ELF二进制文件。

答案 3 :(得分:0)

我担心覆盖默认链接脚本是一个简单的解决方案。

由于您担心它可能不灵活(即使我认为链接脚本经常会改变),您可以编写一个脚本来生成基于主机系统的默认ld脚本(“ld --verbose”)的链接脚本并将特殊部分插入其中。