编译Linux Kernel -- Version 4.9.153

本文详细介绍如何从源码编译Linux Kernel 4.9.153版本,包括下载内核包、配置编译环境、创建配置文件、编译内核、安装及启动自编译的内核等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我使用的是kernel 4.9.153版本,debian上测试过,但是编译环境可以是任何linux系统。

第一步: 下载tarball

kernel.org 下载一个稳定版的kernel包,如linux-4.9.153.tar.xz, 然后解压出来到linux-4.9.153文件夹

第二步:装好所需的工具

sudo apt install build-essential bc python libncurses5-dev libncursesw5-dev

然后重启一下

可以查看一下当前自己系统的kernel 版本(结果根据自己系统不同而不同):

uname -r
# 我的机器上是 :
4.9.0-8-amd64

第三步: 确认一下kernel版本

进入解压后的文件夹linux-4.9.153, 然后看一下Makefile:

$ head -n 5 Makefile
VERSION = 4
PATCHLEVEL = 9
SUBLEVEL = 153
EXTRAVERSION =
NAME = Roaring Lionus

第四步: 创建配置文件.config

需要在kernel源文件根目录下(linux-4.9.153下), 创建一个配置文件.config, 在里面可以指定非常多的配置项。
为了方便起见,可以使用当前系统的配置文件,它在/boot下。
可以使用下面命令通过本机配置来创建.config文件,并且验证不合格的参数值

$ make olddefconfig

之后可以使用菜单的方式查看和改动.config:

$ make menuconfig

保存退出后,它会创建备份配置文件.config.old, 用新的配置覆盖 .config

可以设置2个值:

  1. CONFIG_LOCALVERSION="-mykernel"
    自己设置个名字后缀,用来区分kernel名,如-mykernel
  2. CONFIG_BLK_DEV_LOOP=y

可以使用 scripts/diffconfig .config.old .config 来对比新老配置文件的区别

可选步骤——localmodconfig

执行编译的时候,会有很多时间花在了编译和安装 kernel 的 modules上,但是实际上有很多module都是用不到的。所以可以根据当前系统中已经加载的module,来重新产生一个更小的.config文件,这样这个文件中只包含到当前使用到的modules,能够大大减小编译时间。

在内核根目录下,执行

make localmodconfig

它会根据当前系统中运行的modules,来修改.config文件。

因为执行这一句的时候,会被询问很多问题,所以可以直接按回车来默认选项,或者是直接输入:

yes '' | make localmodconfig

执行完之后,就会产生一个更小的配置文件(配置文件本身可能占用空间更大,但是内部配置的modules更少了)。
然后确保修改

CRYPTO_CRC32C_INTEL=y

最好是在运行这一步之前,创建一下虚拟机镜像,万一这一步操作之后导致编译失败,直接回到之前,使用原始的.config文件用来执行第五步以及后面的步骤

第五步:编译 kernel

在kernel的根目录下运行下面的命令,其中N替换成本机器的核心数(4核就是 make -j4

make -jN

根据每台机器性能不同,这次编译时间可能多达3个小时

第六步:安装kernel到启动项

在确认第五步正常运行,没有报错的情况下,运行下面2个代码(使用root权限):

sudo make modules_install    # 安装所有已编译的kernel modules
sudo make install			 # 安装kernel镜像到 /boot/ 

然后可以去/boot/下面查看,应该多了这3个文件:

  • vmlinuz-4.9.153-mykernel
  • initramfs-4.9.153-mykernel.img
  • System.map-4.9.153-mykernel

不同kernel版本 install出的文件可能名称会略有不同,但是这个名字 -mykernel 就是刚才自己配置的CONFIG_LOCALVERSION内容

第七步: 重启系统,在开机时选择kernel

sudo shutdown -r now

重启系统,进入启动菜单选项的时候,找到和自己编译的kernel相同的项启动。
进入桌面后可以查看kernel版本:

uname -r
4.9.153-mykernel
<think>嗯,用户现在问的是关于自己编译gcc-linaro-4.9-2017.01.tar.xz的问题。之前用户遇到了编译glibc时的错误,现在转向了编译GCC Linaro工具链,可能是在为嵌入式开发准备交叉编译工具链,比如mini2440这样的ARM开发板。需要先理清用户的需求和可能的背景。 首先,用户可能正在尝试为ARM架构交叉编译程序,所以需要自己构建GCC工具链。Linaro的版本是专门针对ARM优化的,特别是4.9版本可能用于旧版系统的兼容性,比如支持特定的内核或库。用户下载的是2017年的版本,可能他们的项目需要特定的工具链版本,或者他们正在维护旧的项目。 接下来,用户可能需要知道如何正确解压、配置、编译和安装这个工具链。考虑到用户之前遇到构建错误,他们可能在编译过程中遇到依赖项、配置选项不正确或路径问题。需要详细步骤,避免常见的陷阱,比如缺少依赖库、未正确设置目标平台参数等。 另外,用户可能没有意识到交叉编译工具链需要其他组件,比如binutils、glibc或内核头文件。需要指导他们如何获取并正确配置这些依赖项。同时,旧版本的GCC可能对现代的主机系统(如较新的Linux发行版)存在兼容性问题,可能需要安装旧版工具或应用补丁。 还要考虑用户的环境,他们是否在干净的构建目录中操作,是否设置了正确的环境变量,比如PATH、CFLAGS、CXXFLAGS等。可能需要建议他们使用独立的安装目录,避免污染系统路径,也方便后续管理。 用户可能还需要测试编译后的工具链是否有效,比如编写一个简单的ARM程序并用qemu-arm运行测试,或者检查生成的二进制文件是否针对正确的架构。此外,可能涉及如何将工具链添加到系统路径中,方便后续使用。 需要提醒用户注意文档的查阅,特别是Linaro提供的文档或GCC的官方编译指南,因为不同版本可能有不同的配置要求。同时,可能存在的常见错误,如权限问题、依赖包缺失(如GMP、MPFR、MPC等),以及如何解决这些问题。 最后,总结步骤,确保用户能够一步步跟随,从准备环境、解压源码、配置选项、编译、安装到测试,每个环节都要详细说明可能的问题和解决方法。另外,考虑到用户之前的经验,可能需要更强调配置参数的正确性,如目标平台、前缀路径、启用或禁用某些特性等。</think>以下是对自行编译`gcc-linaro-4.9-2017.01.tar.xz`工具链的完整指南,特别针对嵌入式开发场景(如ARM架构的mini2440开发板): --- ### **编译准备阶段** #### 1. 环境要求 ```bash # 必需的主机依赖项(Ubuntu/Debian示例) sudo apt-get install build-essential flex bison libgmp-dev \ libmpfr-dev libmpc-dev texinfo zlib1g-dev libisl-dev ``` * 验证主机gcc版本:`gcc --version`(建议4.8+) * 磁盘空间需求:至少15GB空闲空间 #### 2. 源码解压与目录结构 ```bash tar -xvf gcc-linaro-4.9-2017.01.tar.xz cd gcc-linaro-4.9-2017.01 mkdir build && cd build # 必须使用独立构建目录 ``` --- ### **关键配置参数** #### 基础配置模板(ARMv5te架构适配mini2440): ```bash ../configure \ --target=arm-linux-gnueabi \ # 目标平台 --prefix=/opt/linaro-4.9 \ # 安装路径 --enable-languages=c,c++ \ # 编译语言支持 --with-arch=armv5te \ # 指定ARM核心架构 --with-float=soft \ # mini2440无硬件浮点单元 --disable-nls \ # 禁用本地化 --disable-libmudflap \ # 移除不必要库 --disable-libssp \ # 安全增强禁用 --with-gmp=/usr/local/lib \ # 显式指定数学库路径 --with-mpfr=/usr/local/lib \ --with-mpc=/usr/local/lib ``` --- ### **分步编译流程** #### 1. 并行编译控制(建议分阶段执行) ```bash # 第一阶段:编译基础组件(单线程避免竞态) make -j1 all-gcc # 第二阶段:完整编译(启用多线程) make -j$(nproc) # 安装到指定目录 sudo make install ``` #### 2. 验证工具链 ```bash # 检查交叉编译器版本 /opt/linaro-4.9/bin/arm-linux-gnueabi-gcc -v # 应显示关键信息: gcc version 4.9.4 20170110 (Linaro GCC 4.9-2017.01) Target: arm-linux-gnueabi Thread model: posix ``` --- ### **嵌入式开发适配** #### 1. 内核头文件集成(需提前准备) ```bash # 指定mini2440内核头文件路径(示例) --with-sysroot=/opt/arm-linux-3.0.1-headers \ --with-build-sysroot=/opt/arm-linux-3.0.1-sysroot ``` #### 2. 链接器特殊配置 ```bash # 在构建参数中添加: --with-ld=arm-linux-gnueabi-ld \ --with-gnu-ld \ --disable-multilib ``` --- ### **常见问题解决方案** #### **错误:`cannot find crt1.o`** ```bash # 解决方案:手动指定库路径 export LIBRARY_PATH=/opt/linaro-4.9/arm-linux-gnueabi/lib:$LIBRARY_PATH ``` #### **错误:`unsupported ARM mode`** ```bash # 需在配置阶段添加架构限制参数: --with-mode=arm \ # 强制ARM模式(非Thumb) --with-cpu=arm9tdmi # 适配mini2440的ARM9核心 ``` #### **错误:`internal compiler error: Illegal instruction`** ```bash # 原因:宿主机构建环境优化过高 # 修正方法:降低编译优化级别 CFLAGS="-O1 -g" CXXFLAGS="-O1 -g" ../configure [...原有参数...] ``` --- ### **交叉编译测试** #### 1. 编写测试程序`hello.c` ```c #include <stdio.h> int main() { printf("Cross-compile success!\n"); return 0; } ``` #### 2. 使用新工具链编译 ```bash /opt/linaro-4.9/bin/arm-linux-gnueabi-gcc \ -march=armv5te -mtune=arm9tdmi -static hello.c -o hello.elf ``` #### 3. QEMU模拟验证 ```bash qemu-arm -L /opt/linaro-4.9/arm-linux-gnueabi/libc ./hello.elf # 应输出:Cross-compile success! ``` --- ### **版本兼容性矩阵** | 组件 | 要求版本 | 验证命令 | |----------------|------------------|---------------------------| | Binutils | 2.24+ | `arm-linux-gnueabi-ld -v` | | GMP | 4.3.2+ | `gmpversion` | | Linux Kernel | 2.6.32+ | `uname -r` | | glibc | 2.11+ | `ldd --version` | --- ### **编译优化建议** $$ \text{编译时间} \propto \frac{\text{代码规模}}{\text{CPU核心数}} \times \left(1 - \frac{\text{SSD缓存命中率}}{100}\right) $$ * 推荐使用tmpfs加速: ```bash mount -t tmpfs -o size=10G tmpfs /path/to/build_dir ``` * 启用CCache缓存: ```bash export CCACHE_DIR=/var/cache/ccache ../configure CC="ccache gcc" CXX="ccache g++" [...其他参数...] ``` --- ### **维护建议** 1. 保留构建日志:`script -c &#39;make -j8&#39; build.log` 2. 使用版本隔离: ```bash update-alternatives --install /usr/bin/arm-gcc arm-gcc /opt/linaro-4.9/bin/gcc 100 ``` 3. 定期清理:`find /opt/linaro-4.9 -name &#39;*.la&#39; -exec rm {} \;` 建议在完成基础编译后,通过`--enable-obsolete`参数添加对旧版C++ ABI的支持,以兼容遗留嵌入式系统组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值