安裝busybox
參考博客:
使用GDB+QEMU調試Linux內核環境搭建
一文教你如何使用GDB+Qemu調試Linux內核
ubuntu22.04搭建qemu環境測試內核
交叉編譯busybox
編譯busybox出現Library m is needed, can’t exclude it (yet)的解釋
S3C2440 制作最新busybox文件系統
https://www.busybox.net/是官網。
sudo wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
下載源代碼。
sudo tar jxvf busybox-1.36.1.tar.bz2
解壓源文件。
cd busybox-1.36.1
進入源代碼目錄里邊。
執行make menuconfig
發現報錯:
Command 'make' not found, but can be installed with:sudo apt install make
sudo apt install make-guile
使用sudo apt install make
安裝make,發現報錯如下:
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
使用sudo rm -rf /var/lib/dpkg/lock-frontend
刪除lock-frontend
,然后再使用sudo apt install make
安裝make
,發現正常安裝。
sudo apt install -y gcc g++ libncurses5-dev
安裝依賴包。
安裝完成如下圖:
sudo make menuconfig
進行配置。
使用上下鍵可以選擇,選擇“Setting”之后,按回車鍵。
進入到下一個選擇時,使用上下鍵找一下“Build static binary (no shared libs)
”。
然后按一下y就是選擇上了。
按一下Esc鍵就可以退回到上一層。
按一下Esc鍵就可以退回到保存界面。
選擇“yes”按一下Enter鍵,就退到原來的命令行下。
sudo make -j2
進行編譯。
完成之后提示如下:
Static linking against glibc, can't use --gc-sections
Trying libraries: crypt m resolv rtLibrary crypt is not needed, excluding itLibrary m is needed, can't exclude it (yet)Library resolv is needed, can't exclude it (yet)Library rt is not needed, excluding itLibrary m is needed, can't exclude it (yet)Library resolv is needed, can't exclude it (yet)
Final link with: m resolv
sudo make install
進行安裝。
完成之后,提示:
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
啟動內存文件系統制作
cd _install
進入到特定目錄里邊。
sudo mkdir proc sys
新建兩個目錄proc
和sys
sudo vim init
把下邊的內容寫進去:
#!/bin/sh
echo "{==DBG==} INIT SCRIPT"
mkdir /tmp
mount -t proc none /proc
mount -t sysfs none /sys
mount -t debugfs none /sys/kernel/debug
mount -t tmpfs none /tmpmdev -s
echo -e "{==DBG==} Boot took $(cut -d' ' -f1 /proc/uptime) seconds"# normal user
setsid /bin/cttyhack setuidgid 1000 /bin/sh
sudo chmod +x init
為當前用戶添加上可執行的權限。
sudo chmod -R 777 .
給當前目錄中所有的文件配上讀寫執行的權限。
sudo find . | sudo cpio -o --format=newc > ./rootfs.img
生成rootfs.img
文件。
生成Linux內核
cd ~/
進入到home
目錄里邊。
sudo wget http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/linux-5.19.tar.xz
下載源代碼。
sudo tar xf linux-5.19.tar.xz
解壓源代碼,時間有點長,需要等待。
cd linux-5.19/
進入到源碼里邊。
sudo make menuconfig
,發現報錯:
/bin/sh: 1: flex: not found
scripts/Makefile.host:9: recipe for target 'scripts/kconfig/lexer.lex.c' failed
make[1]: *** [scripts/kconfig/lexer.lex.c] Error 127
Makefile:629: recipe for target 'menuconfig' failed
make: *** [menuconfig] Error 2
sudo apt-get install -y flex bison
安裝依賴包。
sudo make menuconfig
進行配置選擇。
上下鍵可以進行選項尋找,按回車鍵可以進入,找到Kernel hacking
進入。
使用下鍵找到Compile-time checks and compiler options
,然后按回車鍵。
發現Provide GDB scripts for kernel debugging
已經默認選上了。
按兩下Esc
按兩下Esc
按兩下Esc
選擇yes按一下回車鍵。
grep CONFIG_DEBUG_INFO .config
驗證一下,選擇是否正確。
sudo sed -i 's/CONFIG_MODULE_SIG=y/CONFIG_MODULE_SIG=n/g' .config # 把 CONFIG_MODULE_SIG=y 替換成 CONFIG_MODULE_SIG=n
sudo sed -i 's/CONFIG_MODULE_SIG_ALL=y/CONFIG_MODULE_SIG_ALL=n/g' .config
sudo sed -i 's/CONFIG_SYSTEM_TRUSTED_KEYS="debian\/canonical-certs.pem"/CONFIG_SYSTEM_TRUSTED_KEYS=""/g' .config
sudo sed -i 's/CONFIG_SYSTEM_REVOCATION_KEYS="debian\/canonical-revoked-certs.pem"/CONFIG_SYSTEM_REVOCATION_KEYS=""/g' .config
sudo sed -i 's/CONFIG_SYSTEM_TRUSTED_KEYRING=y/CONFIG_SYSTEM_TRUSTED_KEYRING=n/g' .config # 把 CONFIG_SYSTEM_TRUSTED_KEYRING=y 替換成 CONFIG_SYSTEM_TRUSTED_KEYRING=n
cat .config | grep "CONFIG_SYSTEM_TRUSTED_KEYRING=n" # 看一下 CONFIG_SYSTEM_TRUSTED_KEYRING 相關字符串是否成功替換。
nproc
看一下當前系統核數。
sudo make -j2
開始編譯
發現報錯:
/home/ubuntu1804/linux-5.19/tools/objtool/include/objtool/elf.h:10:10: fatal err or: gelf.h: No such file or directory#include <gelf.h>^~~~~~~~
compilation terminated.
/home/ubuntu1804/linux-5.19/tools/build/Makefile.build:96: recipe for target '/h ome/ubuntu1804/linux-5.19/tools/objtool/arch/x86/special.o' failed
make[4]: *** [/home/ubuntu1804/linux-5.19/tools/objtool/arch/x86/special.o] Erro r 1
/home/ubuntu1804/linux-5.19/tools/build/Makefile.build:139: recipe for target 'a rch/x86' failed
make[3]: *** [arch/x86] Error 2
Makefile:53: recipe for target '/home/ubuntu1804/linux-5.19/tools/objtool/objtoo l-in.o' failed
make[2]: *** [/home/ubuntu1804/linux-5.19/tools/objtool/objtool-in.o] Error 2
Makefile:73: recipe for target 'objtool' failed
make[1]: *** [objtool] Error 2
Makefile:1343: recipe for target 'tools/objtool' failed
make: *** [tools/objtool] Error 2
make: *** Waiting for unfinished jobs....HOSTCC scripts/sorttableHOSTCC scripts/asn1_compilerHOSTCC scripts/sign-fileHOSTCC scripts/insert-sys-cert
scripts/sign-file.c:25:10: fatal error: openssl/opensslv.h: No such file or dire ctory#include <openssl/opensslv.h>^~~~~~~~~~~~~~~~~~~~
compilation terminated.
sudo apt-get install -y apt-file
安裝apt-file
。
sudo apt-file search gelf.h
,提示 The cache is empty. You need to run "apt update" first.
,然后執行sudo apt update
。
sudo apt-file search gelf.h
找了許久,才找到。
我看還不如直接上網搜索比較快,sudo apt-get install -y libelf-dev libssl-dev
安裝依賴包。
sudo make -j2
編譯
報錯如下:
make[3]: *** [drivers/net/bonding/bond_3ad.o] Error 1
make[3]: *** Waiting for unfinished jobs....
drivers/net/bonding/bond_main.c:6373:1: fatal error: error writing to /tmp/ccqoYlgl.s: No space left on deviceMODULE_AUTHOR("Thomas Davis, tadavis@lbl.gov and many others");^~~~~~~~~~~~~
compilation terminated.
scripts/Makefile.build:249: recipe for target 'drivers/net/bonding/bond_main.o' failed
make[3]: *** [drivers/net/bonding/bond_main.o] Error 1
scripts/Makefile.build:466: recipe for target 'drivers/net/bonding' failed
make[2]: *** [drivers/net/bonding] Error 2
scripts/Makefile.build:466: recipe for target 'drivers/net' failed
make[1]: *** [drivers/net] Error 2
Makefile:1843: recipe for target 'drivers' failed
make: *** [drivers] Error 2
sudo rm -rf /tmp
刪除/tmp
里邊的內容。
然后再次執行sudo make -j2
編譯,這次發現是整個Ubuntu系統磁盤滿了,開機之后再也無法進入Ubuntu了,所以只能進入到grub中recover模式刪除原先編譯好的文件,才能進入到系統。然后使用vmware擴展磁盤大小,然后再進行掛載。
sudo make menuconfig
進行配置選擇。
已經默認選擇上了。
重新配置一些參數。
sudo sed -i 's/CONFIG_MODULE_SIG=y/CONFIG_MODULE_SIG=n/g' .config # 把 CONFIG_MODULE_SIG=y 替換成 CONFIG_MODULE_SIG=n
sudo sed -i 's/CONFIG_MODULE_SIG_ALL=y/CONFIG_MODULE_SIG_ALL=n/g' .config
sudo sed -i 's/CONFIG_SYSTEM_TRUSTED_KEYS="debian\/canonical-certs.pem"/CONFIG_SYSTEM_TRUSTED_KEYS=""/g' .config
sudo sed -i 's/CONFIG_SYSTEM_REVOCATION_KEYS="debian\/canonical-revoked-certs.pem"/CONFIG_SYSTEM_REVOCATION_KEYS=""/g' .config
sudo sed -i 's/CONFIG_SYSTEM_TRUSTED_KEYRING=y/CONFIG_SYSTEM_TRUSTED_KEYRING=n/g' .config # 把 CONFIG_SYSTEM_TRUSTED_KEYRING=y 替換成 CONFIG_SYSTEM_TRUSTED_KEYRING=n
cat .config | grep "CONFIG_SYSTEM_TRUSTED_KEYRING=n" # 看一下 CONFIG_SYSTEM_TRUSTED_KEYRING 相關字符串是否成功替換。
sudo make -j2
發現報錯如下:
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF
Makefile:1164: recipe for target 'vmlinux' failed
make: *** [vmlinux] Error 1
sudo apt-get install -y dwarves
安裝dwarves
。
sudo make -j2
再次執行。
完成之后如下:
ls -hl vmlinux
可以看到生成的vmlinux
文件信息。
ls -hl ./arch/x86/boot/bzImage
可以看到生成的bzImage
文件信息。
安裝Qmeu并開始調試
sudo apt install -y qemu qemu-utils qemu-kvm virt-manager libvirt-daemon-system libvirt-clients bridge-utils
安裝依賴包。
sudo cp ~/busybox-1.36.1/_install/rootfs.img /mountsda4/linux-5.19/
將rootfs.img
移動到源代碼目錄下。
sudo qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -initrd ./rootfs.img -append "nokaslr console=ttyS0" -s -S -nographic
,可以看到停留在啟動處。
再打開一個命令行,稱之為B終端
,cd /mountsda4/linux-5.19
進入到vmlinux
文件所在的目錄下,然后執行sudo gdb vmlinux
,就可以進入到gdb
測試界面。
之后輸入target remote localhost:1234
連接上測試端口。
之后的測試就需要使用gdb
測試里邊的知識了。