Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 链接时如何指定节的基址,或者链接后如何重新设置节的基址?_Linux_Linker - Fatal编程技术网

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

Linux 链接时如何指定节的基址,或者链接后如何重新设置节的基址?,linux,linker,Linux,Linker,如图所示,符号可以通过defsym链接到特定地址。我的问题是,是否可以对节进行同样的操作?也就是说,给定一些.o对象文件,是否可以指定节将重新定位到的基址 或者,是否可以在最终链接后重新设置节的基础?也就是说,在二进制文件中更改节的地址,并使受重新定位影响的所有信息(如节外的相对分支等)正确重新定位 如果我的问题不清楚,我可以编辑它并添加一个图像来更好地解释。根据您提到的问题和Linux的标签判断,我将假设您使用的是GNUld GNUld的简短回答是肯定的,可以将节放置在特定的地址 较长的答案是

如图所示,符号可以通过
defsym
链接到特定地址。我的问题是,是否可以对节进行同样的操作?也就是说,给定一些
.o
对象文件,是否可以指定节将重新定位到的基址

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


如果我的问题不清楚,我可以编辑它并添加一个图像来更好地解释。

根据您提到的问题和Linux的标签判断,我将假设您使用的是GNU
ld

GNU
ld
的简短回答是肯定的,可以将节放置在特定的地址

较长的答案是,您需要创建一个自定义链接器脚本来实现这一点,可以为
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