我正在寻找一种简单的方法来重新排序ELF文件部分.我有一系列自定义部分,我希望所有部分按特定顺序对齐.@H_502_2@
我发现如何做到这一点的唯一方法是使用链接器脚本.但是,文档指出指定自定义链接描述文件会覆盖默认值.默认的链接描述文件中包含很多内容,我不想在自定义脚本中复制只是为了让三个部分按特定顺序排在一起.对链接器行为进行硬编码似乎不太灵活.@H_502_2@
我为什么要这样做?我有一段数据需要知道(开始和结束)的运行时内存位置.所以我创建了两个额外的部分并将sentinel变量放入其中.然后,我想使用这些变量的内存位置来了解内存中未知部分的范围.@H_502_2@
@H_502_2@
.markerA
int markerA;
.targetSection
... Lots of variables ...
.markerB
int markerB;
在上面的例子中,我知道.targetSection中的数据位于markerA和markerB的地址之间.@H_502_2@
>工具接口标准(TIS)
便携式格式规范,
版本1.2
(http://refspecs.freestandards.org/elf/elf.pdf)@H_502_2@
对于一个简短的印象,哪些信息是值得的,看看readelf@H_502_2@
@H_502_2@
readelf -S
返回包含的所有部分的列表.@H_502_2@
>映射到内存的部分是键入的PROGBITS.
>您要查找的地址显示在Addr列中.
>要获取内存位置,您必须添加您的加载地址
可执行/共享对象@H_502_2@
有几种方法可以确定可执行文件/共享对象的加载地址:@H_502_2@
>你可以解析/ proc / [pid] / maps(第一列包含加载地址). [pid]是进程ID
>如果您知道文件中包含的一个函数,则可以应用dlsym来接收指向该函数的指针.该指针是dladdr返回包含请求的加载地址的Dl_info结构的输入参数@H_502_2@
>自由@H_502_2@
可能是一个有用的公司(我在研究了上面提到的TIS后检测到它,所以我只是简单地看一下它,我不知道更深入的细节)@H_502_2@