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

标签 c linker linker-errors

我遇到了多重定义错误,我修复了它,方法是将 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/

相关文章:

c - ld.so 中是否有任何宏或指针可以给我所有 plt 部分的地址范围?

c++ - 尝试在项目中使用 Google Protocol buffer c++ 链接错误

c++ - 链接器找不到 Lua 库定义

c++ - 用 C++ 读取文本文件

c - 为什么套接字描述符得到-1?

c - 需要有非阻塞的命名管道,能够在 Linux 上的 c 中进行双向通信

xcode - 使用 swift 为 Xcode 项目自定义链接器

python - Python 中套接字接收的习惯用法

c - 无法在动态链接库中找到过程入口点axiom_attribute_create

c++ - Makefile 报告 `func[abi:cxx11]()' 的多个定义