1. 问题背景与现象分析
最近在正点原子imx6ull开发板上进行Linux内核编译时,遇到了一个令人头疼的链接错误。这个错误发生在编译的链接阶段,系统提示变量yylloc在dtc-parser.tab.o和dtc-lexer.lex.o两个目标文件中存在重复定义。具体报错信息如下:
code复制/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
make[2]: *** [scripts/Makefile.host:100: scripts/dtc/dtc] Error 1
make[1]: *** [scripts/Makefile.build:403: scripts/dtc] Error 2
make[1]: *** Waiting for unfinished jobs....
HOSTLD scripts/mod/modpost
make: *** [Makefile:555: scripts] Error 2
这个错误的核心在于链接器(ld)发现同一个变量yylloc被多次定义。在Linux内核编译过程中,Device Tree Compiler(dtc)工具链是必不可少的组成部分,而yylloc变量正是dtc相关代码中用于记录词法分析位置信息的全局变量。
提示:yylloc是Bison/Yacc语法分析器和Flex词法分析器中常用的位置跟踪变量,通常定义为YYLTYPE类型,用于在编译错误时提供精确的位置信息。
2. 问题根源探究
经过深入分析,我发现这个问题与Ubuntu 22.04使用的较新版本GCC编译器有关。新版本编译器对符号重复定义的检查更为严格,而旧版本编译器则相对宽松。具体来说:
- 编译器行为变化:Ubuntu 22.04的GCC版本(11.x)相比旧版本(如Ubuntu 18.04的7.x)在链接时对符号重复定义的检查更加严格,这实际上是一个合理的改进,有助于发现潜
