1. 程式人生 > >一套完整的ARM交叉編譯環境的搭建過程——不使用現成的工具鏈

一套完整的ARM交叉編譯環境的搭建過程——不使用現成的工具鏈




Glibc是交叉編譯環境的執行庫。首先將glibc-2.13.tar解壓至build-tools,然後將glibc-linuxthreads-2.3.6.tar解壓至glibc原始碼所在目錄,將glibc-ports-2.13.tar.gz解壓至glibc原始碼所在目錄,並重命名為ports。進入build-glibc資料夾,建立用於配置glibc的config.cache檔案,然後配置並編譯glibc,安裝glibc,最後修改libc.so。例項:



[email protected]:/opt/embedded/build-tools# cd /opt/embedded/build-tools/


[email protected]:/opt/embedded/build-tools# cp /mnt/hgfs/Document/glibc-2.13.tar .

[email protected]:/opt/embedded/build-tools# tar -xvf glibc-2.13.tar

[email protected]:/opt/embedded/build-tools# cd glibc-2.13/

[email protected]:/opt/embedded/build-tools/glibc-2.13# cp /mnt/hgfs/Document/glibc-linuxthreads-2.3.6.tar .


[email protected]:/opt/embedded/build-tools/glibc-2.13# tar -xjf glibc-linuxthreads-2.3.6.tar

[email protected]:/opt/embedded/build-tools/glibc-2.13# cp /mnt/hgfs/Document/glibc-ports-2.13.tar.gz .

[email protected]:/opt/embedded/build-tools/glibc-2.13# tar -xvf glibc-ports-2.13.tar.gz

[email protected]
:/opt/embedded/build-tools/glibc-2.13# mv glibc-ports-2.13/ ports


[email protected]:/opt/embedded/build-tools/glibc-2.13# cd ../build-glibc/



建立用於配置glibc的config.cache檔案,檔案內容為:

libc_cv_forced_unwind=yes

libc_cv_c_cleanup=yes

libc_cv_arm_tls=yes



注:在編譯過程中可能會發現本應自動生成的posix/config-name.h並沒有自動生成,找不到config-name.h這個檔案。這個檔案是用來編譯uname的。暫時沒辦法讓它自動生成,只好自己比照uname-a的資訊建一個config-name.h檔案:

在build-glibc目錄下建立一個posix目錄

# vim build-glibc/posix/config-name.h

在vim編輯器裡輸入:

/* This file is generated by ../scripts/config-uname.sh.  DO NOT EDIT.

   This is used only by the generic uname function for systems with no real

   uname call.  If this data is not correct, it does not matter much.  */

#ifdef config_name_h

#define config_name_h



#define UNAME_SYSNAME “Linux”    

#define UNAME_RELEASE “3.3.0-4.fc16.x86_64”

#define UNAME_VERSION “#1 SMP Tue Mar 20 18:05:40 UTC 2012”

#define UNAME_MACHINE “x86_64”



#endif /* config_name_h */



建立完成之後,便可以開始配置並編譯glibc了,例項:

[email protected]:/opt/embedded/build-tools/build-glibc# (PATH=$PREFIX/bin:$PATH ) BUILD_CC="gcc" CC=$TARGET-gcc ../glibc-2.13/configure --host=$TARGET --target=$TARGET --prefix=/usr --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin/ --with-headers=$TARGET_PREFIX/include/ 

[email protected]:/opt/embedded/build-tools/build-glibc# PATH=$PREFIX/bin:$PATH make



編譯出錯:

1)checking for suffix of object files... configure: error: in `/opt/embedded/build-tools/build-glibc':

configure: error: cannot compute suffix of object files: cannot compile

See `config.log' for more details

## ----------- ##

## Core tests. ##

## ----------- ##



configure:2363: checking build system type

configure:2377: result: x86_64-unknown-linux-gnu

configure:2397: checking host system type

configure:2410: result: arm-unknown-linux-gnu

configure:2439: checking for arm-linux-gcc

configure:2466: result: arm-linux-gcc

configure:2735: checking for C compiler version

configure:2744: arm-linux-gcc --version >&5

../glibc-2.13/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2744: arm-linux-gcc -v >&5

../glibc-2.13/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2744: arm-linux-gcc -V >&5

../glibc-2.13/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2744: arm-linux-gcc -qversion >&5

../glibc-2.13/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2760: checking for suffix of object files

configure:2782: arm-linux-gcc -c conftest.c >&5

../glibc-2.13/configure: line 2784: arm-linux-gcc: command not found

configure:2786: $? = 127

configure: failed program was:

| /* confdefs.h */

| #define PACKAGE_NAME "GNU C Library"

| #define PACKAGE_TARNAME "c-library"

| #define PACKAGE_VERSION "(see version.h)"

| #define PACKAGE_STRING "GNU C Library (see version.h)"

| #define PACKAGE_BUGREPORT "glibc"

| #define PACKAGE_URL "http://www.gnu.org/software/c-library/"



解決方法:PATH=$PREFIX/bin:$PATH ../glibc-2.13/configure BUILD_CC="gcc" CC=arm-linux-gcc --host=$TARGET --target=$TARGET --prefix=/usr --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin/ --with-headers=$TARGET_PREFIX/include/ ,在配置前面加上PATH=$PREFIX/bin:$PATH ,雖然你可能已加到bash.bashrc或/etc/profile,即將編譯成的arm-linux-gcc設定了環境變數,用arm-linux-gcc -v檢查發現已存在,但就是不好使,編譯會報錯(上述),故在配置前面加上此句。



2)[ALL ]     mawk: scripts/gen-sorted.awk: line 19: regular expression compile failed (bad class -- [], [^] or [)

   [ALL ]     /[^

   [ALL ]     mawk: scripts/gen-sorted.awk: line 19: syntax error at or near ]

   [ALL ]     mawk: scripts/gen-sorted.awk: line 19: runaway regular expression /, "", subd ...

在gen-sorted.awk第19行,出錯,這是一個簡單的錯誤,缺少了轉義符

解決辦法:

  查詢一個看有沒有類似的 

  cd /tmp/crosstool-ng/targets/src/glibc-cvs-2.9/scripts 

sed '/\^\//p' gen-sorted.awk -n

輸出的則是存在語法錯誤的語句

可以直接用

sed -i 's/\^\//\^\\\//g' gen-sorted.awk

  這種方法不完善,後面的還是會出現錯誤。

網上搜了下,需要用/usr/bin/gawk 替換/usr/bin/mawk,即

   sudo apt-get install gawk

   cd /usr/bin

   sudo mv mawk mawk.bak

   sudo ln -s gawk mawk



3)../ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S:30: Error: previous CFI entry not closed (missing .cfi_endproc)

解決方法:

[email protected]:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S

找到如下行:

ENTRY(__default_sa_restorer)

在其下新增:

END(__default_sa_restorer)

找到如下行:

ENTRY(__default_rt_sa_restorer)

在其下新增:

END(__default_rt_sa_restorer)



4)繼續make編譯

[email protected]:/opt/embedded/build-tools/build-glibc# make

編譯出錯:

../sysdeps/unix/syscall-template.S:82: Error: CFI instruction used without previous .cfi_startproc

解決方法:

[email protected]:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/sysdeps/unix/syscall-template.S

找到如下行:



#define T_PSEUDO(SYMBOL, NAME, N)                PSEUDO (SYMBOL, NAME, N)

在其上新增:

#define PSEUDO(name, syscall_name, args)   \

  .text;                                \

  ENTRY (name);                        \

    DO_CALL (syscall_name, args);         \

    cmn r0, $4096;

5)繼續make編譯

[email protected]:/opt/embedded/build-tools/build-glibc# make

編譯出錯:

allocatestack.c:247:33: 錯誤:‘TLS_DTV_UNALLOCATED’未宣告(在此函式內第一次使用)

解決方法:

[email protected]:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/nptl/allocatestack.c

[email protected]:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/elf/dl-tls.c

分別在檔案中的include後面新增:

#define TLS_DTV_UNALLOCATED      ((void *) -1l)

6)繼續make編譯

[email protected]:/opt/embedded/build-tools/build-glibc# make

編譯出錯:

/opt/embedded/tools/lib/gcc/arm-linux/4.6.3/../../../../arm-linux/bin/ld: cannot find -lgcc_eh

解決方法:

[email protected]:/opt/embedded/build-tools/build-glibc# ln -s /opt/embedded/tools/lib/gcc/arm-linux/4.6.3/libgcc.a /opt/embedded/tools/lib/gcc/arm-linux/4.6.3/libgcc_eh.a

7)繼續make編譯

[email protected]:/opt/embedded/build-tools/build-glibc# make

編譯出錯:

../sysdeps/ieee754/dbl-64/s_fma.c:152:15: 錯誤:‘FE_TOWARDZERO’未宣告(在此函式內第一次使用)

解決方法:

[email protected]:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/sysdeps/ieee754/dbl-64/s_fma.c

在檔案中的include後面新增:

#define FE_TOWARDZERO 0xc00000

#define FE_INEXACT 16

8)繼續make編譯

[email protected]:/opt/embedded/build-tools/build-glibc# make

編譯出錯:

../sysdeps/ieee754/dbl-64/s_fmaf.c:39:15: 錯誤:‘FE_TOWARDZERO’未宣告(在此函式內第一次使用)

解決方法:

[email protected]:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.13/sysdeps/ieee754/dbl-64/s_fmaf.c

在檔案中的include後面新增:

相關推薦

Ubuntu系統下arm-linux-gcc交叉編譯環境搭建過程

搭建所需環境 Linux版本:Ubuntu 14.10    交叉編譯器版本:arm-linux-gcc-4.4.3資源連結 何為交叉編譯環境 搭建交叉編譯環境,即安裝、配置交叉編譯工具鏈。在Ubun

fedora9 arm交叉編譯環境搭建

虛擬機器:fedora9 交叉編譯器:arm-Linux-gcc-4.4.3 一、參考網站 二、解壓安裝檔案: 1、解壓編譯器到相應目錄下(我這裡解壓到根目錄): [[email protected] smb]# tar -jxvf  arm-linux-gcc

完整ARM交叉編譯環境搭建過程——使用現成工具

Glibc是交叉編譯環境的執行庫。首先將glibc-2.13.tar解壓至build-tools,然後將glibc-linuxthreads-2.3.6.tar解壓至glibc原始碼所在目錄,將glibc-ports-2.13.tar.gz解壓至glibc原始碼所在目錄,並重命名為ports。進入

Linux下搭建arm交叉編譯環境

首先需要在網上搜索arm-linux-gcc-4.3.2.tgz 傳到Linux下,執行tar xzvf arm-linux-gcc-4.3.2.tgz -C/ 解壓到根目錄下(目錄結構/usr/local/arm/4.3.2) 這樣,編譯器就解壓到了Linux系統中 然後建立

ubuntu14.04搭建Android-arm交叉編譯環境

前面我們搭建了NDK開發環境 下面開始搭建arm交叉編譯環境 1.下載交叉編譯工具 進入到NDK根目錄:cd /home/wjt/AndroidWorkSpace/NDK_Tools/android-ndk-r10b 下載到指定路徑指令:./build/tools/make-st

docker搭建ros-indigo-arm交叉編譯環境

ROS執行環境:ARM ubuntu14.04 + ROS indigo 在arm環境下編譯ros應用程式,速度極慢,無法忍受,嘗試在x86機器上搭建docker+ros交叉編譯環境。 交叉編譯環境的搭建主要參考: 1 ARM ubuntu環境上安裝arm-indigo

Ubuntu14.04下arm-linux-gcc交叉編譯環境搭建

Ubuntu下arm-linux-gcc交叉編譯環境搭建 系統:Ubuntu 14.04 32bit 1、網上下載 arm-linux-gcc-4.4.3.tar.gz 2、解壓

Ubuntu16.04下arm-linux-gcc交叉編譯環境搭建

Ubuntu下arm-Linux-gcc交叉編譯環境搭建 參考:http://blog.csdn.net/hebbely/article/details/53992805 1、網上下載 arm-

Ubuntu 16.04.1 安裝後搭建ARM交叉編譯環境編譯pjsip

1.解除安裝沒有用的軟體 sudo apt-get purge libreoffice? sudo apt-get remove vim-? sudo apt-get update sudo apt-get install vim-common

visual studio 2013上搭建arm交叉編譯環境(二) cygwin等軟體的安裝及配置

   前文已經簡單介紹了要使用visualstudio來搭建arm交叉編譯環境需要安裝的軟體,本篇介紹下各種軟體的安裝方法,主要介紹cygwin的安裝和cygwin中arm9交叉編譯環境的建立,至於vs的安裝,visual gdb的安裝非常簡單,就不做介紹。 一 Visua

visual studio上搭建arm交叉編譯環境

前言 最近使用SlickEdit進行arm9應用程式的開發,感覺程式碼編輯、查詢、定義跳轉、函式引用處查詢等功能非常不好用,這可能是由於我之前都是在visual  studio(vs)上進行程式碼的開發的原因,個人感覺作為整合開發環境,VS+VA 進行程式碼的開發是最方便,

arm-linux交叉編譯環境搭建交叉工具 (JZ2440v2)

1. 交叉編譯環境搭建: (1)[email protected]:/home/caihuanming#          #不是root使用者 tar xvf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 -C ./      

visual studio 2013上搭建arm交叉編譯環境(四)makefile配置及編譯過程

        上篇文章已經介紹了cygwin測試工程建立和生成的方法,本文在此工程的基礎上,介紹makefile修改及編譯過程。  debug.mak是makefile的配置檔案,此檔案通過makefile中如下語句匯入到makefile中,作為makefile特定變數的

visual studio 2013上搭建arm交叉編譯環境(三)Visual studio2013中Cygwin工程的建立

        前兩篇文章已經介紹了在vs上搭建arm環境的準備工作。 http://blog.csdn.net/water1209/article/details/50926869 http://blog.csdn.net/water1209/article/detail

Qt arm嵌入式交叉編譯環境搭建

剛接觸linux系統和Qt,這個編譯環境的搭建確實讓人很是煩惱。經過一個多月時間的接觸,基本搞定了,雖然有些東西還是不是太明白,這在做個總結。 Qt的理解 首先得明白,qt就是一個C++類庫。用的時候,我們是通過呼叫它的動態庫來使用的。這就涉及一個問題了,在

Ubuntu 16.04(64bit)嵌入式交叉編譯環境搭建arm-linux-gcc使用

1.把壓縮包arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz放在一個資料夾下,然後在終端進入到該資料夾,將該壓縮包解壓到所需的目錄下(我解壓在了根目錄下) 下面是tar命令的描述 2.然後改變環境變數,能使arm-lin

Eclipse搭建ARM交叉編譯環境

工具安裝 eclipse版本: Version: Oxygen Release (4.7.0) 安裝ARM編譯工具 Help=>Install New Software=>add Name為 GNU ARM Eclipse Plug-ins 選擇相應

在Ubentu環境下創建arm交叉編譯環境

老師 build 目錄 更新 hello 分享 date win 例程 學校:華中科技大學機械學院 作業任務:在Ubentu環境下創建arm交叉編譯環境並且在虛擬機中編譯例程 首先,利用U盤安裝windows10+Ubuntu16.04雙系統,系統剛開始安裝,需要執行以下兩

Exynos4412交叉編譯環境搭建

mkdir 編譯工具 完成 root pc機 鏡像 not 創建文件 壓縮文件 Exynos4412交叉編譯環境搭建 交叉編譯:在PC機(x86平臺)上開發程序,在ARM板上運行,提高開發、編譯速度。 環境: Tiny4412SDK1506開發板 需要軟件: arm-lin

【嵌入式硬體Esp32】Ubuntu 1804下ESP32交叉編譯環境搭建

一、ESP32概述EPS32是樂鑫最新推出的整合2.4GWi-Fi和藍芽雙模的單晶片方案,採用臺積電(TSMC)超低功耗的40nm工藝,擁有最佳的功耗效能、射頻效能、穩定性、通用性和可靠性,適用於多種應用和不同的功耗要求。 ESP32搭載低功耗的Xtensa LX6 32bit雙核處理器,7級流水線架構,支