2013-05-22 39 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(.) ;