我得到了一个多重定义错误,我修复了,将var1作为静态放在头文件中,这对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
当我在链接器脚本中检入谷歌 .LANCHOR0类型为.word 时。我无法弄清楚为什么它在多个定义错误指示中被称为函数和它的作用?
答案 0 :(得分:0)
.LANCHOR0
不是真正的函数,它只是GCC对事物进行分组的方式,因此它可以从一个参考点参考多个静态位置。
在寄存器中构造32位地址需要多条指令,或者需要从PC上加载附近文字池中的指针。编译器希望避免在代码附近的文字池中使用每个静态(或全局)变量的地址。那会things肿。
.LANCHOR0
,.LANCHOR1
等是gcc用于此类指针的名称。
但是所有这一切的结果是,显然具有静态存储的变量 look 对汇编程序来说就像在.LANCHOR0
“函数”之后定义的一样。
就调试多定义错误而言,这里没有什么特别/有用/有趣的事情。这只是为ARM编译的结果。