Linux 链接时如何指定节的基址,或者链接后如何重新设置节的基址?
如图所示,符号可以通过Linux 链接时如何指定节的基址,或者链接后如何重新设置节的基址?,linux,linker,Linux,Linker,如图所示,符号可以通过defsym链接到特定地址。我的问题是,是否可以对节进行同样的操作?也就是说,给定一些.o对象文件,是否可以指定节将重新定位到的基址 或者,是否可以在最终链接后重新设置节的基础?也就是说,在二进制文件中更改节的地址,并使受重新定位影响的所有信息(如节外的相对分支等)正确重新定位 如果我的问题不清楚,我可以编辑它并添加一个图像来更好地解释。根据您提到的问题和Linux的标签判断,我将假设您使用的是GNUld GNUld的简短回答是肯定的,可以将节放置在特定的地址 较长的答案是
defsym
链接到特定地址。我的问题是,是否可以对节进行同样的操作?也就是说,给定一些.o
对象文件,是否可以指定节将重新定位到的基址
或者,是否可以在最终链接后重新设置节的基础?也就是说,在二进制文件中更改节的地址,并使受重新定位影响的所有信息(如节外的相对分支等)正确重新定位
如果我的问题不清楚,我可以编辑它并添加一个图像来更好地解释。根据您提到的问题和Linux的标签判断,我将假设您使用的是GNU
ld
GNUld
的简短回答是肯定的,可以将节放置在特定的地址
较长的答案是,您需要创建一个自定义链接器脚本来实现这一点,可以为ld
指定-T。如果使用gcc
作为ld
的包装器,则需要通过gcc
-Wl,
选项将其传递给链接器
链接器脚本必须包括以下内容:
SECTIONS {
.text 0x08049000 :
{
foo.o (.text)
bar.o (.text)
}
}
但需要注意的是-T选项将替换ld使用的默认链接器脚本。您可能需要修改默认链接器脚本以执行所需操作。可以通过将--verbose
选项传递到ld
来转储默认链接器脚本,而无需任何其他选项
有关链接器脚本的更多信息,请访问。谢谢您的回答。我现在这样做:
gcc-std=gnu99-Wall-Wl,--section start=.secname=0xABCDEF Lala.c-o Lala