当前位置: 首页 > news >正文

别急着换Ubuntu!在Fedora上搞定U-Boot交叉编译的‘multiple definition of yylloc‘报错

在Fedora上根治U-Boot交叉编译的'yylloc'多重定义错误

当你在Fedora 35或更高版本上交叉编译较旧版本的U-Boot时,可能会遇到一个令人头疼的错误:"multiple definition of `yylloc'"。这个错误通常出现在编译dtc(设备树编译器)组件时,导致整个构建过程中断。本文将深入分析问题根源,并提供多种在Fedora环境下彻底解决此问题的方法,让你无需切换到其他发行版就能继续工作。

1. 问题根源剖析

这个错误的本质在于符号重复定义。具体来说,yylloc变量在以下两个文件中被多次定义:

  • scripts/dtc/dtc-parser.tab.o
  • scripts/dtc/dtc-lexer.lex.o

在Fedora 35+上,这个问题变得尤为突出,主要原因有三:

  1. GCC默认行为变化:从GCC 10开始,默认编译选项从-fcommon变为-fno-common,这改变了未初始化全局变量的处理方式。
  2. dtc工具链更新:Fedora自带的dtc版本较新,与旧版U-Boot中的dtc源码存在兼容性问题。
  3. 历史遗留代码:旧版U-Boot中的dtc实现存在冗余的全局变量声明。

提示:这个问题不仅出现在U-Boot中,Linux内核早期版本在Fedora上编译时也可能遇到类似的'yylloc'冲突。

2. 解决方案一:修改编译器标志

最快捷的解决方法是恢复GCC的旧有行为,通过添加编译选项来解决问题。

2.1 临时解决方案

在编译命令中添加-fcommon标志:

make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- HOSTCFLAGS="-fcommon"

这个方法简单直接,但有两个缺点:

  • 需要每次编译都手动添加该选项
  • 不能解决代码本身的潜在问题

2.2 永久解决方案

修改U-Boot顶层Makefile,添加以下内容:

HOSTCFLAGS += -fcommon

或者更精确地,只对dtc目录应用此修改:

scripts/dtc/HOSTCFLAGS += -fcommon

优缺点对比

方法优点缺点
临时方案快速验证每次需手动添加
顶层Makefile修改一劳永逸影响所有主机工具编译
dtc目录特定修改精准定位需要了解Makefile结构

3. 解决方案二:修改源代码

对于希望从根本上解决问题的开发者,可以直接修改U-Boot源码。

3.1 定位问题文件

需要修改以下两个文件:

  1. scripts/dtc/dtc-lexer.l
  2. scripts/dtc/dtc-parser.y

3.2 具体修改步骤

  1. 打开dtc-lexer.l,找到以下行:

    YYLTYPE yylloc;

    将其注释掉或删除。

  2. 打开dtc-parser.y,确保只有一处YYLTYPE yylloc;声明。

  3. 清理并重新编译:

    make distclean make your_defconfig make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu-

注意:这种方法需要一定的代码熟悉度,但能彻底解决问题,适合长期维护的项目。

4. 解决方案三:升级或打补丁

如果你使用的U-Boot版本较旧,可以考虑以下方法:

4.1 升级U-Boot版本

较新的U-Boot版本已经修复了这个问题。查看以下提交:

  • U-Boot官方修复:018921ee ("Remove redundant YYLOC global declaration")
  • Linux内核中的类似修复:torvalds/linux@e33a814

4.2 手动应用补丁

如果无法升级整个U-Boot,可以单独应用相关补丁。创建一个patch文件:

diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l index abc1234..def5678 100644 --- a/scripts/dtc/dtc-lexer.l +++ b/scripts/dtc/dtc-lexer.l @@ -20,7 +20,6 @@ #include "dtc-parser.tab.h" extern bool treesource_error; -YYLTYPE yylloc;

然后应用补丁:

patch -p1 < yylloc_fix.patch

5. 解决方案对比与选择建议

不同的解决方案适合不同的场景:

  1. 快速验证/临时使用:方案一(编译器标志)
  2. 长期维护项目:方案二(源码修改)或方案三(升级/打补丁)
  3. 系统管理员:考虑在Fedora中安装兼容性包

性能影响评估

  • -fcommon选项会略微增加内存占用,但对嵌入式开发影响微乎其微
  • 源码修改是最干净的解决方案,没有任何运行时开销

在实际项目中,我通常会先使用方案一快速验证构建是否能够通过,然后根据项目周期决定采用方案二还是方案三。对于长期维护的项目,源码级别的修复是最推荐的做法。

http://www.jsqmd.com/news/678858/

相关文章:

  • RobotFramework Selenium与Browser常用关键字对比
  • 想找隔热膜专业生产厂家?雷迪斯图或许能满足需求 - 品牌企业推荐师(官方)
  • 告别一天一充!聊聊高通SDW4100平台如何让智能手表续航飙到一周
  • Windows 11轻松安装指南:用MediaCreationTool.bat解决硬件不兼容问题
  • COBS算法:高效字节填充技术解析与应用
  • 保姆级教程:在Unity中为你的游戏或工具软件添加“老板键”(一键最小化/隐藏)功能
  • 网络‘活地图’实战:用PyHPEcw7库+D3.js打造可点击的拓扑仪表盘
  • 2026酒吧专业舞台音响品质选型评测报告:学校音响/家庭影院音响/家庭音响/山水音响/特美声音响/舞台音响/选择指南 - 优质品牌商家
  • OAK-D vs OAK-D-Lite怎么选?从项目需求出发,聊聊我的选购心得和避坑指南
  • Thorium Reader技术解析:书籍信息面板的可复制性设计与实现机制
  • ArcGIS 10.2 里用Python工具箱(.pyt)写脚本工具,比传统方法香在哪?
  • 性价比高的长治专业改造厨房、卫生间的装修公司哪家好 - 品牌企业推荐师(官方)
  • STM32CubeIDE隐藏技能:用旧版.ioc文件创建工程,还能自由切换MCU固件库版本
  • 独立部署AI虚拟试衣间源码系统 带完整的搭建部署教程
  • 企业级Blazor微前端落地全景图,含模块联邦、样式隔离、跨框架状态同步——某金融头部客户已上线的6.2版本架构方案
  • Dislocker终极指南:在Linux/macOS上解密BitLocker加密磁盘的完整解决方案
  • 复数线性相位FIR滤波器设计原理与工程应用
  • MetaCloak-JPEG如何让你的照片不被拿去生成不可描述的图片?
  • 德州扑克GTO求解器Desktop Postflop:如何用开源工具提升你的扑克决策水平
  • 如何实现Adobe Illustrator到Photoshop的无缝矢量转换?Ai2Psd脚本全解析
  • DeepSeek系列大模型技术全解析:从V3到R1再到Coder V2的深度技术演进
  • 告别官方库!手把手教你为ESP32移植STM32的ST7735驱动(附完整代码)
  • 上海研倍新材:深耕铝合金3D打印全链条,赋能高端制造轻量化未来 - 品牌企业推荐师(官方)
  • FastLED LED动画库高效实战指南:专业级微控制器灯光控制方案
  • 告别.bat文件!用更稳定的环境变量法配置Abaqus2019子程序开发环境(VS2019+Intel Fortran)
  • 用argparse给你的Python脚本加个‘说明书’:让小白用户也能轻松上手
  • 影刀RPA多平台铺货实战:上架前的数据准备如何通过AI实现全自动化?
  • 从项目复盘看Jetson Xavier NX:我们踩过的散热、内存和缺货这些坑,以及应对方案
  • 用C++模拟操作系统:手把手教你实现四种进程调度算法(附完整可运行代码)
  • 【Docker跨架构构建终极指南】:20年DevOps专家亲授ARM/AMD64/Apple Silicon一键多平台镜像构建实战