GNU LD系列 3 3 簡單的鏈結指令碼例程

2021-08-14 09:20:58 字數 1127 閱讀 3201

許多鏈結指令碼是相當簡單的。

可能最簡單的鏈結指令碼只包含乙個命令:'sections'。我們使用'sections'命令來描述輸出檔案的記憶體布局。

'sections'命令是乙個很強大的命令。在這裡我們將描述乙個該命令的簡單應用。假設現在我們的程式裡僅僅由文字**、初始化資料、未初始化資料組成。它們會相應地存在於`.text`區、`.data`區、`.bss`區中。暫時假設在我們的輸入檔案裡只存在剛才說到的3個區。

在接下來的例子裡,讓我們假設文字**會載入在位址0x10000,資料會從位址0x8000000開始。下面的指令碼將會做這件事:

```linker script

sections

. = 0x8000000;

.data :

.bss :

}```

我們寫'sections'命令,是先寫關鍵字'sections',而後接著由花括號囊括的一系列符號(symbol)賦值、輸出區(output section)描述。

上面例子中,'sections'命令內部的第一行設定了特殊符號`.`,它是位置計數器(location counter)。如果我們不使用其他方式去指定輸出區的位址,那麼位址會被設定成位置計數器的當前值。之後位置計數器會增加,增加的量和輸出區的大小一樣大。在'sections'命令剛開始的時候,位置計數器的值為'0'。

第二行定義了乙個輸出區,`'.text`。我們暫時不去管冒號(`:`)語法是什麼意思。在輸出區名字後面的花括號內部,我們列出需要被放入輸出區的輸出區名字。星號`*`是乙個萬用字元,它匹配任意檔名。表示式`*(.text)`的指代所有輸入檔案的`.text`輸入區。

剩下的行定義了輸出檔案中的`.data`區和`.bss`區。鏈結器會把`.data`輸出區放置於位址`0x8000000`。在鏈結器放置完`.data`輸出區後,位置計數器的的值會變成`0x8000000`加上`.data`輸出區的大小。這個效果會使得鏈結器把`.bss`輸出區放置在記憶體中的`.data`輸出區的後面。

鏈結器會確保每個輸出區具備所需要的對齊要求,鏈結器會通過在必要的情況下增加位置計數器做到這一點。在上面的例子裡,`.text`區和`.data`區可能滿足了任意的對齊要求,不過鏈結器可能會在`.data`區和`.bss`區中建立乙個小的間隔。

就這些了。這就是乙個簡單而完整的鏈結指令碼。

cmake install製作簡單的安裝指令碼

當我們製作用於二次開發的sdk的時候,用cmake的install命令製作乙個安裝指令碼提供簡單的sdk安裝功能,在make結束後自動把檔案分類放在不同的目錄下,提供給使用者,比只是把.h,lib,dll檔案一股腦的複製給使用者,讓使用者自己去配置要好得多。下面的cmake指令碼片段,展示了用cma...

p33鏈結的棧和佇列

一 鏈棧的定義與運算 鏈棧 即鏈結堆疊 是棧的鏈結儲存表示,或者說它是只允許在表頭進行插入和刪除運算的單鏈表,此時單鏈表的表頭指標叫做棧頂指標。乙個鏈棧的示意圖如下圖所示,其中hs 表示棧頂指標。設 hs的型別為 linklist 指標型別 資料元素 x的型別為 elemtype,則在以hs 為棧頂...

python mysql 簡單的資料庫控制指令碼

前兩天想寫乙個檢視高考分數段及所對應的大學的 因為用的django框架寫的所以資料庫用的是django自帶的資料庫sqlite3,然而高考分數段以大學太多 高考過的同學可以理解,出成績後對著分數線填志願的苦惱 而sqlite3的批量處理又不知道該如何入手,所以就想到了用mysql,只要寫乙個pyth...