linux – 重新排序ELF文件部分的简单方法

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

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

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

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

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

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

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

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

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

readelf -S 

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

>映射到内存的部分是键入的PROGBITS.
>您要查找的地址显示在Addr列中.
>要获取内存位置,您必须添加您的加载地址
可执行/共享对象

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

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

获取一些ELF信息库

>自由

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

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

相关文章

文章浏览阅读1.8k次,点赞63次,收藏54次。Linux下的目录权限...
文章浏览阅读1.6k次,点赞44次,收藏38次。关于Qt的安装、Wi...
本文介绍了使用shell脚本编写一个 Hello
文章浏览阅读1.5k次,点赞37次,收藏43次。【Linux】初识Lin...
文章浏览阅读3k次,点赞34次,收藏156次。Linux超详细笔记,...
文章浏览阅读6.8k次,点赞109次,收藏114次。【Linux】 Open...