我正在寻找一种简单的方法来重新排序ELF文件部分。我有一系列自定义部分,我希望所有部分按特定顺序对齐。
我发现如何做的唯一方法是使用链接器脚本。但是,文档指出指定自定义链接描述文件会覆盖默认值。默认的链接描述文件中包含很多内容,我不想在自定义脚本中复制只是为了让三个部分按特定顺序排在一起。对链接器行为进行硬编码似乎不太灵活。
为什么我要这样做?我有一段数据需要知道(开始和结束)的运行时内存位置。所以我创建了两个额外的部分并将sentinel变量放入其中。然后,我想使用这些变量的内存位置来了解内存中未知部分的范围。
.markerA
int markerA;
.targetSection
... Lots of variables ...
.markerB
int markerB;
在上面的例子中,我知道.targetSection中的数据介于markerA和markerB的地址之间。
还有另一种方法可以实现这一目标吗?是否有库可以让我读取当前正在执行的ELF图像并确定部分位置和大小?
答案 0 :(得分:4)
您可以通过分析ELF文件格式获取已加载部分的地址。可以找到细节,例如在
有一个简短的印象,哪些信息值得一看readelf
readelf -S <filename>
返回包含的所有部分的列表。
有几种方法可以确定可执行文件/共享对象的加载地址:
dlsym
来接收指向该函数的指针。该指针是dladdr
返回包含请求的加载地址的Dl_info
结构的输入参数获取一些ELF信息库
可能是一个有用的公司(我在研究了上面提到的TIS后检测到它,所以我只是简单地看一下它,我不知道更深入的细节)
我希望这个可能解决方案的草图会有所帮助。
答案 1 :(得分:1)
您可以考虑使用GCC的初始值设定项来引用变量,否则这些变量将进入单独的部分,并将所有指针保存在数组中。我建议使用初始值设定项,因为它可以独立于文件。
答案 2 :(得分:0)
您可以查看ELFIO library。它包含WriteObj和Writer示例。通过使用该库,您将能够以编程方式创建/修改ELF二进制文件。
答案 3 :(得分:0)
我担心覆盖默认链接脚本是一个简单的解决方案。
由于您担心它可能不灵活(即使我认为链接脚本经常会改变),您可以编写一个脚本来生成基于主机系统的默认ld脚本(“ld --verbose”)的链接脚本并将特殊部分插入其中。