Yocto 项目中的 glibc 编译失败全解析:原因、原理与修复策略

news2025/5/14 0:49:44

✅ 适用版本:glibc 2.39 / Yocto Scarthgap
📌 涉及平台:NXP i.MX / 通用 ARM / x86 架构
🧑‍💻 作者:嵌入式 Jerry
🕓 阅读时间:约 15 分钟
📦 关键知识点:do_compile、构建依赖、并发问题、内存限制、源码补丁机制、build logs 分析


在这里插入图片描述

一、为何关注 glibc 编译失败?

glibc(GNU C Library)是 Yocto 镜像中最基础的组件之一,决定了系统的启动、函数链接、libc ABI 兼容性。glibc 构建失败通常会:

  • 阻塞整个构建流程;
  • 提示 cryptic 错误(看不出表面原因);
  • 隐藏平台兼容性或构建器设置问题;
  • 难以通过 bitbake 报错快速定位根因。

二、最典型的失败示例与日志初查

📍 构建日志错误示例:

ERROR: Task (/home/jerry/imx-linux-scarthgap/sources/poky/meta/recipes-core/glibc/glibc_2.39.bb:do_compile) failed with exit code '1'

此类错误代表 glibc 编译过程中的 do_compile 步骤失败。我们可通过如下路径进入日志文件:

$ cat tmp/work/aarch64-poky-linux/glibc/2.39-r0/temp/log.do_compile.*

三、深入解析 glibc 的构建机制

📦 glibc 是如何在 Yocto 中构建的?

glibc 的构建配方路径通常为:

meta/recipes-core/glibc/glibc_2.39.bb

该配方调用流程如下:

do_fetch → do_unpack → do_patch → do_configure → do_compile → do_install

其中:

  • do_configure:使用 GNU configure 脚本进行多目标配置;
  • do_compile:实际调用 make 编译源代码;
  • 使用的是独立 build 目录,并非源码内构建。

🧰 glibc 的典型构建工具链依赖:

  • gccbinutilsmake
  • gawksedbash
  • texinfo(用于生成 man)
  • gettext-nativebison-native

四、常见 glibc 编译失败原因分类

✅ 类型 1:主机依赖不满足

glibc 是依赖繁多的包,主机缺包可能导致 configure 阶段通过,但在 make 时失败。

❗ 典型错误信息:

as: unrecognized option `--64'

✅ 修复方法:

sudo apt install gawk bison texinfo libncurses-dev

✅ 类型 2:内存不足或并发太高

glibc 编译过程需要较多 RAM。如果虚拟机/CI 环境资源受限,则出现随机崩溃。

❗ 错误信息:

internal compiler error: Killed (program cc1)

✅ 修复方法:

# 在 local.conf 中添加:
BB_NUMBER_THREADS = "1"
PARALLEL_MAKE = "-j1"

✅ 类型 3:源代码 patch 应用失败

Yocto 会在 do_patch 阶段应用 glibc 自带 patch,如果 patch 不兼容当前版本,do_compile 也可能受影响。

❗ 典型信息:

error: conflicting types for 'struct rusage'

✅ 检查方法:

bitbake -c patch glibc
cat tmp/work/*/glibc/*/temp/log.do_patch.*

✅ 修复方法:

  • 确认 layer 中 patch 是否为旧版 glibc 设计;
  • 检查 patch 是否已被上游修复,可尝试删除或替换。

✅ 类型 4:QEMU 模拟错误导致配置失败

glibc 的某些测试用例依赖 QEMU 执行 target 二进制,如果 host 无法正确运行 QEMU,编译中途会卡死或错误。

❗ 典型信息:

Segmentation fault (core dumped)

✅ 修复方法:

# 检查 host 是否有 QEMU 支持:
which qemu-aarch64

# 或在 Yocto 中禁用 glibc 的某些运行时 test:
EXTRA_OECONF_append = " libc_cv_forced_unwind=yes"

✅ 类型 5:Yocto 层冲突或版本不兼容

例如 NXP BSP 自带 glibc patch 与 poky upstream 冲突。你可能看到:

error: redefinition of 'enum __codecvt_result'

✅ 建议:

  • 将 BSP 层中的 meta-xxx/recipes-core/glibc 屏蔽;
  • 或升级 Yocto 版本到与 BSP 匹配的分支。

五、实战排错过程还原(glibc_2.39)

glibc_2.39 在 NXP i.MX93 BSP 构建失败为例:

🔍 1. 失败命令定位

bitbake glibc -c compile -f -v

🔍 2. 查看日志输出

cat tmp/work/aarch64*/glibc/2.39-r0/temp/log.do_compile.*

发现:

.../iconv_prog.c:56: undefined reference to '__libc_fatal'

🧩 3. 检查是否缺少 iconv 编译依赖

解决方案:

EXTRA_OECONF_append = " --disable-iconv"

或者添加必要头文件路径至 CFLAGS


六、快速绕过构建失败的策略(开发调试)

⚠️ 仅用于开发调试,不建议生产使用!

🪛 跳过 glibc 的编译:

bitbake -k your-image

(将继续构建其他部分,忽略失败)

🧪 替代 glibc 为 musl:

DISTRO = "poky-tiny"
TCLIBC = "musl"

七、通用修复脚本(可集成到构建前检测)

# 检查主机依赖
for pkg in gawk bison texinfo python3 make gcc; do
    dpkg -l | grep -q $pkg || echo "缺少 $pkg"
done

# 确保 QEMU 存在
if ! which qemu-aarch64; then
    echo "缺少 QEMU,请安装"
fi

八、总结:面对 glibc 编译失败的处理流程

步骤操作说明
Step 1查日志 log.do_compile.*
Step 2确认是否内存不足/并发问题
Step 3检查 patch 应用阶段是否报错
Step 4是否存在 host 编译器 / 头文件 / QEMU 问题
Step 5适当降低优化选项,关闭某些测试项
Step 6若无解,尝试降版本或切换到 musl

九、附录:配置建议汇总(local.conf)

BB_NUMBER_THREADS = "2"
PARALLEL_MAKE = "-j2"
EXTRA_OECONF_append = " libc_cv_forced_unwind=yes"

🔚 写在最后

glibc 的构建是 Yocto 项目中最基础也最容易被忽视的部分。它的失败往往暴露出构建环境的深层问题。只有深入理解其构建流程与配置项,才能真正构建稳定、可控的嵌入式 Linux 系统。

📌 如果你在使用 NXP、瑞芯微、全志、树莓派等平台构建镜像时遇到类似 glibc 错误,欢迎在评论区留言,一起排查底层构建逻辑。

📺 视频教程请关注 B 站:“嵌入式 Jerry”


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机视觉】OpenCV实战项目 :Image_Cartooning_Web_App:基于深度学习的图像卡通化

Image_Cartooning_Web_App:基于深度学习的图像卡通化Web应用深度解析 1. 项目概述2. 技术原理与模型架构2.1 核心算法2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 模型部署3.3 处理流程示例 4. 常见问题与解决方案4.1 模型加载失败4.2 显存溢出4.3 边缘伪影 5. 关…

利用并行处理提高LabVIEW程序执行速度

在 LabVIEW 编程中,提升程序执行速度是优化系统性能的关键,而并行处理技术则是实现这一目标的有力武器。通过合理运用并行处理,不仅能加快程序运行,还能增强系统的稳定性和响应能力。下面将结合实际案例,深入探讨如何利…

深入理解 Linux 阻塞IO与Socket数据结构

一、阻塞IO的直观演示 示例代码&#xff1a;最简单的阻塞接收程序 #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h>int main() {// 创建TCP套接字int sockfd socket(AF_INET, SOCK_STREAM, 0);// 绑定地址端口struct sockaddr_in ad…

如何修改进程优先级?

文章目录 1. 摘要2. 命令实现2.1 使用 renice&#xff08;调整普通进程的优先级&#xff09;​2.2 使用 chrt&#xff08;调整实时进程的优先级&#xff09; 3. 代码实现 1. 摘要 在实际开发中&#xff0c;我们经常会遇到创建进程的场景&#xff0c;但是往往并不关心它的优先级…

stm32week15

stm32学习 十一.中断 2.NVIC Nested vectored interrupt controller&#xff0c;嵌套向量中断控制器&#xff0c;属于内核(M3/4/7) 中断向量表&#xff1a;定义一块固定的内存&#xff0c;以4字节对齐&#xff0c;存放各个中断服务函数程序的首地址&#xff0c;中断向量表定…

QSFP+、QSFP28、QSFP-DD接口分别实现40G、100G、200G/400G以太网接口

常用的光模块结构形式&#xff1a; 1&#xff09;QSFP等效于4个SFP&#xff0c;支持410Gbit/s通道传输&#xff0c;可通过4个通道实现40Gbps传输速率。与SFP相比&#xff0c;QSFP光模块的传输速率可达SFP光模块的四倍&#xff0c;在部署40G网络时可直接使用QSFP光模块&#xf…

PXE安装Ubuntu系统

文章目录 1. 服务器挂载Ubuntu镜像2. 修改dhcp配置文件3. 修改tftp配置文件4.复制网络驱动文件和其他配置文件5. http目录下配置文件6. 踩坑记录6.1 Failed to load ldlinux.c326.2 no space left on device6.3 为啥用pxe安装系统时&#xff0c;客户端需要较大的内存&#xff1…

uniapp tabBar 中设置“custom“: true 在H5和app中无效解决办法

uniapp小程序自定义底部tabbar&#xff0c;但是在转成H5和app时发现"custom": true 无效&#xff0c;原生tabbar会显示出来 解决办法如下 在tabbar的list中设置 “visible”:false 代码如下&#xff1a;"tabBar": {"custom": true,//"cust…

ABP-Book Store Application中文讲解 - 前期准备 - Part 2:创建Acme.BookStore + Angular

ABP-Book Store Application中文讲解-汇总-CSDN博客 因为本系列文章使用的.NET8 SDK&#xff0c;此处仅介绍如何使用abp cli .NET 8 SDK SQL sevrer 2014创建Angular模板的Acme.BookStore。 目录 1. ABP cli创建项目 1.1 打开cmd.exe 1.2 创建项目 2. ABP Studio创建项…

基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署

基于k8s的Jenkins CI/CD平台部署实践&#xff08;三&#xff09;&#xff1a;集成ArgoCD实现持续部署 文章目录 基于k8s的Jenkins CI/CD平台部署实践&#xff08;三&#xff09;&#xff1a;集成ArgoCD实现持续部署一、Argocd简介二、安装Helm三、Helm安装ArgoCD实战1. 添加Arg…

控制台打印带格式内容

1. 场景 很多软件会在控制台打印带颜色和格式的文字&#xff0c;需要使用转义符实现这个功能。 2. 详细说明 2.1.转义符说明 样式开始&#xff1a;\033[参数1;参数2;参数3m 可以多个参数叠加&#xff0c;若同一类型的参数&#xff08;如字体颜色&#xff09;设置了多个&…

外网访问内网海康威视监控视频的方案:WebRTC + Coturn 搭建

外网访问内网海康威视监控视频的方案&#xff1a;WebRTC Coturn 需求背景 在仓库中有海康威视的监控摄像头&#xff0c;内网中是可以直接访问到监控摄像的画面&#xff0c;由于项目的需求&#xff0c;需要在外网中也能看到监控画面。 实现这个功能的意义在于远程操控设备的…

Linux系统下的延迟任务及定时任务

1、延迟任务 概念&#xff1a; 在系统中我们的维护工作大多数时在服务器行对闲置时进行 我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的&#xff0c;不会重复执行 当延迟任务产生输出后&#xff0c;这些输出会以邮件的形式发送给延迟任务发起者 在 RH…

【网络原理】数据链路层

目录 一. 以太网 二. 以太网数据帧 三. MAC地址 四. MTU 五. ARP协议 六. DNS 一. 以太网 以太网是一种基于有线或无线介质的计算机网络技术&#xff0c;定义了物理层和数据链路层的协议&#xff0c;用于在局域网中传输数据帧。 二. 以太网数据帧 1&#xff09;目标地址 …

相或为K(位运算)蓝桥杯(JAVA)

这个题是相或为k&#xff0c;考察相或的性质&#xff0c;用俩个数举例子&#xff0c;011001和011101后面的数不管和哪个数相或都不可能变成前面的数&#xff0c;所以利用这个性质我们可以用相与运算来把和k对应位置的1都积累起来&#xff0c;看最后能不能拼起来k如果能拼起来k那…

AI汽车时代的全面赋能者:德赛西威全栈能力再升级

AI汽车未来智慧出行场景正在描绘出巨大的商业图景&#xff0c;德赛西威已经抢先入局。 在2025年上海车展开幕前夕&#xff0c;德赛西威发布2030年全新使命愿景——“创领安全、愉悦和绿色的出行生活”&#xff0c;并推出全栈式智慧出行解决方案Smart Solution3.0、车路云一体式…

学习Python的第四天之网络爬虫

30岁程序员学习Python的第四天之网络爬虫的Scrapy库 Scrapy库的基本信息 Scrapy库的安装 在windows系统中通过管理员权限打开cmd。运行pip install scrapy即可安装。 通过命令scrapy -h可查看scrapy库是否安装成功. Scrapy库的基础信息 scrapy库是一种爬虫框架库 爬虫框…

5、开放式PLC梯形图编程组件 - /自动化与控制组件/open-plc-programming

76个工业组件库示例汇总 开放式PLC编程环境 这是一个开放式PLC编程环境的自定义组件&#xff0c;提供了一个面向智能仓储堆垛机控制的开放式PLC编程环境。该组件采用苹果科技风格设计&#xff0c;支持多厂商PLC硬件&#xff0c;具有直观的界面和丰富的功能。 功能特点 多语…

linux中常用的命令(三)

目录 1- ls(查看当前目录下的内容) 2- pwd (查看当前所在的文件夹) 3- cd [目录名]&#xff08;切换文件夹&#xff09; 4- touch [文件名] &#xff08;如果文件不存在&#xff0c;新建文件&#xff09; 5- mkdir[目录名] &#xff08;创建目录&#xff09; 6-rm[文件名]&…

Java 中 AQS 的实现原理

AQS 简介 AQS(全称AbstractQueuedSynchronizer)即抽象同步队列&#xff0c;它是实现同步器的基础组件&#xff0c;并发包中锁的底层就是使用AQS实现的。 由类图可以看到&#xff0c;AQS是一个FIFO的双向队列&#xff0c;其内部通过节点head和tail记录队首和队尾元素&#xff0…