交叉编译linux内核5.3.7,制作initramfs,使用qemu测试

mac2024-05-28  54

文章目录

主机安装编译内核的依赖:配置下载内核编译内核代码图像化配置.config界面,配置内核选项1命令编译内核2 使用脚本编译内核遇到问题 使用qemu测试1 制作ram初始化文件2 把生成的内核拷贝到当前目录:3 qemu启动内核:

主机安装编译内核的依赖:

sudo apt-get install libncurses5-dev libssl-dev \ build-essential openssl \ zlibc minizip \ libidn11-dev libidn11 libelf-dev bc

配置

1 配置交叉编译器  参考我的这篇文章:交叉编译openssl到aarch642 配置交叉编译器前缀 export CROSS_COMPILE=aarch64-linux-gnu- 3 配置目标平台架构 export ARCH=arm64 4 配置编译输出目录, make使用o=/out_path 参数 例如: make O=$(pwd)/out_aarch64

生成的目录在out_aarch64目录下

下载内核

官网:https://www.kernel.org/

编译内核代码

清理源码目录:

#清除编译过程中产生的所有临时文件 sudo make mrproper #清理上一次产生的编译文件 sudo make clean

图像化配置.config界面,配置内核选项

sudo make menuconfig

1命令编译内核

输入命令make或者使用-j参数,多线程编译:  make -j# 如make -j12,使用12线程编译

2 使用脚本编译内核

mybuild-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

遇到问题

1 scripts/Makefile.host:90: recipe for target 'scripts/sign-file' failed 对‘OPENSSL_init_crypto’未定义的引用 /tmp/ccPH3fx1.o:在函数‘main’中: extract-cert.c:(.text.startup+0x25):对‘OPENSSL_init_crypto’未定义的引用 extract-cert.c:(.text.startup+0x31):对‘OPENSSL_init_crypto’未定义的引用 collect2: error: ld returned 1 exit status scripts/Makefile.host:90: recipe for target 'scripts/extract-cert' failed make[1]: *** [scripts/extract-cert] Error 1 make[1]: *** 正在等待未完成的任务.... /tmp/ccJdcNg2.o:在函数‘main’中: sign-file.c:(.text.startup+0x53):对‘OPENSSL_init_crypto’未定义的引用 sign-file.c:(.text.startup+0x5f):对‘OPENSSL_init_crypto’未定义的引用 sign-file.c:(.text.startup+0x76b):对‘OPENSSL_init_crypto’未定义的引用 collect2: error: ld returned 1 exit status scripts/Makefile.host:90: recipe for target 'scripts/sign-file' failed make[1]: *** [scripts/sign-file] Error 1 Makefile:1099: recipe for target 'scripts' failed make: *** [scripts] Error 2 make: *** 正在等待未完成的任务....

查看文件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

使用qemu测试

1 制作ram初始化文件

gedit hello.c

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

2 把生成的内核拷贝到当前目录:

在目录linux-5.3.7/out_aarch64/arch/arm64/boot/ 的 Image文件 与 initramfs 放在同一个文件夹下:

3 qemu启动内核:

qemu-system-aarch64 -m 1024 \ -cpu cortex-a57 \ -smp 1 \ -M virt \ -initrd initramfs \ -kernel Image \ -append "root=/dev/ram rdinit=/hello console=ttyAMA0" \ -nographic

结果输出: 看到内核版本:Linux version 5.3.7 (wmx@wmx-ubuntu) (gcc version 7.4.1 看到我们刚刚测试的内核初始化代码:hello.c的输出:

最新回复(0)