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

GCC 10.x编译旧版Linux内核:深入剖析`yylloc`多重定义错误的根源与修复

1. 当GCC 10.x遇上老内核yylloc冲突现场还原那天我正在给一台老设备移植Linux 4.19内核系统默认的GCC已经升级到10.3版本。执行make menuconfig一切正常但开始编译后突然报出这个错误/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss0x10): multiple definition of yylloc’; scripts/dtc/dtc-lexer.lex.o:(.bss0x0): first defined here这个错误看起来像是链接器在抱怨yylloc符号被重复定义。有趣的是同样的内核代码用GCC 9.x编译完全正常。更诡异的是错误发生在设备树编译器(dtc)的组件中而不是内核核心代码。我打开报错涉及的源码文件发现yylloc是Flex和Bison生成的词法分析器/语法分析器使用的全局变量。在dtc-lexer.lex.c_shipped中它被直接定义为YYLTYPE yylloc而在dtc-parser.tab.c中又出现了相同的定义。这在旧版GCC下能通过但GCC 10.x突然开始严格检查这种重复定义。2. 编译器升级引发的蝴蝶效应2.1 GCC 10.x的符号处理革命GCC 10.x引入了一项重要改变默认启用-fno-common编译选项。这个看似微小的调整实际上改变了C语言对未初始化全局变量的处理方式。在传统C编程中像int foo;这样的未初始化全局变量会被放在common block中允许在多个编译单元中重复定义链接时自动合并。而-fno-common则要求显式使用extern声明共享变量否则每个定义都会被视为独立实体。这个变化带来的好处包括更早捕获重复定义错误提升代码安全性为链接时优化(LTO)提供更好支持2.2 设备树编译器的历史包袱Linux内核中的设备树编译器(dtc)是个特殊存在。它虽然是内核构建的一部分但实际上是个独立工具使用Flex和Bison生成词法/语法分析器。这些自动生成的代码存在以下特点yylloc是Flex/Bison生成的全局状态变量在词法分析器(dtc-lexer.lex.c)和语法分析器(dtc-parser.tab.c)中都有定义旧版代码依赖-fcommon行为实现变量共享当GCC 10.x默认禁用-fcommon后这两个定义就变成了真正的冲突。这就是为什么错误信息显示.bss段中存在两个yylloc实例。3. 深入诊断从报错信息到解决方案3.1 错误信息的解剖学让我们仔细分析这个错误信息/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss0x10): multiple definition of yylloc’; scripts/dtc/dtc-lexer.lex.o:(.bss0x0): first defined here关键信息解读/usr/bin/ld链接器发出的错误.bss0x10在未初始化数据段的偏移量multiple definition检测到重复符号first defined here指出首次定义的位置3.2 三种可行的解决方案经过实验验证我发现至少有三种方法可以解决这个问题方法一修改lexer源码推荐// 在dtc-lexer.lex.c_shipped中添加extern声明 extern YYLTYPE yylloc; // 通常在634行左右这是最精准的修复因为保持lexer作为变量的主要定义者让parser通过extern引用这个定义不影响其他编译环境方法二恢复GCC的旧行为在Makefile中添加KBUILD_CFLAGS -fcommon这种方法虽然简单但影响整个内核构建可能掩盖其他潜在问题不推荐用于长期解决方案方法三更新dtc工具较新的内核版本(5.10)已经修复此问题。可以考虑从新版内核中提取dtc工具替换旧内核中的scripts/dtc目录不过这种方法可能引入兼容性问题需要全面测试。4. 防御性编程避免类似问题的实践建议4.1 头文件守卫的进阶用法对于全局变量共享标准的做法是在头文件中声明// globals.h #ifndef GLOBALS_H #define GLOBALS_H extern int global_var; #endif在单个源文件中定义// globals.c #include globals.h int global_var 0;4.2 构建系统的兼容性检查建议在构建脚本中加入编译器特性检测# 检查GCC版本 GCC_VERSION$(gcc -dumpversion | awk -F. {print $1}) if [ $GCC_VERSION -ge 10 ]; then echo 注意检测到GCC 10启用兼容模式 EXTRA_CFLAGS-fcommon fi4.3 自动化工具链管理对于长期维护的项目建议使用Docker容器固定工具链版本在README中明确支持的编译器版本设置CI/CD管道测试不同编译器组合5. 从问题看本质软件生态的兼容性挑战这次调试经历让我深刻体会到软件生态链的脆弱性。一个编译器默认选项的改变就能影响到十几年前设计的构建系统。在现代软件开发中我们需要特别注意工具链锁定生产环境应该固定编译器版本防御性编码即使是生成的代码也要考虑兼容性分层抽象将核心逻辑与工具依赖分离对于嵌入式开发者来说这个问题尤其常见。我后来在编译U-Boot、Buildroot等工具时也遇到过类似情况。掌握这类问题的诊断方法能节省大量调试时间。6. 扩展知识相关工具链的演进6.1 Flex/Bison的现代化替代品较新的语言解析工具开始避免全局状态re2c更现代的lexer生成器LemonSQLite使用的parser生成器ANTLR支持多语言的解析器生成器6.2 内核构建系统的改进Linux 5.15内核已经更新了dtc工具链增加了对GCC 11/12的支持改进了构建时兼容性检查对于必须使用旧内核的开发者可以考虑backport这些改进。7. 实战演练完整修复流程让我们用一个真实的修复案例来总结确认问题make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- -j8定位问题文件vim scripts/dtc/dtc-lexer.lex.c_shipped 634添加extern声明 extern YYLTYPE yylloc; YYLTYPE yylloc;清理并重新编译make clean make -j8验证修复readelf -s vmlinux | grep yylloc这个流程在ARM64、x86等多种架构上都验证有效。关键在于理解错误本质而不是盲目应用补丁。

相关文章:

GCC 10.x编译旧版Linux内核:深入剖析`yylloc`多重定义错误的根源与修复

1. 当GCC 10.x遇上老内核:yylloc冲突现场还原 那天我正在给一台老设备移植Linux 4.19内核,系统默认的GCC已经升级到10.3版本。执行make menuconfig一切正常,但开始编译后突然报出这个错误: /usr/bin/ld: scripts/dtc/dtc-parser.t…...

【2024最稀缺技术组合】:智能生成+动态可视化=下一代开发者OS(仅限首批200家企业的内部验证报告)

第一章:智能生成动态可视化融合范式的本质定义 2026奇点智能技术大会(https://ml-summit.org) 智能生成与动态可视化融合范式并非二者功能的简单叠加,而是一种在语义层、时序层与交互层深度耦合的新型计算范式。其核心在于:生成模型&#xf…...

从多普勒频移到精准测速:CW雷达核心原理剖析

1. 多普勒效应:从救护车声到雷达测速 每次听到救护车鸣笛声由远及近时,你肯定注意到一个有趣现象:当救护车靠近时,警笛声听起来更尖锐;远离时,声音变得低沉。这个日常现象背后就是多普勒效应,它…...

Media Extended B站插件:在Obsidian中完美播放B站视频的终极指南

Media Extended B站插件:在Obsidian中完美播放B站视频的终极指南 【免费下载链接】mx-bili-plugin 项目地址: https://gitcode.com/gh_mirrors/mx/mx-bili-plugin 想在Obsidian笔记中直接播放B站视频吗?Media Extended B站插件为你提供了完美的解…...

拯救者笔记本电池健康管理深度指南:LenovoLegionToolkit专业配置方案

拯救者笔记本电池健康管理深度指南:LenovoLegionToolkit专业配置方案 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …...

告别驱动烦恼:一劳永逸的QT5.14+MySQL8数据库连接配置方案(Windows平台)

告别驱动烦恼:一劳永逸的QT5.14MySQL8数据库连接配置方案(Windows平台) 每次新建QT项目都要重新编译MySQL驱动?在不同电脑上部署环境总遇到动态库缺失?这套工程化解决方案将彻底改变你的开发体验。我们将从实战角度出发…...

从Word到ACM TAPS:一份面向作者的格式转换与上传实战指南

1. 从Word到ACM TAPS:为什么需要格式转换? 第一次收到ACM期刊录用通知时,我盯着邮件里那句"请通过TAPS系统提交最终版本"发了半天呆。作为习惯用Word写论文的研究者,突然要面对这个专业出版系统确实有点懵。后来才知道&…...

华为AC+AP组网实战:手把手教你配置AP有线口,让打印机和手机一起上网

华为ACAP组网实战:办公网络一体化配置指南 办公室里总有些设备需要有线连接——比如那台老式打印机,或者财务部的台式机;同时员工的手机、笔记本又依赖Wi-Fi。传统做法是拉两套网络,但华为ACAP方案能让你用一套设备搞定所有接入需…...

从一次跨域业务中断说起:用Wireshark抓包带你复盘MPLS Option B的故障排查全流程

从一次跨域业务中断说起:用Wireshark抓包带你复盘MPLS Option B的故障排查全流程 那天凌晨3点17分,监控大屏突然跳出红色告警——核心业务系统的跨域交易成功率断崖式下跌至12%。作为网络团队的值班负责人,我立刻意识到这绝非普通故障&#x…...

别再只用微信授权了!手把手教你用小程序云开发实现账号密码登录注册(附完整源码)

突破微信授权限制:小程序云开发构建完整账号体系实战指南 每次看到小程序弹出"微信授权登录"的界面时,你有没有想过——如果用户拒绝授权,你的应用就彻底失去了这个用户?去年我们团队就遇到过这样的尴尬:一个…...

STM32串口DMA收发避坑指南:CubeMX配置详解与两种实战代码对比(F103C8Tx实测)

STM32串口DMA高效通信实战:CubeMX配置陷阱与双方案深度解析 在嵌入式开发中,串口通信是最基础也最常用的外设接口之一。当面对高速数据流或实时性要求严格的场景时,传统的轮询或中断方式往往力不从心。这时,DMA(直接内…...

终极指南:如何使用Locale Remulator彻底解决游戏乱码问题

终极指南:如何使用Locale Remulator彻底解决游戏乱码问题 【免费下载链接】Locale_Remulator System Region and Language Simulator. 项目地址: https://gitcode.com/gh_mirrors/lo/Locale_Remulator 你是否遇到过运行日文游戏时文字显示为乱码方块&#xf…...

如何用Gopher360实现游戏手柄控制电脑:客厅PC终极解决方案

如何用Gopher360实现游戏手柄控制电脑:客厅PC终极解决方案 【免费下载链接】Gopher360 Gopher360 is a free zero-config app that instantly turns your Xbox 360, Xbox One, or even DualShock controller into a mouse and keyboard. Just download, run, and re…...

【实战解析】C# NPOI实现Excel图片插入与智能列宽调整的进阶技巧

1. 电商后台数据导出的痛点与NPOI解决方案 做过电商后台开发的朋友应该都遇到过这样的需求:需要将商品列表导出为Excel报表,并且要在报表中插入商品图片。这个需求看似简单,实际操作中却会遇到不少坑。比如图片插入后单元格大小不合适导致图片…...

STM32F103C8T6 + HX711 压力传感器实战:CubeMX配置与卡尔曼滤波降噪全流程

STM32F103C8T6 HX711 压力传感器实战:CubeMX配置与卡尔曼滤波降噪全流程 当你在电子秤或压力检测项目中遇到数据跳变严重的问题时,是否曾怀疑过是硬件连接不稳定?实际上,90%的传感器噪声问题都源于软件处理不当。本文将带你深入S…...

SD-PPP完整实用指南:如何让Photoshop与AI绘图无缝协作

SD-PPP完整实用指南:如何让Photoshop与AI绘图无缝协作 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp SD-PPP是一款革命性的Photoshop AI插件,它能将Adobe Photoshop与ComfyUI、Stable Diff…...

3个场景,1个解决方案:彻底告别Windows音量弹窗的干扰

3个场景,1个解决方案:彻底告别Windows音量弹窗的干扰 【免费下载链接】HideVolumeOSD Hide the Windows 10 volume bar 项目地址: https://gitcode.com/gh_mirrors/hi/HideVolumeOSD 你是否曾在全屏游戏中调整音量时,被突然弹出的音量…...

手把手教你配置Simulink和PSpice的数据交换:从SLPS块到仿真结果查看

跨平台仿真数据互通实战:Simulink与PSpice深度协作指南 在工程仿真领域,Matlab/Simulink和PSpice分别代表着系统级仿真与电路级仿真的两大标杆工具。当我们需要分析一个同时包含控制算法和精密电路模型的复杂系统时,单独使用任一工具都可能遇…...

终极画中画扩展:Chrome多任务观影完整指南

终极画中画扩展:Chrome多任务观影完整指南 【免费下载链接】picture-in-picture-chrome-extension 项目地址: https://gitcode.com/gh_mirrors/pi/picture-in-picture-chrome-extension 你是否曾在观看在线课程时需要同时查阅文档?是否想一边追剧…...

3天从零到精通:用Ryujinx模拟器在PC上免费畅玩Switch游戏

3天从零到精通:用Ryujinx模拟器在PC上免费畅玩Switch游戏 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想在电脑上体验《塞尔达传说:旷野之息》的壮丽世界&am…...

从零搭建UVM验证平台:核心组件与通信机制全解析

1. UVM验证平台入门指南 第一次接触UVM验证平台时,我也被各种专业术语搞得晕头转向。经过几个实际项目的磨练,我发现理解UVM其实就像组建一支足球队 - 每个队员都有明确的位置和职责,只有相互配合才能赢得比赛。UVM(Universal Verification M…...

AI代码迁移生死线:2026奇点大会技术委员会紧急预警(92.7%企业因忽略这4个语义锚点导致LLM生成代码崩溃)

第一章:2026奇点智能技术大会:AI代码迁移 2026奇点智能技术大会(https://ml-summit.org) 本届大会首次设立“AI代码迁移”专项轨道,聚焦大模型驱动的跨平台、跨范式、跨语言自动化重构能力。与传统静态分析工具不同,新一代迁移引…...

Linuxmint 桌面美学:从零打造个性化工作空间

1. Linuxmint 桌面美化入门指南 第一次接触Linuxmint时,我就被它简洁高效的设计所吸引。但作为一个视觉动物,总觉得默认界面少了些个性。经过半年的折腾,我总结出一套既美观又实用的美化方案,完全不需要编程基础,跟着…...

C语言:求字符串长度的几种方法

下面展示了两种求字符串长度的方法&#xff1a; 用sizeof函数求得的长度包含不可见的\0用str函数求得的长度不包含字符串末尾的\0 例如&#xff1a; #include <stdio.h> #include <string.h>int main() {char str[] "ab";// 用sizeof函数求得的长度包含…...

3个令人惊叹的理由:为什么CodeCombat能让孩子爱上编程学习?

3个令人惊叹的理由&#xff1a;为什么CodeCombat能让孩子爱上编程学习&#xff1f; 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 在当今数字化时代&#xff0c;编程已成为一项必备技能&#xf…...

Subversion 取代 CVS 后的 2026

在开源软件领域&#xff0c;并行版本系统&#xff08;CVS&#xff09;一直使版本控制的选择。 恰如其分的是&#xff0c;CVS本身是一个自由软件&#xff0c;它的非限制性的技法和对网络操作的支持&#xff08;允许大量的不同地域分散的程序员可以共享他们工作的特性&#xff0…...

如何在Windows和Linux上快速解锁VMware的macOS虚拟机支持:终极完整指南

如何在Windows和Linux上快速解锁VMware的macOS虚拟机支持&#xff1a;终极完整指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 你是否在VMware中找不到macOS选项&#xff1f;想在普通PC上运行苹果系…...

仅限SITS2026参会者获取的AI算子融合checklist,覆盖PyTorch 2.4/Triton 2.5/ONNX Runtime 1.18

第一章&#xff1a;SITS2026分享&#xff1a;AI性能优化建议 2026奇点智能技术大会(https://ml-summit.org) 模型推理阶段的量化加速实践 在边缘设备与高并发服务场景中&#xff0c;FP16或INT8量化可显著降低显存占用并提升吞吐。PyTorch提供了原生支持的动态量化与静态校准流…...

终极Dexie.js社区贡献指南:从新手到开源贡献者的完整路径

终极Dexie.js社区贡献指南&#xff1a;从新手到开源贡献者的完整路径 【免费下载链接】Dexie.js A Minimalistic Wrapper for IndexedDB 项目地址: https://gitcode.com/gh_mirrors/de/Dexie.js Dexie.js作为IndexedDB的极简封装库&#xff0c;为开发者提供了强大而简洁…...

Stable Yogi Leather-Dress-Collection入门必看:2.5D皮衣生成与传统3D建模工作流对比

Stable Yogi Leather-Dress-Collection入门必看&#xff1a;2.5D皮衣生成与传统3D建模工作流对比 1. 工具介绍 Stable Yogi Leather-Dress-Collection是一款基于Stable Diffusion v1.5和Anything V5动漫底座模型开发的2.5D皮衣穿搭生成工具。它通过创新的技术方案&#xff0c…...