正点原子IMX6ULL史诗级新内核移植教程(2)—— 编译内核(新瓶子装旧酒)
正点原子IMX6ULL史诗级新内核移植教程2—— 编译内核新瓶子装旧酒前言为什么这篇文章这么长说实话编译 Linux 内核这件事本身并不复杂——不就是make一下吗但问题在于你第一次编译的时候会报一堆莫名其妙的错误flex: command not found、bc: command not found、error: openssl/bio.h: No such file or directory…这些报错背后的原因是内核编译需要大量的宿主机工具和库。你把源码下载下来直接编译大概率会失败。这篇文章的目标是帮你把环境一次性搭好后续编译时不会再因为缺少依赖而卡住。我们参考了项目里scripts/build_helper/build-mainline-linux.sh的依赖检查逻辑把所有需要的依赖都列出来了。跟着做一遍你就能得到一个可以正常编译主线内核的环境。环境说明开始之前先明确一下我们的目标环境项目说明宿主机Ubuntu 22.04 LTS 或 Debian 12WSL2 也可以目标架构ARMv7 (i.MX6ULL)交叉编译工具链arm-none-linux-gnueabihf-内核版本Linux 7.0-rc4如果你用的是其他发行版包名可能略有不同但依赖本质是一样的。第一步——安装宿主机依赖内核编译需要的依赖可以分为几类基础编译工具、库文件、特定工具。我们一个个来装。基础编译工具这些是编译任何 C 项目都需要的东西sudoaptupdatesudoaptinstallbuild-essentialmakebuild-essential是一个元包会安装 gcc、g、make 等基础工具。如果你已经做过嵌入式开发大概率已经有了。内核特定工具内核编译需要一些特定的工具它们的作用可能不明显但缺一不可sudoaptinstallbcbison flex device-tree-compiler让我解释一下每个工具是干什么的bc任意精度计算器内核配置时会用它计算一些数值比如内存大小bison语法分析器生成器内核的 Kconfig 配置系统需要它flex词法分析器生成器同样用于 Kconfig 系统device-tree-compiler (dtc)设备树编译器把.dts文件编译成.dtb二进制格式如果少了这些编译会在不同阶段报错。错误信息可能不那么直观比如bc: command not found会在配置阶段报错而不是编译阶段。SSL 和加密库内核的模块签名和某些加密功能需要 OpenSSLsudoaptinstalllibssl-dev如果你编译时遇到error: openssl/bio.h: No such file or directory就是缺少这个包。Ncurses 库make menuconfig这个图形化配置工具依赖 ncursessudoaptinstalllibncurses-dev如果你不需要用 menuconfig只准备用现成的 defconfig这个包可以不装。但我强烈建议装上因为调试配置问题时 menuconfig 非常有用。其他可能需要的库某些内核功能可能需要额外的库建议一并装上sudoaptinstalllibgnutls28-dev zlib1g-devlibgnutls28-dev某些内核模块的签名需要zlib1g-dev压缩相关功能需要Python 环境某些内核编译步骤如设备树验证需要 Pythonsudoaptinstallpython3Ubuntu 22.04 默认就有 Python 3但如果是老版本系统可能需要手动安装。第二步——安装交叉编译工具链有了宿主机工具接下来是交叉编译工具链。i.MX6ULL 是 ARMv7 架构你的 x86 电脑不能直接编译出能在板子上跑的程序需要交叉编译。工具链选择有好几种选择gcc-arm-linux-gnueabihfUbuntu 官方仓库版本方便但可能版本较老arm-none-linux-gnueabihfARM 官方工具链版本新需要手动下载Linaro 工具链Linaro 组织维护的 ARM 工具链这个项目用的是arm-none-linux-gnueabihf你可以从 ARM 官网下载。为了方便起见这里用 Ubuntu 仓库版本演示sudoaptinstallgcc-arm-linux-gnueabihf验证工具链安装完成后验证一下是否正常arm-linux-gnueabihf-gcc--version你应该看到类似这样的输出arm-linux-gnueabihf-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 Copyright (C) 2021 Free Software Foundation, Inc.如果输出版本号说明安装成功。如果提示command not found检查一下是不是 PATH 环境变量的问题如果是从 ARM 官网下载的手动解压版本需要把 bin 目录加到 PATH 里。第三步——验证依赖完整性项目里的构建脚本scripts/build_helper/build-mainline-linux.sh有一个check_host_dependencies()函数它会检查所有依赖是否齐全。我们可以手动运行类似的检查# 检查基础命令forcmdingccmakebcbison flex dtc python3;doifcommand-v$cmd/dev/null;thenecho✓$cmdelseecho✗$cmd(not found)fidone# 检查库文件forheaderinopenssl/openssl.hncursesw/ncurses.h;doif[-f/usr/include/$header]||[-f/usr/include/x86_64-linux-gnu/$header];thenecho✓$(dirname$header)elseecho✗$(dirname$header)(not found)fidone如果所有检查都显示 ✓恭喜你环境已经配好了。如果有 ✗根据缺失项安装对应的包。第四步——测试编译可选如果你想确认环境真的没问题可以先编译一个简单的 ARM 程序测试一下# 创建一个测试程序echo#include stdio.h int main() { printf(Hello from ARM!\n); return 0; }hello.c# 交叉编译arm-linux-gnueabihf-gcc hello.c-ohello_arm# 检查文件类型filehello_arm你应该看到类似ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)的输出说明这是一个 ARM 程序。如果看到x86-64说明你用的是宿主机的 gcc不是交叉编译器。常见问题排查问题一dtc 版本太老某些设备树语法需要较新的 dtc 版本。如果你编译设备树时报错可能是 dtc 版本太老dtc--version如果版本低于 1.4.x建议安装device-tree-compiler包而不是用系统自带的。问题二Python 模块缺失某些内核构建步骤需要特定的 Python 模块如果报错ModuleNotFoundError: No module named xxx用 pip 安装sudoaptinstallpython3-pip pip3install缺失的模块名问题三工具链路径问题如果你下载的是 ARM 官方工具链需要手动添加到 PATH# 添加到 ~/.bashrcechoexport PATH$PATH:/opt/arm-none-linux-gnueabihf/bin~/.bashrcsource~/.bashrc问题四WSL2 的特殊问题如果你在 WSL2 下编译可能会遇到文件系统大小写敏感的问题。Linux 内核源码里有同名不同大小写的文件比如Makefile和makefile在 WSL2 的默认配置下可能出问题。建议把内核源码放在 WSL2 的文件系统内比如~/linux_mainline而不是挂载的 Windows 驱动比如/mnt/c/...。WSL2 的 Linux 文件系统是大小写敏感的Windows 文件系统则不是。下一章预告到这里你的编译环境应该已经准备好了。下一篇文章我们会讲如何获取主线内核源码从 kernel.org 克隆特定版本使用 git worktree 管理多个内核版本如何应用移植补丁源码目录结构快速导读有了源码下一步就是配置和编译。我们一步步来。参考命令速查# 一键安装所有依赖Ubuntu/Debiansudoaptinstallbuild-essentialmakebcbison flex device-tree-compiler\libssl-dev libncurses-dev libgnutls28-dev zlib1g-dev python3# 安装交叉编译工具链sudoaptinstallgcc-arm-linux-gnueabihf# 验证工具链arm-linux-gnueabihf-gcc--version延伸阅读Linux Kernel Build Documentation - 内核构建系统文档ARM GNU Toolchain Download - ARM 官方工具链下载
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2443512.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!