解决Linux下交叉编译U-Boot源码时报‘multiple definition of `yylloc‘‘的错误

一、编译环境

环境
操作系统 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.oscripts/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的,所以说也是解决不了。

三、解决方案

3.1 方法一

在问题描述那里,我已经指出,这是多重定义的原因。多重定义的出现是因为 gcc中的-fcommon将它们合并为一个了3 4 5,尽管添加了extern还是会导致多重定义,故这就说明这个定义完全就是多余的,可以直接去掉也不影响程序的运行。

所以,你可以选择:

  1. 下载最新的U-Boot版本,最新的已经删掉了。
  2. 前往scripts/dtc/dtc-lexer.l文件,找到YYLTYPE yylloc;并注释掉即可。

至于-fcommon是什么东西?,可以参考-fcommon, -fno-common

3.2 方法二

换个系统试试,感觉交叉编译器在不同系统的编译行为有点奇怪目前还没找到原因…我是Fedora切换到了Ubuntu,构建成功了,人麻了。

3.3 方法三

文章是通过在顶层文件Makefile中添加HOSTCFLAGS += -fcommon6,亲测有效,具体细节可以参考文章6。

四、参考


  1. 荔枝派编译uboot时出现错误multiple definition of `yylloc‘_zhvngchvng的博客 ↩︎

  2. multiple definition of `yylloc’ - 永明 ↩︎

  3. Remove redundant YYLOC global declaration (018921ee) · Commits · U-Boot / U-Boot · GitLab (denx.de) ↩︎

  4. scripts/dtc: Remove redundant YYLOC global declaration · torvalds/linux@e33a814 (github.com) ↩︎

  5. Multiple definition of yylloc in u-boot and linux-kernel - githubmemory ↩︎

  6. 编译itop4412 uboot失败,提示multiple definition of `yylloc‘; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first_ZLK1214的专栏-CSDN博客 ↩︎

你可能感兴趣的:(一些小坑,linux,c语言,bug)