我遇到了多重定义错误,我修复了它,方法是将 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
“函数”之后定义的。
就调试多重定义错误而言,这里没有任何特别/有用/有趣的事情。这只是为 ARM 编译的结果。
关于c - .LANCHOR0 在检测多重定义错误中的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41877351/