生成的目录在out_aarch64目录下
官网:https://www.kernel.org/
清理源码目录:
#清除编译过程中产生的所有临时文件 sudo make mrproper #清理上一次产生的编译文件 sudo make cleanmybuild-kernel.sh :
#!/bin/bash export CROSS_COMPILE=aarch64-linux-gnu- export ARCH=arm64 echo "CROSS_COMPILE = "$CROSS_COMPILE echo "ARCH = "$ARCH make O=$(pwd)/out_aarch64 defconfig make O=$(pwd)/out_aarch64 menuconfig make O=$(pwd)/out_aarch64 -j24执行脚本编译内核,(输出目录在out_aarch64下)
sudo chmod 777 mybuild-kernel.sh ./mybuild-kernel.sh查看文件scripts/sign-file.c ,里面依赖 openssl库
#include <openssl/opensslv.h> #include <openssl/bio.h> #include <openssl/evp.h> #include <openssl/pem.h> #include <openssl/err.h> #include <openssl/engine.h>我们之前安装了libssl-dev openssl ,但是编译时候没有找到,查看编译scripts目录下的Makefile : 有如下配置:
HOSTLDLIBS_sign-file = -lcrypto HOSTLDLIBS_extract-cert = -lcrypto这是编译 sign-file 依赖crypto库
终端输入命令 pkg-config --list-all |grep crypto 查看 然后输入命令: pkg-config --libs libcrypto 输出: -L/usr/local/lib -lcrypto 把这句话,复制替换scripts目录下的Makefile :
HOSTLDLIBS_sign-file = -L/usr/local/lib -lcrypto HOSTLDLIBS_extract-cert = -L/usr/local/lib -lcrypto重新执行 make 命令,成功解决。 注意:如果没有安装crypto库,用命令安装apt-get install libcrypto
hello.c 代码如下:
#include <stdio.h> int main( ) { printf("\033[0m -----------------------------------------\n"); printf("\033[31m cross compile aarch64 target app !\n"); printf("\033[31m Hello world!\n"); printf("\033[0m -----------------------------------------\n"); //--刷新输出,不然不显示 fflush(stdout); return 0; }编译:
aarch64-linux-gnu-gcc -static -o hello hello.c制作为cpio格式内核初始化文件:
echo hello | cpio -o --format=newc > initramfs在目录linux-5.3.7/out_aarch64/arch/arm64/boot/ 的 Image文件 与 initramfs 放在同一个文件夹下:
结果输出: 看到内核版本:Linux version 5.3.7 (wmx@wmx-ubuntu) (gcc version 7.4.1 看到我们刚刚测试的内核初始化代码:hello.c的输出: