ZHCU947E June 2015 – January 2023
点运算符 (.) 用于在链接时用输出段中的特定地址定义符号。它的解释方式与 PC 类似。无论当前段中的当前偏移量是多少,都是与点关联的值。考虑在 SECTIONS 指令内使用输出段规范:
outsect:
{
s1.c.obj(.text)
end_of_s1 = .;
start_of_s2 = .;
s2.c.obj(.text)
end_of_s2 = .;
}
此语句创建了三个符号:
假设 s1.c.obj 和 s2.c.obj 之间由于对齐而产生了边界填充。那么 start_of_s2 并不是 .text 段真正的起始地址,但却是在 s2.c.obj 中对齐 .text 段所需的边界填充之前的地址。这是由于链接器将点运算符解释为当前 PC。这也是成立的,因为点运算符是独立于其周围的输入段进行评估的。
以上示例中的另一个潜在问题是 end_of_s2 可能不会考虑输出段结尾所需的任何边界填充。end_of_s2 不能可靠地作为输出段的结尾地址。避开这个问题的一种方式是,接在有问题的输出段之后创建一个虚拟段。例如:
GROUP
{
outsect:
{
start_of_outsect = .;
...
}
dummy: { size_of_outsect = .- start_of_outsect; }
}