我正在尝试使用amd-64 linux机器上的自定义链接描述文件编译此简单程序
// main.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("Hello World!\n");
int* x = malloc(sizeof(int));
while(1) {}
return 0;
}
和
// script.ld
SECTIONS
{
. = 0x100000000;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
}
但是如果我
gcc -T script.ld main.c -o main
,我得到很多错误,例如
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x12): relocation truncated to fit: R_X86_64_32S against symbol `__libc_csu_fini' defined in .text section in /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
最佳答案
您正在尝试在4 GB边界以上的main
处链接0x100000000
,但是未为libc
设置GCC(和您的-mcmodel=large
)。
默认值为-mcmodel=medium
,这表示该程序已链接到地址空间的较低2GB。
您需要使用main.c
构建crt1.o
和-mcmodel=large
以便在0x100000000
链接可执行文件。
或仅使用-fPIE
和-pie
,您的可执行文件将在任意(但通常远高于4GB的边界)地址处加载。
关于c - 使用简单的链接描述文件将“重新定位到适合的位置:R_X86_64_32S”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21796637/