GNU鏈結指令碼 05 符號值分配

2021-10-18 22:58:33 字數 1615 閱讀 9817

原文:

1、簡單符號值

第一節已經對符號做了描述,並且提及鏈結指令碼也是符號的產生原因之一。符號支援如下運算。

symbol = expression ; symbol += expression ; symbol -= expression ; symbol *= expression ; symbol /= expression ; symbol <<= expression ; symbol >>= expression ; symbol &= expression ; symbol |= expression ;

第乙個用法定義符號,其它用法修改符號值。特殊符號.指示當前位置計數器。

本級目錄01指示了符號的用法。連線指令碼和符號表資訊如下。

entry(main)

input(tool.o tool_base.o)

sections

. = 0x8000000;

.data :

. = 0xc000000;

.bss :

_bss_end = (. + 0x20000 - 1) / 0x20000 * 0x20000;

}

該鏈結指令碼指定符號_bss_end指向bss節的尾部。並且設定0x20000位元組對齊。

使用readelf命令檢視該符號的記錄。可以看到符號的值,並且為全域性符號。

... 15: 000000000c020000 0 notype global default 4 _bss_end

...

2、區域性符號

程式為02資料夾。鏈結指令碼修改如下。

...

hidden(_bss_end = (. + 0x20000 - 1) / 0x20000 * 0x20000);

...

...

14: 000000000c020000 0 notype local default 4 _bss_end

...

3、provide符號

上述定義        的符號不能喝程式中已有的符號重名,如果發生了重名會報告multi definition錯誤。provide可以在程式未定義符號時生成這個符號,如果程式已經定義該符號,則鏈結指令碼不再生成該符號。

4、provide_hidden符號

等同於provide和hidden的共同屬性。

5、c程式訪問符號

c程式訪問鏈結指令碼定義的符號十分簡單。本例為03目錄。定義符號格式如下

hidden(_bss_end = (. + 0x20000 - 1) / 0x20000 * 0x20000);
訪問符號方式如下。

extern void *_bss_end;

rev = (typeof(rev))(unsigned long)&_bss_end;

GNU鏈結指令碼學習(1)

最簡單的鏈結指令碼只有乙個命令 sections 使用 sections 命令描述輸出檔案記憶體布局。sections 命令是非常強大的,在這我們將解釋它的簡單用法。現在假設你的程式只是由單一 段 初始化數段和未初始化資料段,分別對應 text data bss 的段名。再假設輸入檔案中也只出現這些...

GNU鏈結指令碼 11 構建可執行程式

原文 1 目標 2 系統庫依賴 我們先開啟標準c庫和部分必要的鏈結。預設gcc命令編譯產出可執行程式時,會預設指定一組二進位制檔案。使用gcc v命令可以看到完整的編譯指令。筆者的計算機上,該指令輸出如下。我們先對該命令中的二進位制檔案做個整理。gcc指定部分引數時,會遮蔽其中部分檔案。中的x標記表...

練習3 2 計算符號函式的值 10分

進博主技術群,與大佬交流,領取乾貨學習資料 快速找到所需題目 浙大版c語言程式設計第三版題目集一覽表 對於任一整數n,符號函式sign n 的定義如下 請編寫程式計算該函式對任一輸入整數的值。輸入格式 輸入在一行中給出整數n。輸出格式 在一行中按照格式 sign n 函式值 輸出該整數n對應的函式值...