2013-05-22 57 views
2

它看起來像是一個軟件工程師「發現差異」的遊戲,起初, 但語法上的微小差異顯然會在鏈接行爲上產生巨大差異。GNU ld:這兩個鏈接器腳本有什麼區別?

ldscript1:

OUTPUT_FORMAT(elf64-x86-64) 
ENTRY(main) 
ABS_FIRST = 0x10000000; 
OFF_SECOND = 0x20000000; 
SECTIONS 
{ 
    . = ABS_FIRST; 
    .first : 
    { 
     *(.pre) 
    } 
    . += OFF_SECOND; 
    .text : 
    { 
     *(.text) 
     *(.rodata*) 
    } 
    .data : 
    { 
     *(.data) 
    } 
} 

ldscript2:

OUTPUT_FORMAT(elf64-x86-64) 
ENTRY(main) 
ABS_FIRST = 0x10000000; 
OFF_SECOND = 0x20000000; 
SECTIONS 
{ 
    . = ABS_FIRST; 
    .first : 
    { 
     *(.pre) 
    } 
    hack = .; 
    . = hack + OFF_SECOND; 
    .text : 
    { 
     *(.text) 
     *(.rodata*) 
    } 
    .data : 
    { 
     *(.data) 
    } 
} 

pre.s:

.section .pre 
.long 0x0 

main.c中:

int main() 
{ 
} 

編譯和鏈接:

gcc -c -xassembler-with-cpp -o pre.o pre.s 
gcc -c -o main.o main.c 
ld -T ldscriptX pre.o main.o -o example 

LD版本:

$ ld -v 
GNU ld (GNU Binutils for Ubuntu) 2.22 

隨着ldscript1:

$ objdump -h example | grep -E ".text|VMA" 
Idx Name   Size  VMA    LMA    File off Algn 
    2 .text   00000006 0000000020000000 0000000020000000 00200000 2**2 

隨着ldscript2:

$ objdump -h example | grep -E ".text|VMA" 
Idx Name   Size  VMA    LMA    File off Algn 
    2 .text   00000006 0000000030000004 0000000030000004 00200004 2**2 

注意,VMA是正確的ldscript2,但someho w「。」在ldscript1的「+ =」操作之前/之後被設置爲零。我已閱讀了GNU ld文檔,但找不到解釋。

回答

0

對我來說,它看起來像ldscript1行爲與預期...

這看起來像一個相對/絕對地址的問題。什麼是分配給黑客的價值?我懷疑它是0.

你可以試試hack = ABSOLUTE(.) ;