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 可以用
如何使用
通過 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 檢視,預設情況下會自動完成網路配置,各埠互通。