gnu as声称用$支持额外的本地符号.为什么这段代码编译时出现错误,声称已经使用了符号



gnu as支持以$结尾的"额外本地符号"。这些符号是未定义的,每个非本地符号都已定义。然而,下面的代码给出了一个错误,表示符号.L1$正在被重新定义。我测试了L1$和.L1$,因为一些文档表明以L开头的符号是本地的。

这里引用了gnu中的一个文档:http://tigcc.ticalc.org/doc/gnuasm.html#SEC46

我在常规手册中找不到它,也许这是问题的一部分。我以为我看到了。这是我的错吗?是否不再支持它?

.global f
f:
.L1$:
mov r0, #1
bne     .L1$
bx      lr
.global g
g:
.L1$:
mov r0, #1
bne     .L1$
bx      lr

GNU汇编程序不支持您声称存在的"额外本地符号"功能。您可能对文档中的美元本地标签功能感到困惑,但该功能并不像您所描述的那样起作用。

美元本地标签是本地符号名称功能的变体,其中仅由数字组成的标签可以多重定义。美元本地标签功能还允许对仅由数字后跟单个美元符号($(组成的标签进行乘法定义。对这些符号的引用是通过在标签后面加上fb来进行的,这样汇编程序就知道要向前或向后查找标签。两者的区别在于,在定义了任何后续的非本地标签后,美元本地标签将变得未定义。

还要注意,以.L开头的标签与前一段中描述的符号不同,它们不是本地的。以.L开头的标签只能定义一次,并且可以从汇编程序源文件中的任何位置引用。从这个意义上说,它们与任何正常的符号都没有什么不同。它们与普通符号的不同之处在于,它们不包含在生成的对象文件的符号表中。

最后,请注意,美元本地标签功能除了不做您想做的事情外,也没有在ARM目标上实现。它也没有在x86目标上实现。这并不是真正的必要,因为"本地符号名称"功能也同样有效。

GNU汇编程序不支持在任何平台上对以非数字字符开头和以美元符号结尾的符号进行任何不同处理的功能。

最新更新