arm-linux-gcc交叉編譯容器 centos7 環境

直接使用 arm-linux-gcc交叉編譯容器 centos7 環境

docker run -tdi -p 50000:22 --name armlinuxgcc --privileged=true  registry.cn-hangzhou.aliyuncs.com/mkmk/centos:armlinuxgcc init 
進入容器後輸入 
arm-linux-gcc -v
如果找不到命令。先輸入
source /etc/profile
 
 再次輸入 版本查看
 arm-linux-gcc -v
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /opt/FriendlyARM/mini2440/build-toolschain/working/src/gcc-4.4.3/configure --build=i386-build_redhat-linux-gnu --host=i386-build_redhat-linux-gnu --target=arm-none-linux-gnueabi --prefix=/opt/FriendlyARM/toolschain/4.4.3 --with-sysroot=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --enable-languages=c,c++ --disable-multilib --with-arch=armv4t --with-cpu=arm920t --with-tune=arm920t --with-float=soft --with-pkgversion=ctng-1.6.1 --disable-sjlj-exceptions --enable-__cxa_atexit --with-gmp=/opt/FriendlyARM/toolschain/4.4.3 --with-mpfr=/opt/FriendlyARM/toolschain/4.4.3 --with-ppl=/opt/FriendlyARM/toolschain/4.4.3 --with-cloog=/opt/FriendlyARM/toolschain/4.4.3 --with-mpc=/opt/FriendlyARM/toolschain/4.4.3 --with-local-prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-c99 --enable-long-long --enable-target-optspace
Thread model: posix
gcc version 4.4.3 (ctng-1.6.1)

這就是交叉編譯器的創建過程
請自行百度 arm-linux-gcc 的使用,來進一步學習如何編譯
如果你不關心容器的構建過程,下邊的都不用看了。

arm-linux-gcc-4.4.3 下載路徑

http://112.124.9.243/arm9net/mini2440/linux/arm-linux-gcc-4.4.3-20100728.tar.gz

構建交叉編譯容器

創建空白centos7

docker run -tdi -p 50000:22 --name armlinuxgcc --privileged=true  registry.cn-hangzhou.aliyuncs.com/mkmk/centos:ssh init 

上傳壓縮包到 /home目錄

解壓

cd /home
tar -zxvf arm-linux-gcc-4.4.3-20100728.tar.gz
cp -r /home/opt/FriendlyARM/toolschain/4.4.3  /usr/local/arm

配置環境變量

vi /etc/profile
末尾添加
export PATH=$PATH:/usr/local/arm/bin
source /etc/profile
使用
arm-linux-gcc  -v
-linux-gnueabi-gcc: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

報錯
ia32-libs is missing for x86_64 platform.

缺乏 32 兼容環境

yum install epel-release
yum install glibc.i686

查看版本

arm-linux-gcc -v
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /opt/FriendlyARM/mini2440/build-toolschain/working/src/gcc-4.4.3/configure --build=i386-build_redhat-linux-gnu --host=i386-build_redhat-linux-gnu --target=arm-none-linux-gnueabi --prefix=/opt/FriendlyARM/toolschain/4.4.3 --with-sysroot=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --enable-languages=c,c++ --disable-multilib --with-arch=armv4t --with-cpu=arm920t --with-tune=arm920t --with-float=soft --with-pkgversion=ctng-1.6.1 --disable-sjlj-exceptions --enable-__cxa_atexit --with-gmp=/opt/FriendlyARM/toolschain/4.4.3 --with-mpfr=/opt/FriendlyARM/toolschain/4.4.3 --with-ppl=/opt/FriendlyARM/toolschain/4.4.3 --with-cloog=/opt/FriendlyARM/toolschain/4.4.3 --with-mpc=/opt/FriendlyARM/toolschain/4.4.3 --with-local-prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-c99 --enable-long-long --enable-target-optspace
Thread model: posix
gcc version 4.4.3 (ctng-1.6.1) 

簡單使用

我們在/home 下新建簡單代碼文件

#include"stdio.h"
int main(){
printf("hello arm\n");
}

先編譯生成 x86 的執行問文件

gcc helloArm.c -o hellox86
執行查看效果
./hellox86 
hello arm
arm-linux-gcc helloArm.c -o helloarm
報錯  找不到 libstdc++.so.6
 yum whatprovides libstdc++.so.6
 libstdc++-4.8.5-39.el7.i686 : GNU Standard C++ Library

安裝依賴
yum install libstdc++-4.8.5-39.el7.i686

arm-linux-gcc helloArm.c -o helloarm
執行
 ./helloarm 
-bash: ./helloarm: cannot execute binary file

使用arm容器

配置qemu 依賴

https://blog.csdn.net/xiang_freedom/article/details/92724299

下載上傳
https://github.com/multiarch/qemu-user-static/releases

/usr/bin/qemu-aarch64-static
/usr/bin/qemu-arm-static
到宿主機的/usr/bin 目錄下

chmod 777 /usr/bin/qemu-aarch64-static
chmod 777 /usr/bin/qemu-arm-static

拖取arm 容器

指定 docker 參數

docker run --rm --privileged multiarch/qemu-user-static:register
docker run -it -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static  -p 51000:22 --name arm64   arm64v8/ubuntu 

docker run -it -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static  -p 51000:22 --name arm32   arm32v7/ubuntu 

把我們之前的編譯的文件放到這裏 /home

直接運行 
/home/helloarm
./helloarm: No such file or directory
這裏並不是說找不到可執行文件,而是找不到
執行文件中的依賴

回到宿主機
宿主機執行  readelf -a helloarm 
 [Requesting program interpreter: /lib/ld-linux.so.3]


目標安裝依賴

把目標機缺少的 /lib 安裝一下就好了

把宿主機 /usr/local/arm/arm-none-linux-gnueabi/lib
內容拷貝到 目標機 /lib
宿主機

cd /usr/local/arm/arm-none-linux-gnueabi/lib
tar -cvf lib2.tar *

目標機

cd lib
tar -xvf lib2.tar

arm64 換源

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe

成功在目標機執行arm代碼

配置目標機

把宿主機 /usr/local/arm/arm-none-linux-gnueabi/lib
內容拷貝到 目標機 /lib
宿主機

cd /usr/local/arm/arm-none-linux-gnueabi/lib
tar -cvf lib2.tar *

目標機

cd lib
tar -xvf lib2.tar

配置好的目標機鏡像

registry.cn-hangzhou.aliyuncs.com/mkmk/ubuntu:arm32

docker run -it -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static   --name arm32   registry.cn-hangzhou.aliyuncs.com/mkmk/ubuntu:arm32 

進入目標機後執行

/lib/helloarm
輸出 :hello arm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章