1. 程式人生 > 其它 >Ubuntu18.04 LTS x64 構建ARM交叉編譯環境(嘗試,但失敗了!!!估計是編譯器沒選對)

Ubuntu18.04 LTS x64 構建ARM交叉編譯環境(嘗試,但失敗了!!!估計是編譯器沒選對)

【測試而已,由於需要了解編譯器和處理器體系,因此先放棄該方法】

動機

入門嵌入式開發,又需要 Windows 又需要 Linux,但資料給的竟然是 Ubuntu9,導致我不能使用 VSCode Remote SSH 來遠端開發。
所以決定自己配置ARM交叉編譯環境

虛擬機器環境配置

Ubuntu18.04 x64 LTS Desktop: 從UTSC Mirror 映象源下載即可,安裝完直接換USTC的軟體源,安裝openssh-server以開啟SSH服務端,並[關閉開機自啟的圖形介面服務(https://www.jianshu.com/p/36dcf5185f01)節省資源。在VMware分配多點CPU和記憶體。

sudo systemctl set-default graphical.target    # 開啟使用者圖形介面
sudo systemctl set-default multi-user.target   # 關閉使用者圖形介面
sudo reboot

crosstool-NG(ct-ng): 作為crosstool的繼任者,接替擔任交叉編譯環境的歷史重任
Mobaxterm Home Edition: 是Windows下最好的免費遠端工具,還支援串列埠、rdp等協議

安裝 crosstool-NG

mkdir ~/ct-src
tar -Jxvf crosstool-ng-1.24.0.tar.xz -C ${HOME}/ct-src
cd $HOME/ct-src/crosstool-ng-1.24.0/
sudo apt install build-essential gawk flex libncurses-dev texinfo help2man bison byacc libtool libtool-bin curl lzip
./configure --prefix=/opt/ct-ng    #這裡prefix指的是安裝路徑
make
sudo make install
export PATH="${PATH}:/opt/ct-ng/bin"
ct-ng -v
sudo nano /etc/profile #寫入系統環境變數,即在檔案末尾增加export PATH="${PATH}:/opt/ct-ng/bin"
source /etc/profile

參考:如何在Ubuntu 18.04上安裝GCC編譯器

Shell completion
crosstool-NG comes with a shell script fragment that defines bash-compatible completion. That shell fragment is currently not installed automatically.
To install the shell script fragment, you have two options:
- install system-wide, most probably by copying ct-ng.comp into /etc/bash_completion.d/, or
- install for a single user, by copying ct-ng.comp into ${HOME}/ and sourcing this file from your ${HOME}/.bashrc.

使用ct-ng配置交叉編譯工具鏈

mkdir ct-out && cd ct-out
mkdir build src x-tools    #建立三個目錄用於後續使用
cd build
ct-ng list-samples        # 列出原始碼包的samples架構配置示例,也可手動檢視 ls ../../crosstool-ng-1.24.0/samples/
ct-ng arm-unknown-linux-gnueabi  # 也可手動複製  cp ../../crosstool-ng-1.24.0/samples/arm-unknown-linux-gnueabi/crosstool.config .config  原理是將crosstool-ng原始碼包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷貝到交叉工具鏈的輸出目錄`build`下

建立好的目錄樹如下

my@ubuntu:~/ct-out/build$ tree ~/ct-out/
~/ct-out
├── build
│ └── crosstool.config
├── src
└── x-tools

3 directories, 1 file

ct-ng menuconfig                       # 選單配置

當然如果你有別人配好的 .config 檔案,那麼直接跳過.config配置部分,直接ct-ng build就可以了

支援的架構有

my@ubuntu:~/Desktop/work-dir$ ls ../../crosstool-ng-1.24.0/samples/
aarch64-rpi3-linux-gnu
aarch64-unknown-linux-android
aarch64-unknown-linux-gnu
aarch64-unknown-linux-uclibc
alphaev56-unknown-linux-gnu
alphaev67-unknown-linux-gnu
arc-arc700-linux-uclibc
arc-multilib-elf32
arc-multilib-linux-uclibc
arm-bare_newlib_cortex_m3_nommu-eabi
arm-cortex_a15-linux-gnueabihf
arm-cortexa5-linux-uclibcgnueabihf
arm-cortex_a8-linux-gnueabi
arm-cortexa9_neon-linux-gnueabihf
armeb-unknown-eabi
armeb-unknown-linux-gnueabi
armeb-unknown-linux-uclibcgnueabi
arm-multilib-linux-uclibcgnueabi
arm-nano-eabi
arm-unknown-eabi
arm-unknown-linux-gnueabi
arm-unknown-linux-musleabi
arm-unknown-linux-uclibcgnueabi
arm-unknown-linux-uclibcgnueabihf
armv6-nommu-linux-uclibcgnueabi
armv6-rpi-linux-gnueabi
armv7-rpi2-linux-gnueabihf
armv8-rpi3-linux-gnueabihf
avr
i586-geode-linux-uclibc
i686-centos6-linux-gnu
i686-centos7-linux-gnu
i686-nptl-linux-gnu
i686-ubuntu12.04-linux-gnu
i686-ubuntu14.04-linux-gnu
i686-ubuntu16.04-linux-gnu
i686-w64-mingw32
i686-w64-mingw32,nios2-spico-elf
m68k-unknown-elf
m68k-unknown-uclinux-uclibc
mips64el-multilib-linux-uclibc
mips-ar2315-linux-gnu
mipsel-multilib-linux-gnu
mipsel-sde-elf
mipsel-unknown-linux-gnu
mips-malta-linux-gnu
mips-unknown-elf
mips-unknown-linux-uclibc
moxiebox
moxie-unknown-elf
msp430-unknown-elf
nios2-altera-linux-gnu
nios2-unknown-elf
powerpc-405-linux-gnu
powerpc64le-unknown-linux-gnu
powerpc64-multilib-linux-gnu
powerpc64-unknown-linux-gnu
powerpc-8540-linux-gnu
powerpc-860-linux-gnu
powerpc-e300c3-linux-gnu
powerpc-e500v2-linux-gnuspe
powerpc-unknown-linux-gnu
powerpc-unknown-linux-uclibc
powerpc-unknown-linux-uclibc,m68k-unknown-uclinux-uclibc
powerpc-unknown_nofpu-linux-gnu
riscv32-hifive1-elf
riscv32-unknown-elf
riscv64-unknown-elf
riscv64-unknown-linux-gnu
s390-ibm-linux-gnu
s390x-ibm-linux-gnu
samples.mk
sh-multilib-linux-gnu
sh-multilib-linux-uclibc
sh-unknown-elf
sparc64-multilib-linux-gnu
sparc-leon-linux-uclibc
sparc-unknown-linux-gnu
x86_64-centos6-linux-gnu
x86_64-centos7-linux-gnu
x86_64-multilib-linux-gnu
x86_64-multilib-linux-musl
x86_64-multilib-linux-uclibc
x86_64-multilib-linux-uclibc,moxie-unknown-moxiebox
x86_64-multilib-linux-uclibc,powerpc-unknown-elf
x86_64-ubuntu12.04-linux-gnu
x86_64-ubuntu14.04-linux-gnu
x86_64-ubuntu16.04-linux-gnu
x86_64-unknown-linux-gnu
x86_64-unknown-linux-uclibc
x86_64-w64-mingw32
x86_64-w64-mingw32,arm-cortexa9_neon-linux-gnueabihf
x86_64-w64-mingw32,x86_64-pc-linux-gnu
xtensa-fsf-elf
xtensa-fsf-linux-uclibc
my@ubuntu:~/Desktop/work-dir$

根據需要設定原始碼包路徑和交叉編譯工具鏈的安裝路徑
Paths and misc options --->

  1. 原始碼包路徑:設定Local tarballs directory為 ${HOME}/ct-src/crosstool-ng-1.24.0/
  2. 交叉編譯器的安裝路徑:設定 Prefix directory,把其中的${HOME}/x-tools改為${HOME}/ct-out/x-tools

修改交叉編譯工具針對的架構(S3C2440)

Target options--->
Target architecture(arm)

[*] Use the MMU
Endianness(Little endian)
Bitness(32-bit)

(arm920t) Emit assembly for CPU
Floating point: (software (no FPU))
  () Use specific FPU

其它保持預設值,退出並儲存配置工具
以上配置也可通過直接修改.config檔案來完成
當然也可以配置其他東西,如 Toolchain options

參考:crosstool-ng引數配置_gmf

剩下的 C-library & C compiler & Debug facilities & Companion libraries & Companion tools 用於配置生成的交叉工具鏈所用的gcc等版本,這裡我暫時不懂所以起先不管它

執行ct-ng build編譯工具鏈
ct-ng build

編譯要幾個小時
因為編譯過程會自動下載原始碼
編譯日誌見build.log檔案
若依賴包wget自動下載失敗,也可手動下載放到.build/tarballs/目錄

程式設計完成後,找到編譯生成的檔案路徑,測試

export "PATH=$PATH:$HOME/ct-out/x-tools/arm-s3c2440-linux-gnueabi/bin"
arm-s3c2440-linux-gnueabihf-gcc -v                  # 測試

測試結果

my@ubuntu:~/ct-out/build$ arm-s3c2440-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-s3c2440-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/home/my/ct-out/x-tools/arm-s3c2440-linux-gnueabi/libexec/gcc/arm-s3c2440-linux-gnueabi/8.3.0/lto-wrapper
Target: arm-s3c2440-linux-gnueabi
Configured with: /home/my/ct-out/build/.build/arm-s3c2440-linux-gnueabi/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=arm-s3c2440-linux-gnueabi --prefix=/home/my/ct-out/x-tools/arm-s3c2440-linux-gnueabi --with-sysroot=/home/my/ct-out/x-tools/arm-s3c2440-linux-gnueabi/arm-s3c2440-linux-gnueabi/sysroot --enable-languages=c --with-cpu=arm920t --with-float=soft --with-pkgversion='crosstool-NG 1.24.0 - yucloud20200928' --with-bugurl=https://yucloud.cnblogs.com/p/arm_crosscompile.html --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --disable-libmpx --with-gmp=/home/my/ct-out/build/.build/arm-s3c2440-linux-gnueabi/buildtools --with-mpfr=/home/my/ct-out/build/.build/arm-s3c2440-linux-gnueabi/buildtools --with-mpc=/home/my/ct-out/build/.build/arm-s3c2440-linux-gnueabi/buildtools --with-isl=/home/my/ct-out/build/.build/arm-s3c2440-linux-gnueabi/buildtools --enable-lto --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --disable-plugin --disable-nls --disable-multilib --with-local-prefix=/home/my/ct-out/x-tools/arm-s3c2440-linux-gnueabi/arm-s3c2440-linux-gnueabi/sysroot --enable-long-long
Thread model: posix
gcc version 8.3.0 (crosstool-NG 1.24.0 - yucloud20200928)

成功後再使用軟連結把所有可執行檔案通用化
sudo nano link.sh
sudo chmod +x link.sh
sudo chmod +x *

--------藍天上的雲_轉載請註明出處.