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

10-11 23:07
查看更多