2014-02-15 24 views
0

我試圖用自定義鏈接腳本來編譯這個簡單程序中的AMD-64的Linux機器上使用簡單的鏈接腳本提供了「搬遷截斷以適應:R_X86_64_32S」

// 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

您正在嘗試連接main處的0x100000000,這是4GB以上的邊界,但GCC(和您的libc)未設置爲-mcmodel=large

默認值爲-mcmodel=medium,這意味着程序鏈接到較低的2GB地址空間。

您將需要以你的可執行文件在0x100000000鏈接建立既main.ccrt1.o-mcmodel=large

或者只是使用-fPIE-pie,並且您的可執行文件將在任意地址(但通常遠高於4GB邊界)加載地址。

+0

如果我使用-fPIE -pie,我確定它會在4GB邊界之後加載嗎? – anotherCode245