星期五, 12月 07, 2007

Linker Script概觀

為了幫助自己更了解linker script我作了一個自己看的懂的中文翻譯。
原文在此
==========================================================
Linker Script概觀
為了要介紹linker script語言,我們必需先定義一些基本觀念和我們所用到的字彙

Linker作的事情就是把許多輸入給linker的檔案結合成一個檔案後輸出。
這些輸入的檔案和輸出的檔案都具有特殊的資料格式,就是我們常聽到的目的檔格式(object file format)。具有這種格式的檔案我們稱之為目的檔(object file)。Linker輸出的檔案常被稱為執行檔(executable),但有時若我們有別的用途,我們也只稱它是目的檔。 目的檔中含有一連串的區塊(section)(當然還有別的東西)。在我們提到一個在輸入檔案中的區塊時,可稱之為輸入區塊;反之,在輸出檔案中的區塊稱為輸出區塊。

每一個區塊在目的檔中,都有自己的名字跟大小。大多數的區塊都有一些相關的資料段,這些資料段也稱為區塊內容(section content)。若一個區塊被標記為"可載入的",那表示當輸出檔案為可執行的時候,區塊的內容可被載入到記憶體中。如果一個區塊是沒有區塊內容的話,那可能表示此區塊是"可配置的",這表示記憶體必需被留出一段空間給這區塊,但是可能沒有特定的東西需要載入到這裡。(有些情況下這裡的記憶體會全部被清為零)。而如果一個區塊既不是"可載入的"也不是"可配置的",那它可能含有某種的除錯訊息。

每一個"可載入的"輸出區塊或"可配置的"輸出區塊都有兩種位址。第一種是VMA,也就是虛擬位址(virtual memory address)。 若輸出檔案是可執行的,則區塊就具有此位址。第二種是LMA(Load Memory Address)。這表示該區塊會載入到的地址。在大多數的情況下,這兩個地址都常相同。 舉個例子來說,當區塊先被載去到ROM裡面,然後當程式開始執行時,此區塊會被複製到RAM裡面(此技巧常用在ROM-based的系統中),則在此例中,LMA和VMA就不相同了,ROM的位址是LMA,而RAM中的位址是VMA。

我們可以使用objdump -h來看一個目的檔中有多少區塊。

每一個目的檔中也都有一連串的"符號",就是我們常聽見的"符號表"。一個符號可以是已定義的,或是未定義的。每一個符號都有一個名字,而每一個已定義的符號除了名字之外還有位址和其他資訊。如果你把一個c或c++的檔案編譯成目的檔,你會發現每一個已定義的全域變數、靜態變數和函式都有一個已定義的符號。任何在輸入檔案中所參照(reference)的未定義全域變數跟函式即為未定義符號。

我們可以使用一個目的檔的工具nm或objdump -t來看目的檔中的符號。

沒有留言: