专栏名称: 嵌入式微处理器
关注这个时代最火的嵌入式微处理器,你想知道的都在这里。
目录
相关文章推荐
独角兽智库  ·  医药生物行业2025年2月投资策略:关注AI ... ·  3 天前  
独角兽智库  ·  大摩:“空头”也改口了,看多并上调MSCI中 ... ·  3 天前  
洪观新闻  ·  阿里巴巴美股涨近10% ·  3 天前  
洪观新闻  ·  阿里巴巴美股涨近10% ·  3 天前  
51好读  ›  专栏  ›  嵌入式微处理器

编译Linux内核,必知的几个小Tips

嵌入式微处理器  · 公众号  ·  · 2024-12-04 12:07

正文

Tip1:交叉编译选项

编译Linux,通常只需要运行 make menuconfig 配置要编译的模块,然后运行 make Linux默认是做本地编译,也就是编译位本机使用的内核。

在嵌入式开发中,经常需要交叉编译,要做交叉编译的话,需要在 make 命令后加上宏定义,如交叉编译为arm目标:

make ARCH=arm CROSS_COMPILE=arm-linux-

ARCH=arm :表示目标CPU为ARM架构

CROSS_COMPILE=arm-linux-

表示编译过程使用的交叉编译链为 arm-linux

当然也可以直接修改 Makefile 中的 ARCH CROSS_COMPILE 宏定义,以此实现同样的效果。但是 不建议直接修改Makefile

Tip2:源码与目标文件分离

Linux内核编译过程会产生很多的文件,包括目标文件、临时文件等等, 默认情况下,编译生成的文件会存放在内核源码目录

当你使用 git status 显示自己对内核代码的修改时也会把这些临时文件显示出来,而且提交还必须一个文件一个文件地指定,相当麻烦。

因此我们可以在父目录创建一个存放编译文件的目录,如 build-kernel ,然后再 make 命令后面加上宏定义:

make O=../build-kernel

这样在编译Linux内核时, 所有编译产生的文件,都会放在build-kernel目录,如果build-kernel目录不存在,也会自动创建 。这样可以实现Linux内核源码与编译产生的文件分离。

Tip3:获得编译命令及选项

编译linux时,默认不会显示编译的命令,如果你要获得编译命令及其选项,可以在make命令后面加上宏定义:

make V=1

如果希望编译系统告诉你为何某个目标文件需要重新编译,则:

make V=2

内核编译脚本

最后,分享一下我常用的内核编译脚本 mk.sh ,给大家参考:

#!/bin/sh

export ARCH=arm
export PATH=~/toolchain/arm_glibc/host/bin:$PATH
export CROSS_COMPILE=arm-linux-gnu-

#
make O=../bd defconfig
make O=../bd menuconfig -j32
make O=../bd dtbs

#
反汇编
$(CROSS_COMPILE)objdump -d ../bd/vmlinux > ../image/vmlinux_dump.txt

#
生成uImage
../ubd/tools/mkimage -A arm -T kernel -C none -O linux -a 0x80200000 -e 0x80200000 -n "debug kernel" -d ../bd/Image ../image/uImage

其中, make O=../bd defconfig 只有在第一次编译内核的才使用,第一次编译过后,将这句注释,后面都通过 make menuconfig 修改内核配置。

objdump 反汇编对大多数人来说可能用不上,一般在内核移植、启动分析时比较有用,但由于工作需要,我通常都会把反汇编加上。

END

作者:Vincent

来源:嵌入式Linux充电站

版权归原作者所有,如有侵权,请联系删除






请到「今天看啥」查看全文