linux 在 docker 编译 arm 应用

在 docker 编译 arm 应用

正常情况下 docker 是不能启动与宿主机不同架构的服务,此时要启动 arm 架构的环境,就需要提供 qemu 虚拟机的服务支持。

关于这个 qemu 能否使用可以自行查阅。

这将极大的方便我们在 x86 机器直接进行编译和测试 arm 的程序,测试完成后再将其送入 V831 硬件。

如何安装

看这个 如何在x86架构下进行ARM镜像的构建与运行 使用 alpine 版。

使用 alpine 的好处在于 apk 安装的软件版都可以迁移到 V831 上直接使用。

alpine 常用方法

  • apk update
  • apk add xxx

关于 Debian 可以用 Debian + QEMU + ARM64 (aarch64) 仓库。

如何使用

通过 run 创建容器名为 armv7 的镜像,则需要执行如下几条命令启动:

  • docker run --rm --privileged multiarch/qemu-user-static --reset --persistent yes
  • docker start armv7 (start/stop/restart/stats)
  • docker exec -it armv7 sh

在容器中的编译和开发注意事项。

  • 如果发现运行某个程序报错,先用 ldd 查缺少的依赖函数,分析本地与目标的依赖库差异,最底层的两个基础库多为 libc.so 和 libc++.so 提供的函数差异。
  • 如何定位和分析程序缺少的依赖函数,我们可以通过 nm -D 查看缺少的函数被哪个 so 所提供,然后具体跟踪即可(注意 V831 上还未加入 nm 命令)。

举个例子,V831 中的程序通常编译为 32 位版本,这就会缺少 time64 等一系列和 64位 时间有关的函数。

所以在 docker armv7 编译的 micropython 要先设置为 -mbe32 ,并且补充缺少的 libffi.so 和更新相应的 ld-musl-armhf.so 依赖库,注意 V831 中 ld-musl-armhf.so 是一个文件链接,它最终链接到 libc.so 所以我们可以直接先 cp ld-musl-armhf.so ld-musl-armhf.so.bak 后再覆盖即可。

此时 micropython 就可以启动了。

容器导入导出

关键词 docker save 和 import 。

容器与宿主机的文件传输

可以用 docker cp 传输文件 docker cp armv7:/usr/lib/ /home/test/

也可以直接在 run 的时候 -v 指定目录的挂载,如下示例将宿主机的 data 目录挂载到容器根目录下。

docker run --name armv7 -i -t -v /home/juwan:/data:rw forumi0721alpinearmhf/alpine-armhf-glibc

容器与宿主机的网络配置

可以通过 docker network 查看,默认情况下会自动完成网络配置,各端口互通。

posted @ 2020-12-23 11:24  Juwan  阅读(2165)  评论(0编辑  收藏  举报