ZHCUAV7Z september 1995 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
点运算符 (.) 用于在链接时用输出段中的特定地址定义符号。它的解释方式与 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; }
}