一套完整的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]
[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級流水線架構,支