使用简单的链接描述文件会将“重定位截断为适合:R_X86_64_32S”

时间:2014-02-15 11:04:38

标签: c linker

我正在尝试使用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)

1 个答案:

答案 0 :(得分:1)

您正试图在main处链接0x100000000,其高于4GB边界,但GCC(以及您的libc)未设置为-mcmodel=large

默认值为-mcmodel=medium,这意味着程序链接到较低的2GB地址空间。

您需要使用main.c同时构建crt1.o -mcmodel=large,以便在0x100000000链接您的可执行文件。

或者只使用-fPIE-pie,您的可执行文件将以任意(但通常远高于4GB的边界)地址加载。