如何在链接时为节指定基本地址,或者如何在链接后为节更改?

时间:2012-02-29 23:24:01

标签: linux linker

如图所示here,某些地址的符号可以与defsym相关联。我的问题是,部分是否可以这样做?也就是说,给定一些.o目标文件,是否可以指定将重新定位节的基址?

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

如果我的问题不明确,我可以编辑它并添加图片以便更好地解释。

1 个答案:

答案 0 :(得分:4)

根据您引用的问题和Linux的标记来判断,我将假设您使用的是GNU ld

GNU ld的简短答案是肯定的,部分可以放在特定地址。

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

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

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

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

有关链接描述文件的更多信息,请参见LD Manual