0x001 前言
IoT设备固件的调试环境搭建坑比较多,发现网上还没有比较完善的各架构的调试环境的入门贴,于是就有了这篇文章,希望能方便到刚上手的新人吧。本文只是该教程的第一篇,因篇章过长不得不分开,整个教程会包含ARM、MIPS、x86、x64等等qemu调试环境的搭建。
0x002 AArch64
主机:Ubuntu 16.04 LST(可以是VM里跑的虚拟系统,也可以用真实机器)
虚拟机版本:qemu 2.8.0
Linux内核版本:4.10
BusyBox版本:1.24.2
交叉编译工具链:gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux
gdb版本:7.11.1
根文件系统:aarch64_rootfs.tar
以上工具已经打包好,下载地址如下。
链接:
https://pan.baidu.com/s/1MVZhhTlhrNQH9KkvqFLSMw
密码:
bzmx
先安装这些包:
$ sudo apt-get install libcap-dev
$
sudo apt-get install libpixman-1-dev
$
apt-get install libncurses5-dev
$
sudo apt-get install libasound2-dev libasound2
$
sudo apt-get install libglib2.0-dev
$
sudo apt install u-boot-tools
编译qemu
$ tar -xf qemu-2.8.0.tar.xz
$
cd qemu-2.8.0
$
mkdir build
$
cd build
$
../configure --target-list=arm-softmmu,aarch64-softmmu,mips-softmmu,mipsel-softmmu,i386-softmmu,x86_64-softmmu,arm-linux-user,aarch64-linux-user,i386-linux-user,x86_64-linux-user,mips-linux-user,mipsel-linux-user --audio-drv-list=alsa --enable-virtfs
$
make -j8
$
sudo make install
配置linux内核选项
$ tar -xf linux-4.10.tar.xz
$
cross_compile=/root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-
$
make CROSS_COMPILE=$cross_compile ARCH=arm64 O=./out_aarch64 defconfig
$
sudo gedit .config
#
CONFIG 9P
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_NET_9P_DEBUG=y
CONFIG_9P_FS=y
CONFIG_9P_FS_POSIX_ACL=y
CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y
#
CONFIG PCI and virtio
CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y
CONFIG_PCI_HOST_GENERIC=y
$
make CROSS_COMPILE=$cross_compile ARCH=arm64 O=./out_aarch64 menuconfig
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Device Drivers --->
[*] Block devices --->
<*> RAM block device support
(65536) Default RAM disk size (kbytes)
编译
$ make CROSS_COMPILE=$cross_compile ARCH=arm64 O=./out_aarch64 Image -j4
制作根文件系统
$ tar -xjvf busybox-1.24.2.tar.bz2
$
make menuconfig
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
(/root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-)Cross Compiler prefix
$
make && make install
修改根文件系统,添加开机自启动挂载共享文件。
$ sudo gedit ./etc/init.d/rcS
mkdir /nfsroot
mount -t 9p -o trans=virtio,version=9p2000.L hostshare /nfsroot
因为采用9p的方式挂载共享文件,必须在编译内核和qemu时添加9p支持
制作启动用的ramdisk,注意修改交叉编译链的路径。
$ tar -xzvf aarch64_ramdisk_rootfs.tar.gz
# mk_ramdisk.sh
#!/bin/bash
sudo rm -rf rootfs
sudo rm -rf tmpfs
sudo rm -rf ramdisk*
sudo mkdir rootfs
sudo cp ../busybox-1.24.2/_install/* rootfs/ -raf
sudo mkdir -p rootfs/proc/
sudo mkdir -p rootfs/sys/
sudo mkdir -p rootfs/tmp/
sudo mkdir -p rootfs/root/
sudo mkdir -p rootfs/var/
sudo mkdir -p rootfs/mnt/
sudo cp etc rootfs/ -arf
sudo mkdir -p rootfs/lib
sudo cp -arf /root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/aarch64-linux-gnu/libc/lib/aarch64-linux-gnu/* rootfs/lib/
sudo rm rootfs/lib/*.a
sudo /root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-strip rootfs/lib/*
sudo mkdir -p rootfs/dev/
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3
sudo dd if=/dev/zero of=ramdisk bs=1M count=16
sudo mkfs.ext4 -F ramdisk
sudo mkdir -p tmpfs
sudo mount -t ext4 ramdisk ./tmpfs/ -o loop
sudo cp -raf rootfs/* tmpfs/
sudo umount tmpfs
sudo gzip --best -c ramdisk > ramdisk.gz
sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
主机安装网络配置工具
$ sudo apt-get install uml-utilities
$
sudo apt-get install bridge-utils
在主机中查看/dev/net/tun文件
$ ls -l /dev/net/tun
crw-rw-rw- 1 root root 10, 200 Feb 27 03:36 /dev/net/tun
修改主机/etc/network/interfaces文件
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
auto br0
iface br0 inet dhcp
bridge_ports eth0
为了方便请参考该文章把ens33网卡名改成eth0。
ubuntu修改ens33网卡名为eth0。
添加/etc/qemu-ifup
#!/bin/sh
echo sudo tunctl -u $(id -un) -t $1
sudo tunctl -u $(id -un) -t $1
echo sudo ifconfig $1 0.0.0.0 promisc up
sudo ifconfig $1 0.0.0.0 promisc up
echo sudo brctl addif br0 $1
sudo brctl addif br0 $1
echo brctl show
brctl show
sudo ifconfig br0 192.168.1.156# 这里需要查看Ubuntu dhcp方式分配的ip,并与该ip保持一致,否则qemu起来后主机会连不上外部网络
添加/etc/qemu-ifdown
#!/bin/sh
echo sudo brctl delif br0 $1
sudo brctl delif br0 $1
echo sudo tunctl -d $1
sudo tunctl -d $1
echo brctl show
brctl show
ifdown br0
ifup br0
添加可执行权限
$ chmod +x /etc/qemu-ifup
$
chmod +x /etc/qemu-ifdown
重启网卡
$ sudo /etc/init.d/networking restart
运行
# run.sh
sudo qemu-system-aarch64 \
-M virt \
-cpu cortex-a53 \
-smp 2 \
-m 4096M \
-kernel ./Image \
-nographic \
-append "root=/dev/ram0 rw rootfstype=ext4 console=ttyAMA0 init=/linuxrc ignore_loglevel" \
-initrd ./ramdisk.img \
-fsdev local,security_model=passthrough,id=fsdev0,path=/nfsroot \
-device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare \
-net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
-redir tcp:2333::2333
设置Vmware虚拟机网络
测试能双向ping通
qemu起来后,ip不一定能分配到,而且这是精简内核,没有interfaces这文件,可以通过这条命令设置一下ip。
ifconfig eth0 192.168.1.20
编译gdb-7.11.1
$ CC="/root/toolchain/gcc/aarch64/bin/aarch64-linux-gnu-gcc" CXX="/root/toolchain/gcc/aarch64/bin/aarch64-linux-gnu-g++" ./configure --target=aarch64-linux-gnu --host="aarch64-linux-gnu" --prefix="/root/toolchain/gdb/gdb-7.11.1/gdb/gdbserver/out_aarch64"
$
make install
交叉编译测试例程
$ mkdir build && cd build
$ nano hello.c
#include <stdio.h>
int main()
{
printf("hello\n");
return 0;
}
$ ./arm-none-linux-gnueabi-gcc -g hello.c -o hello_aarch64 -static
编译好的gdbserver与测试例程拷贝到虚拟机共享文件,执行。
$ ./gdbserver-aarch64 0.0.0.0:2333 ./hello_aarch64
gdbserver报错,原因是没有编译静态文件。
-/bin/sh: ./gdbserver-aarch64: not found
修改gdbserver的Makefile,添加-static参数,再次编译。
客户机执行
$ ./gdbserver-aarch64 0.0.0.0:2333 ./hello_aarch64
主机中执行
$ gdb-multiarch
gef➤ set architecture aarch64
The target architecture is assumed to be aarch64
gef➤ gef-remote -q 192.168.1.20:2333
gef工具的安装可以参考这篇:
《ARM汇编基础教程番外篇——配置实验环境》(点击即可阅读)
至此,AArch64调试环境已经搭建好了,不知不觉已经写了这么多。本来打算将AArch32也放一起的,看来只能放在下篇了。
原文作者:wooyoung
原文链接:https://bbs.pediy.com/thread-229581.htm
转载请注明:转自看雪学院
更多阅读:
网友评论