2012-10-30 15 views
0
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 
OUTPUT_ARCH(arm) 
ENTRY(_ram_entry) 
SECTIONS 
{ 
    . = 0xA0008000; 

    . = ALIGN(4); 
    .text : { *(.text) } 

    . = ALIGN(4); 
    .rodata : { *(.rodata) } 

    . = ALIGN(4); 
    .data : { *(.data) } 

    . = ALIGN(4); 
    .got : { *(.got) } 

    . = ALIGN(4); 
    .bss : { *(.bss) } 
} 

我得到了output_format,output_arch,entry ...也許這意味着輸出將是elf32-littlearm等等。裝載器腳本的含義

但部分是我沒有得到。

這'。 ='是開始。

和'。 = ALIGN(4)」和的.text:{*(文字)} ....

任何人可以幫助我這個T_T

感謝您的閱讀上。

回答

1

實際上,這個鏈接器描述語言是在我檢查過的ld的文檔中定義的。它看起來並不像看起來那麼糟糕。基本上,'。'操作符引用「當前位置指針」。所以,行

. = 0xA0008000 

說移動位置指針到該值。下一個條目.text基本上說,將所有文本對象放置在最終的ELF文件的.text節中,從位置指針開始(它也被調整爲具有4字節(32位)對齊方式)。請注意,第一次使用ALIGN可能是多餘的,因爲0xA0008000已經是32位對齊了!

下一部分簡單地指示鏈接器將所有輸入對象中的所有.rodata,.data,.got和.bss節的集合按順序發送到ELF二進制文件的最終各個節中,從32位開始對齊的地址。

所以鏈接器產生的最終ELF二進制將分別依次具有那五個段。您可以使用readelf實用程序查看最終ELF二進制文件的結構。這非常有用,有助於理解所有這些東西。通常有一個readelf的交叉版本,比如arm-linux-gnueabi-readelf,或者是用來生成你正在使用的編譯器/鏈接器的任何前綴。從readelf -S開始獲取ELF文件包含的部分的摘要。然後你可以從那裏探索。快樂閱讀!

+0

感謝您的意見! –

1
. = 0xA0008000; 

我想,但我不是100%肯定,就是手臂將開始執行二進制

. = ALIGN(4); 

定義如何使下面的指令。

.text.data.rodata.got和。 bss是程序的各個部分。文本用於指令,數據和用於初始化數據段的數據段以及用於未初始化數據段的數據段。得到的是全球抵消表。

.text : { *(.text) } 

這份拷貝所有的指令,類似的命令是針對數據和全局偏移量表的。

+0

你是什麼意思關於'這份拷貝所有的指示'?它是這樣的,它將所有的數據(指令+數據)對齊? –

+0

我的意思是它把指令從一個4字節對齊的地址開始,它把所有的數據,等等...... –