环境 | 值 |
---|---|
操作系统 | Fedora release 35 (Thirty Five) |
交叉编译环境 | gcc-linaro-6.1.1-2016.08-x86_64_aarch64-linux-gnu |
Linux 内核版本 | 5.14.16 |
U-Boot版本 | 1.7.4(板子厂商特供版) |
我们可以从报错信息看到,dtc-parser.tab.o
和scripts/dtc/dtc-lexer.lex.o
这两个中间文件中对yylloc
多重定义了,导致在链接时,产生了报错。
//问题复现 操作指令
make ft2004_defconfig
make ARCH=arm CROSS_COMPILE=/usr/local/arm/6.1/gcc-linaro-6.1.1-2016.08-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
//终端报错信息
//...
LEX scripts/dtc/dtc-lexer.lex.c
YACC scripts/dtc/dtc-parser.tab.h
HOSTCC scripts/dtc/dtc-lexer.lex.o
YACC scripts/dtc/dtc-parser.tab.c
HOSTCC scripts/dtc/dtc-parser.tab.o
HOSTLD scripts/dtc/dtc
/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x10): 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:106: scripts/dtc/dtc] Error 1
make[1]: *** [scripts/Makefile.build:432: scripts/dtc] Error 2
make: *** [Makefile:528: scripts] Error 2
我百度了一下,有文章说可以通过修改scripts/dtc/dtc-parser.tab.h
,将里面的yylloc
定义去掉就好了1,但是我发现我找不到这个文件。其实是因为我先执行了make distclean
,清除了构建信息,这个文件就没有了,所以说这个改法不是永久的,就算是临时的,我发现我改了也没有作用。
也有文章说,是因为版本使用了gcc-10
,对其进行降版本就行了2,但是我交叉编译版本本来就是低于10的,所以说也是解决不了。
在问题描述那里,我已经指出,这是多重定义的原因。多重定义的出现是因为 gcc
中的-fcommon
将它们合并为一个了3 4 5,尽管添加了extern
还是会导致多重定义,故这就说明这个定义完全就是多余的,可以直接去掉也不影响程序的运行。
所以,你可以选择:
scripts/dtc/dtc-lexer.l
文件,找到YYLTYPE yylloc;
并注释掉即可。至于
-fcommon
是什么东西?,可以参考-fcommon, -fno-common
换个系统试试,感觉交叉编译器在不同系统的编译行为有点奇怪目前还没找到原因…我是Fedora
切换到了Ubuntu
,构建成功了,人麻了。
文章是通过在顶层文件Makefile
中添加HOSTCFLAGS += -fcommon
6,亲测有效,具体细节可以参考文章6。
荔枝派编译uboot时出现错误multiple definition of `yylloc‘_zhvngchvng的博客 ↩︎
multiple definition of `yylloc’ - 永明 ↩︎
Remove redundant YYLOC global declaration (018921ee) · Commits · U-Boot / U-Boot · GitLab (denx.de) ↩︎
scripts/dtc: Remove redundant YYLOC global declaration · torvalds/linux@e33a814 (github.com) ↩︎
Multiple definition of yylloc in u-boot and linux-kernel - githubmemory ↩︎
编译itop4412 uboot失败,提示multiple definition of `yylloc‘; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first_ZLK1214的专栏-CSDN博客 ↩︎