0 参考资料
GNU-LD-v2.30-中文手册.pdf
GNU linker.pdf
1 前言
一个完整的编译工具链应该包含以下4个部分:
(1)编译器
(2)汇编器
(3)链接器
(4)lib库
在GNU工具链中,对应的是:
(1)编译器:GCC(GNU Compiler Collection,GNU编译器套件)
(2)汇编器:GAS(GNU Assembler,GNU汇编器)
(3)链接器:LD(GNU Linker,GNU链接器)
(4)lib库:glibc(GNU C Library,GNU C 库)
本文介绍GNU链接器脚本中符号的赋值及实例解析。
2 GNU链接器(LD):符号的赋值及实例解析
2.1 符号的赋值
我们可以使用任何C语言的赋值运算符为符号赋值,如下:
symbol = expression;
symbol += expression;
symbol -= expression;
symbol *= expression;
symbol /= expression;
symbol <<= expression;
symbol >>= expression;
symbol &= expression;
symbol |= expression;
说明:
(1)symbol = expression可以为symbol赋值symbol,而其它操作必须在symbol已经定义的情况下进行
(2)expression后面必须添加分号;
(3)句点(.)这个符号指示当前位置计数器
2.2 实例解析
下面这个例子展示了在链接脚本三个不同位置赋值操作的区别:
_point = 0;
SECTIONS
{.text :{*(.text)_etext = .;}_bdata = (. + 3) & ~ 3;.data : { *(.data) }
}
说明:
(1)_point被定义为0
(2)_etext被定义为.text输入分区之后的首地址
(3)_bdata被定义为.text输出分区之后的首地址向上4字节对齐后的值