一尘不染

链接时如何为节指定基地址,或者链接后如何为节重新设置基址?

linux

符号可以在一定的地址链接defsym如图所示这里。我的问题是,是否可以对部分进行相同的处理?也就是说,给定一些.o目标文件,是否可以指定节将被重定位到的基址?

或者,是否可以在最终链接之后重新设置部分的基础?也就是说,要更改二进制文件中某个节的地址,并使所有受重定位影响的信息(如该节中的相对分支等)都可以正确地重定位。

如果我的问题不清楚,我可以对其进行编辑并添加图像以更好地解释。


阅读 263

收藏
2020-06-03

共1个答案

一尘不染

从您参考的问题和Linux标签来看,我将假设您正在使用GNU ld

对于GNU的简短回答ld是,可以将部分放在特定的地址。

更长的答案是您需要创建一个自定义链接脚本来执行此操作,可以将其指定为-T ld。如果您要gcc用作的包装器ld,则需要通过gcc
-Wl,选项将链接器传递给它。

链接描述文件必须包含如下内容:

SECTIONS {
   .text 0x08049000 :
       {
       foo.o (.text)
       bar.o (.text)
       }
}

不过,需要注意的是-
T选项替代了ld使用的默认链接描述文件。您可能需要修改默认的链接描述文件以执行所需的操作。可以通过将--verbose选项传递给ld而不使用其他任何选项来转储默认的链接描述文件。

LD手册中提供了有关链接描述文件的更多信息。

2020-06-03