2013-11-27 68 views
1

你好,我有一個「鏈接腳本」爲GNU鏈接ld和我有兩個與之相關的問題:鏈接器腳本混淆 - 爲什麼需要多個標籤?

OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") 
OUTPUT_ARCH(arm) 
ENTRY(__start) 

SECTIONS 
{ 
    . = 0x11029000; 

    .text : 
    { 
     __exidx_start = .; 
     PROVIDE (__gnu_textstart = .); 
     startup.o(.text .text.*) 
     *(.text .text.*) 
    } 

    .rodata : 
    { 
     *(.rodata .rodata.*); 
    } 

    __exidx_end = .; 
    PROVIDE (__gnu_textend = .); 

    .data : 
    { 
     PROVIDE (__gnu_datastart = .); 
     *(.data .data.*); 
     PROVIDE (__gnu_dataend = .); 
    } 

    .bss : 
    { 
     PROVIDE (__gnu_bssstart = .); 
     *(.bss .bss.*) *(COMMON); 
     PROVIDE (__gnu_bssend = .); 
    } 

    PROVIDE (end = .); 
    PROVIDE (__end = .); 
    __image_size = ((__gnu_bssstart - __gnu_textstart) + 511) & ~ 511; 
    __EH_FRAME_BEGIN__ = 0; 

} 

Q1:爲什麼我們定義多個標籤,像__exidx_start__gnu_textstart對於同一個地址?後者使用PROVIDE定義。

Q2:在結束鏈接腳本計算圖像尺寸是這樣的:

__image_size = ((__gnu_bssstart - __gnu_textstart) + 511) & ~ 511; 

我們會不會得到同樣的結果,如果我們計算出它是這樣的:

__image_size = ((__exdix_start - __exidx_end) + 511) & ~ 511; 
+0

我認爲兩者都是指定的,因爲您的程序開始地址和您的文本部分都需要定義。 –

回答

1

http://www.sourceware.org/binutils/docs-2.10/ld_3.html#SEC17它看起來像使用PROVIDE命令只是作爲一個聲明,如果沒有另一個聲明使用。好處是符號可以由用戶定義(如果他們只是不知道該符號)。從某種意義上說,如果PROVIDE中的定義從來沒有在其他地方定義過,但仍然被引用,那麼PROVIDE中的定義將作爲默認類型。

鑑於這種情況,我會假設,__gnu_textstart,就是要各種各樣的別名__exidx_start,因此,答案到Q2是肯定的,作爲符號引用相同的位置。