我正在尝试使用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)
答案 0 :(得分:1)
您正试图在main
处链接0x100000000
,其高于4GB边界,但GCC(以及您的libc
)未设置为-mcmodel=large
。
默认值为-mcmodel=medium
,这意味着程序链接到较低的2GB地址空间。
您需要使用main.c
同时构建crt1.o
和 -mcmodel=large
,以便在0x100000000
链接您的可执行文件。
或者只使用-fPIE
和-pie
,您的可执行文件将以任意(但通常远高于4GB的边界)地址加载。