ARM交叉編譯工具
什麼是交叉編譯工具?
交叉編譯就是指在一種平臺架構上編譯在另外一種平臺體系架構執行的程式。常見的是在X86的伺服器上編譯ARM linux的程式,或者windows環境下編譯ARM MCU的程式。
交叉編譯工具鏈是一套綜合開發工具,包括編譯器、連結器等其他輔助工具。平時工作一般不會要求自己製作交叉編譯工具,會使用廠商提供的現成的(編譯過程相對複雜,可以參考buildroot)。
這次碰到的問題是在使用aarm64-none-elf-gcc編譯linux的應用程式時報錯:
/opt/plnx/plnx-v17.3/tools/linux-i386/aarch64-none-elf/bin/../aarch64-none-elf/libc/usr/lib/crt0.o: In function `_start': /proj/esdt_sdk/gnu_abe/ABE/builds/lin/arm/arm-none-eabi/snapshots/newlib-newlib-2_4_0/libgloss/aarch64/crt0.S:148: undefined reference to `initialise_monitor_handles' /opt/plnx/plnx-v17.3/tools/linux-i386/aarch64-none-elf/bin/../aarch64-none-elf/libc/usr/lib/libc.a(lib_a-exit.o): In function `exit': /proj/esdt_sdk/gnu_abe/ABE/builds/lin/arm/arm-none-eabi/snapshots/newlib-newlib-2_4_0/newlib/libc/stdlib/exit.c:70: undefined reference to `_exit' /opt/plnx/plnx-v17.3/tools/linux-i386/aarch64-none-elf/bin/../aarch64-none-elf/libc/usr/lib/libc.a(lib_a-writer.o): In function `_write_r': /proj/esdt_sdk/gnu_abe/ABE/builds/lin/arm/arm-none-eabi/snapshots/newlib-newlib-2_4_0/newlib/libc/reent/writer.c:58: undefined reference to `_write' /opt/plnx/plnx-v17.3/tools/linux-i386/aarch64-none-elf/bin/../aarch64-none-elf/libc/usr/lib/libc.a(lib_a-lseekr.o): In function `_lseek_r': /proj/esdt_sdk/gnu_abe/ABE/builds/lin/arm/arm-none-eabi/snapshots/newlib-newlib-2_4_0/newlib/libc/reent/lseekr.c:58: undefined reference to `_lseek' /opt/plnx/plnx-v17.3/tools/linux-i386/aarch64-none-elf/bin/../aarch64-none-elf/libc/usr/lib/libc.a(lib_a-openr.o): In function `_open_r': /proj/esdt_sdk/gnu_abe/ABE/builds/lin/arm/arm-none-eabi/snapshots/newlib-newlib-2_4_0/newlib/libc/reent/openr.c:59: undefined reference to `_open' /opt/plnx/plnx-v17.3/tools/linux-i386/aarch64-none-elf/bin/../aarch64-none-elf/libc/usr/lib/libc.a(lib_a-readr.o): In function `_read_r': /proj/esdt_sdk/gnu_abe/ABE/builds/lin/arm/arm-none-eabi/snapshots/newlib-newlib-2_4_0/newlib/libc/reent/readr.c:58: undefined reference to `_read' /opt/plnx/plnx-v17.3/tools/linux-i386/aarch64-none-elf/bin/../aarch64-none-elf/libc/usr/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r': /proj/esdt_sdk/gnu_abe/ABE/builds/lin/arm/arm-none-eabi/snapshots/newlib-newlib-2_4_0/newlib/libc/reent/sbrkr.c:58: undefined reference to `_sbrk' /opt/plnx/plnx-v17.3/tools/linux-i386/aarch64-none-elf/bin/../aarch64-none-elf/libc/usr/lib/libc.a(lib_a-closer.o): In function `_close_r': /proj/esdt_sdk/gnu_abe/ABE/builds/lin/arm/arm-none-eabi/snapshots/newlib-newlib-2_4_0/newlib/libc/reent/closer.c:53: undefined reference to `_close' /opt/plnx/plnx-v17.3/tools/linux-i386/aarch64-none-elf/bin/../aarch64-none-elf/libc/usr/lib/libc.a(lib_a-fstatr.o): In function `_fstat_r': /proj/esdt_sdk/gnu_abe/ABE/builds/lin/arm/arm-none-eabi/snapshots/newlib-newlib-2_4_0/newlib/libc/reent/fstatr.c:62: undefined reference to `_fstat' /opt/plnx/plnx-v17.3/tools/linux-i386/aarch64-none-elf/bin/../aarch64-none-elf/libc/usr/lib/libc.a(lib_a-isattyr.o): In function `_isatty_r': /proj/esdt_sdk/gnu_abe/ABE/builds/lin/arm/arm-none-eabi/snapshots/newlib-newlib-2_4_0/newlib/libc/reent/isattyr.c:58: undefined reference to `_isatty'
在網上找了很久資料也沒有答案。後來才發現這個編譯工具只是用來編譯uboot的程式碼,編譯應用程式需要用aarch64-linux-gnu-gcc。為了搞清楚兩者的區別查了一些資料做一下記錄。
分類和說明
從授權商,分為免費授權版和付費授權版。
免費版目前有三大主流工具商提供,第一是GNU,第二是 Codesourcery ,第三是Linaro
收費版有ARM原廠提供的armcc,IAR(編譯MCU的綜合編譯環境)提供的編譯器等等,這些往往收費較貴。像IAR這類整合工具可以下載破解版使用。
命名規則
交叉編譯工具鏈的命名規則為:arch [-vendor] [-os] [-(gnu)eabi]
· arch - 體系結構,如ARM,MIPS,PPC
· vendor - 工具鏈提供商
· os - 目標作業系統
· eabi - 嵌入式應用二進位制介面(embedded application binary interface)
示例
1、arm-none-eabi-
(ARM architecture, no vendor, not target an operation system,complies with the ARM EABI)
用於編譯ARM架構的裸機系統(包括ARM的uboot、kernel),不能編譯linux系統的應用程式。
2、arm-none-linux-gnueabi-
(ARM architecture,no vendor,creates binaries that run no the Linux peration system, and use the GNU EABI)
ARM架構的linux系統,可用於編譯ARM架構的uboot、kernel,應用程式等。arm-none-linux-gnueabi-基於GCC,使用Glibc庫,經過Codesourcery公司優化推出的編譯器。
3、arm-eabi-
android ARM編譯器
4、arm-none-uclinuxeabi-gcc
使用uclibc的C庫
Reference: