通过qemu和docker搭建检查编译环境

发布时间 2023-07-27 09:22:29作者: 摩斯电码

背景

在工作中我们经常需要交叉编译一些可执行程序或者动态库,有时要编译的程序过于复杂,如果靠纯的交叉编译,费事又费力,需要解决大量的编译依赖以及报错。

解决方案 docker + qemu-user

qemu-user提供可以运行不同架构的用户态程序的方案,而docker可以帮我们搭建一个运行qemu-user的环境。

步骤

下面以在x86_64上编译一个给ARM64用的可执行程序的例子。

安装qemu-user

sudo apt install qemu-user-static

下载目标架构的docker镜像

以ubuntu为例,从这个链接中可以找到支持的不同架构的ubuntu镜像,或者从这里可以看到更多的信息。
image

  • 安装
sudo docker pull arm64v8/ubuntu

运行容器

$ docker run -it -d -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static arm64v8/ubuntu:latest
$ docker ps
CONTAINER ID   IMAGE                   COMMAND       CREATED         STATUS         PORTS     NAMES
206e91129cb4   arm64v8/ubuntu:latest   "/bin/bash"   2 seconds ago   Up 2 seconds             eager_northcutt

进入容器

docker exec -it 206e91129cb4 /bin/bash

安装必要的软件包

更新软件

root@206e91129cb4:/# apt update
Get:1 http://ports.ubuntu.com/ubuntu-ports jammy InRelease [270 kB]
Get:2 http://ports.ubuntu.com/ubuntu-ports jammy-updates InRelease [119 kB]
Get:3 http://ports.ubuntu.com/ubuntu-ports jammy-backports InRelease [108 kB]
Get:4 http://ports.ubuntu.com/ubuntu-ports jammy-security InRelease [110 kB]
Get:5 http://ports.ubuntu.com/ubuntu-ports jammy/multiverse arm64 Packages [224 kB]
Get:6 http://ports.ubuntu.com/ubuntu-ports jammy/universe arm64 Packages [17.2 MB]
Get:7 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 Packages [1758 kB]
Get:8 http://ports.ubuntu.com/ubuntu-ports jammy/restricted arm64 Packages [24.2 kB]
Get:9 http://ports.ubuntu.com/ubuntu-ports jammy-updates/universe arm64 Packages [1096 kB]
Get:10 http://ports.ubuntu.com/ubuntu-ports jammy-updates/restricted arm64 Packages [514 kB]
Get:11 http://ports.ubuntu.com/ubuntu-ports jammy-updates/multiverse arm64 Packages [27.8 kB]
Get:12 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 Packages [973 kB]
Get:13 http://ports.ubuntu.com/ubuntu-ports jammy-backports/universe arm64 Packages [23.6 kB]
Get:14 http://ports.ubuntu.com/ubuntu-ports jammy-backports/main arm64 Packages [49.0 kB]
Get:15 http://ports.ubuntu.com/ubuntu-ports jammy-security/main arm64 Packages [695 kB]
Get:16 http://ports.ubuntu.com/ubuntu-ports jammy-security/multiverse arm64 Packages [23.4 kB]
Get:17 http://ports.ubuntu.com/ubuntu-ports jammy-security/universe arm64 Packages [846 kB]
Get:18 http://ports.ubuntu.com/ubuntu-ports jammy-security/restricted arm64 Packages [513 kB]
Fetched 24.6 MB in 18s (1375 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

安装编译器

root@206e91129cb4:/# apt install build-essential

编译的软件包

root@206e91129cb4:~# cd stressapptest-1.0.9
root@206e91129cb4:~/stressapptest-1.0.9# LDFLAGS=--static ./configure
root@206e91129cb4:~/stressapptest-1.0.9# make

完。