原文:
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對應的函式值...