.LANCHOR0 在检测多重定义错误中的作用是什么?

what is the role of .LANCHOR0 in detecting multiple definitions error?

我遇到了多重定义错误,我修复了它,方法是将 Var1 作为 static 放在头文件中,这对两者都是通用的pet.c 和 bet.c。 以下是我得到的错误日志

libcdr.a(pet.o): In function `.LANCHOR0':  
pet.c:(.bss+0x0): multiple definition of `Var1'  
build/obj/bet.o:bet.c:(.bss+0x0): first defined here  
collect2.exe: error: ld returned 1 exit status  

当我签入 google 时 .LANCHOR0 在链接描述文件中的类型为 .word。我无法弄清楚为什么它被称为函数,它在多重定义错误指示中的作用是什么

.LANCHOR0 不是真正的函数,它只是 GCC 对事物进行分组的方式,因此它可以从一个参考点参考多个静态位置。

在寄存器中构造一个 32 位地址需要多条指令,或者从附近的文字池中加载一个指针的 PC 相关。编译器希望避免让文字池中每个单独的静态(或全局)变量的地址靠近代码;那会使东西膨胀。

.LANCHOR0.LANCHOR1 等是 gcc 用于此类指针的名称。


但是所有这一切的结果显然是具有静态存储的变量 在汇编程序看来 就像它们是在 .LANCHOR0 "function" 之后定义的一样。

就调试多重定义错误而言,这里没有什么特别/有用/有趣的事情。这只是为 ARM 编译的结果。