當前位置:首頁 » 網頁前端 » 交叉編譯器腳本
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

交叉編譯器腳本

發布時間: 2022-10-30 03:27:33

❶ 如何使用CMake進行交叉編譯

cmake交叉編譯配置

很多時候,我們在開發的時候是面對嵌入式平台,因此由於資源的限制需要用到相關的交叉編譯。即在你host宿主機上要生成target目標機的程序。裡面牽扯到相關頭文件的切換和編譯器的選擇以及環境變數的改變等,我今天僅僅簡單介紹下相關CMake在面對交叉編譯的時候,需要做的一些准備工作。

CMake給交叉編譯預留了一個很好的變數CMAKE_TOOLCHAIN_FILE,它定義了一個文件的路徑,這個文件即toolChain,裡面set了一系列你需要改變的變數和屬性,包括C_COMPILER,CXX_COMPILER,如果用Qt的話需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的話需要更改的BOOST_ROOT(具體查看相關Findxxx.cmake裡面指定的路徑)。CMake為了不讓用戶每次交叉編譯都要重新輸入這些命令,因此它帶來toolChain機制,簡而言之就是一個cmake腳本,內嵌了你需要改變以及需要set的所有交叉環境的設置。

toolChain腳本中設置的幾個重要變數

1.CMAKE_SYSTEM_NAME:

即你目標機target所在的操作系統名稱,比如ARM或者Linux你就需要寫"Linux",如果Windows平台你就寫"Windows",如果你的嵌入式平台沒有相關OS你即需要寫成"Generic",只有當CMAKE_SYSTEM_NAME這個變數被設置了,CMake才認為此時正在交叉編譯,它會額外設置一個變數CMAKE_CROSSCOMPILING為TRUE.

2. CMAKE_C_COMPILER:

顧名思義,即C語言編譯器,這里可以將變數設置成完整路徑或者文件名,設置成完整路徑有一個好處就是CMake會去這個路徑下去尋找編譯相關的其他工具比如linker,binutils等,如果你寫的文件名帶有arm-elf等等前綴,CMake會識別到並且去尋找相關的交叉編譯器。

3. CMAKE_CXX_COMPILER:

同上,此時代表的是C++編譯器。

4. CMAKE_FIND_ROOT_PATH:

指定了一個或者多個優先於其他搜索路徑的搜索路徑。比如你設置了/opt/arm/,所有的Find_xxx.cmake都會優先根據這個路徑下的/usr/lib,/lib等進行查找,然後才會去你自己的/usr/lib和/lib進行查找,如果你有一些庫是不被包含在/opt/arm裡面的,你也可以顯示指定多個值給CMAKE_FIND_ROOT_PATH,比如

set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)

該變數能夠有效地重新定位在給定位置下進行搜索的根路徑。該變數默認為空。當使用交叉編譯時,該變數十分有用:用該變數指向目標環境的根目錄,然後CMake將會在那裡查找。

5. CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:

對FIND_PROGRAM()起作用,有三種取值,NEVER,ONLY,BOTH,第一個表示不在你CMAKE_FIND_ROOT_PATH下進行查找,第二個表示只在這個路徑下查找,第三個表示先查找這個路徑,再查找全局路徑,對於這個變數來說,一般都是調用宿主機的程序,所以一般都設置成NEVER

6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:

對FIND_LIBRARY()起作用,表示在鏈接的時候的庫的相關選項,因此這里需要設置成ONLY來保證我們的庫是在交叉環境中找的.

7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:

對FIND_PATH()和FIND_FILE()起作用,一般來說也是ONLY,如果你想改變,一般也是在相關的FIND命令中增加option來改變局部設置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH

8. BOOST_ROOT:

對於需要boost庫的用戶來說,相關的boost庫路徑配置也需要設置,因此這里的路徑即ARM下的boost路徑,裡面有include和lib。

9. QT_QMAKE_EXECUTABLE:

對於Qt用戶來說,需要更改相關的qmake命令切換成嵌入式版本,因此這里需要指定成相應的qmake路徑(指定到qmake本身)

toolChain demo

# this is required
SET(CMAKE_SYSTEM_NAME Linux)

# specify the cross compiler
SET(CMAKE_C_COMPILER /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)

# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/arm/ppc_74xx /home/rickk/arm_inst)

# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)

這樣就完成了相關toolChain的編寫,之後,你可以靈活的選擇到底採用宿主機版本還是開發機版本,之間的區別僅僅是一條-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做轉移,但目標平台是同一個,你僅僅需要寫一份toolChain放在一個地方,就可以給所有工程使用。

❷ cygwin 中如何安裝arm-linux-gcc交叉編譯器

交叉編譯工具鏈作為嵌入式Linux開發的基礎,直接影響到嵌入式開發的項目進度和完成質量。由於目前大多數開發人員使用Windows作為嵌入式開發的宿主機,在Windows中通過安裝VMware等虛擬機軟體來進行嵌入式Linux開發,這樣對宿主機的性能要求極高。Cygwin直接作為Windows下的軟體完全能滿足嵌入式Linux的開發工作,對硬體的要求低及方便快捷的特點成為嵌入式開發的最佳選擇。

目前網路上Cygwin下直接可用的交叉編譯器寥寥無幾且版本都比較低,不能滿足開源軟體對編譯器版本依賴性的要求(如低版本工具鏈編譯U-Boot出現軟浮點問題等);Crosstool等交叉工具鏈製作工具也是更新跟不上自由軟體版本的進度;同時系統介紹Cygwin下製作交叉編譯器方面的資料很少。針對上述情況,基於最新版gcc等自由軟體構建Cygwin下的交叉編譯器顯得尤為迫切和重要。
構建前准備工作
首先Cygwin下必須保證基本工具比如make}gcc等來構建bootstrap-gcc編譯器,這可以在安裝Cygwin時選擇安裝。參照gcc等安裝說明文檔來在Cygwin下查看是否已經安裝,如輸入gcc --v等。
源碼下載
gcc-4.5.0的編譯需mpc的支持,而mpc又依賴gmp和mpfr庫。從各個項目官方網站上下載的最新的源碼:
binutils-2.20. l .tar.bz2
gmp-S.O. l .tar.bz2
mpc-0.8.2.tar.gz
mpfr-3.O.O.tar.bz2
gcc-4.S.O.tar.bz2
linux-2.6.34.tar.bz2
glibc-2.11.2.tar.bz2
glibc-ports-2. l l .tar.bz2
gdb-7. l.tar.bz2

設置環境變數
HOST:工具鏈要運行的目標機器;BUILD:用來建立工具鏈的機器;TARGET工具鏈編譯產生的二進制代碼可以運行的機器。
BUILD=i686-pc-cygwin
HOST=i686-pc-cygwin TARGET=arm-linux
SYSROOT指定根目錄,$PREFIX指定安裝目錄。目標系統的頭文件、庫文件、運行時對象都將被限定在其中,這在交叉編譯中有時很重要,可以防止使用宿主機的頭文件和庫文件。本文首選$SYSROOT為安裝目錄,$PREFIX主要作為glibc庫安裝目錄。
SYSROOT=/cross-root
PREFIX=/cross-root/arm-linux
由於GCC-4.5.0需要mpfr,gmp,mpc的支持,而這三個庫又不需要交叉編譯,僅僅是在編譯交叉編譯鏈時使用,所以放在一個臨時的目錄。
TEMP_PREFIX=/build-temp
控制某些程序的本地化的環境變數:
LC ALL=POSIX
設置環境變數:
PATH=$SYSROOT/bin:兒in:/usr/bin
設置編譯時的線程數f31減少編譯時間:
PROCS=2
定義各個軟體版本:
BINUTILS V=2.20.1
GCC V=4.5.0
GMP V=5.0.1
MPFR V=3.0.0
MPC V二0.8.2
LINUX V二2.6.34
GLIBC V=2.11.2
GLIBC-PORTS V=2.11
GDB V=7.1
構建過程詳解
鑒於手工編譯費時費力,統一把構建過程寫到Makefile腳本文件中,把其同源碼包放在同一目錄下,執行make或順次執行每個命令即可進行無人值守的編譯安裝交叉工具
鏈。以下主要以Makefile執行過程為主線進行講解。
執行「make」命令實現全速運行
可在Cygwin的Shell環境下執行「make>make.log 2>&1」命令把編譯過程及出現的錯誤都輸出到make.log中,便於查找:
all:prerequest install-deps install-cross-stage-one install-
cross-stage-two
預處理操作
"make prerequest',命令實現單步執行的第一步,實現輸出變數、建立目錄及解壓源碼包等操作。0'set十h」關閉bash的Hash功能,使要運行程序的時候,shell將總是搜索PATH里的目錄[4]。這樣新工具一旦編譯好,shell就可以在$(SYSROOT)/bin目錄里找到: prerequest:
set +h&&mkdir -p $(SYSROOT)/bin&&
mkdir -p $(PREFIX)/include&&
mkdir -p $(TEMP一REFIX)&&
export PATH LCes ALL&&
tar -xvf gmp-$(GMP_V).tar.bz2&&
tar -xvf mpfr-$(MPFR_V).tar.bz2&&
tar -xvf mpc-$(MPC_V).tar.gz&&
tar -xvf binutils-$(BINUTILS_V).tar.bz2&&
tar -xvf gcc-$(GCC_V).tar.bz2&&
tar -xvf linux-$(LINUX_V).tar.bz2&&
tar -xvf glibc-$(GLIBC_V).tar.bz2&&
tar -xvf glibc-ports-$(GLIBC-PORTS_V).tar.bz2&&
my glibc-ports-$(GLIBC-PORTS_V)
glibc-$(GLIBC_V)/ports&&
tar -xvf gdb-$(GDB V).tar.bz2
非交叉編譯安裝gcc支持包mpc
00make install-deps」命令實現單步執行的第二步,實現mpc本地編譯,mpc依賴於gmp和mpfr
install-deps:gmp mpfr mpc
gmp:gmp-$(GMP_V)
mkdir -p build/gmp&&cd build/gmp&&
../../gmp-*/configure
--disable-shared --prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS)&&$(MAKE) install
mpfr:mpfr-$(MPFR_V)
mkdir -p b-uild/mpfr&&cd build/mpfr&&
../..//mpfr-*/configure
LDF'LAGS="-Wl,-search_paths_first」--disable-shared
--with-gmp=$(TEMP_PREFIX)
--prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS) all&&$(MAKE) install
mpc: mpc-$(MPC_V) gmp mpfr
mkdir -p build/mpc&&cd build/mpc&&
../../mpc-*/configure
--with-mpfr=$(TEMP PREFIX)
--with-gmp=$(TEMP_PREFIX)
--prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS)&&$(MAKE) install
交叉編譯第一階段
"make install-cross-stage-one',命令實現單步執行的第三步,編譯安裝binutils,bootstrap-gcc和獲取Linux內核頭文件:
install-cross-stage-one:cross-binutils cross-gcc get-kernel-headers
編譯安裝binutils
cross-binutils: binutils-$(BINUTILS_ V)
mkdir -p build/binutils&&cd build/binutils&&
../..//binutils-*/configure --prefix=$(SYSROOT)
--target=$(TARGET)--disable-nls&&
$(MAKE)j$(PROCS)&&$(MAKE) install
編譯安裝bootstrap-gcc。使用一disable-shared參數的意思是不編譯和安裝libgcc_ eh.a文件。glibc軟體包依賴這個庫,因為它使用其內部的一lgcc_eh來創建系統[6]。這種依賴
性,可通過建立一個指向libgcc.a符號鏈接得到滿足,因為該文件最終將含有通常在libgcc- eh.a中的對象(也可通過補丁文件實現)。
cross-gcc:gcc-$(GCC_V)
mkdir -p build/gcc&&cd build/gcc&&
二//gcc-*/configure
--target=$(TARGET)--prefix=$(SYSROOT)
--disable-nls --disable-shared --disable-multilib
--disable-decimal-float--disable-threads
--disable-libmudflap --disable-libssp
--disable-libgomp --enable-languages=c
--with-gmp=$(TEMP_PREFIX)
--with-mpfr=$(TEMP_PREFIX)
--with-mpc=$(TEMP_PREFIX)&&
$(MAKE) -j$(PROCS)&&$(MAICE) install&&
In -vs libgcc.a'arm-linux-gcc -print-libgcc-file-name I
sed's/libgcc/& eh/'}
獲取Linux內核頭文件:
get-kernel-headersainux-$(LINUX_V)
cd linux-$(LINUX_V)&&
$(MAICE) mrproper&&$(MAKE) headers check&&
$(MAKE) ARCH=arm&&
INSTALLes HDR_ PATH=dest headers_ install&&
find dest/include
(-name .install一。-name ..installNaNd)-delete&&
cp -rv desdinclude/* $(PREFIX)/include
交叉編譯第二階段
編譯安裝glibc、重新編譯安裝binutils、完整編譯安裝gcc和編譯安裝gdb o "make install-cross-stage-two',命令實現單步執行的第四步: install-cross-stage-two:cross-glibc cross-rebinutils cross-g++ cross-gdb
編譯安裝glibca glib。的安裝路徑特意選為$(PREFIX),與gcc更好找到動態鏈接庫也有關系,選在$(SYSROOT)提示找不到crti.o; glibc已經不再支持i386; glibc對ARM等的處理器的支持主要通過glibc-ports包來實現;正確認識大小寫敏感(Case Sensitive)和大小寫不敏感(CaseInsensitive)系統,大小寫敏感問題主要影響到glibc,是交叉編譯glibc成功的關鍵:Cygwin幫助手冊中可知Cygwin是默認大小寫不敏感的n},但是UNIX系統是大小寫敏感的,這也是Cygwin和UNIX類系統的一個區別。通過作者自行參考製作的glibc-2.11.2-cygwin.patch補T使glibc變為Case-Insensitive,此補丁主要是對大小寫敏感問題改名來實現。
交叉編譯過程中安裝的鏈接器,在安裝完Glibc以前都無法使用。也就是說這個配置的forced unwind支持測試會失敗,因為它依賴運行中的鏈接器。設置libc_ cvforced unwind=yes這個選項是為了通知configure支持force-unwind,而不需要進行測試。libc cv_c_cleanup=yes類似的,在configure腳本中使用libc_cv_c cleanup=yes,以便配置成跳過測試而支持C語言清理處理。
cross-glibc:glibc-$(GLIBC_V)
cd glibc-$(GLIBC_V)&&
patch -Np 1 –i...//glibc-2.11.2-cygwin.patch&&
cd..&&mkdir -p build/glibc&&
cd build/glibc&&
echo"libc cv_forcedes unwind=yes">config.cache&&
echo "libc cv_c_cleanup=yes">>config.cache&&
echo "libc cv_arm_tls=yes">>config.cache&&
../../glibc-*/configure --host=$(TARGET)
--build=$(../OneScheme/glibc-2.11.2/scripts/config.guess)
--prefix=$(PREFIX)--disable-profile
--enable-add-ons --enable-kernel=2.6.22.5
--with-headers=$(PREFIX)/include
--cache-file=config.cache&&
$(MAKE)&&$(MAKE) install
重新編譯安裝binutils。編譯之前要調整工具鏈,使其
指向新生成的動態連接器。
調整工具鏈:
SPECS=
'dirname $(arm-linux-gcc -print-libgcc-file-name)'/specs
arm-linux-gcc -mpspecs
sed -e 's@/lib(64)\?/ld@$(PREFTX)&@g' -e ,}/}}*cPP}$/{n;s,$,-isystem $(PREFIX)/include,}"
>$SPECS
echo "New specs file is: $SPECS"
unset SPECS
測試調整後工具鏈:
echo 'main(川』>mmy.c
arm-linux-gcc
-B/cross-root/arm-linux/lib mmy.c
readelf -1 a.out I grep』:/cross-roobarm-linux'
調整正確的輸出結果:
[Requesting program interpreter: /tools/lib/ld-linux.so.2j
一切正確後刪除測試程序:
rm -v mmy.c a.out
重新編譯binutils。指定--host,--build及--target,否則配置不成功,其config.guess識別能力不如gcc做的好。
cross-rebinutils: binutils-$(BINUTILS_V)
mkdir -p build/rebinutils&&
cd build/rebinutils&&CC="$(TARGET)-gcc
-B/cross-roodarm-linux/lib/"&&AR=$(TARGET)-ar&&
RANLIB=$(TARGET)-ranlib&&../..//binutils-*/configure
--host=$(HOST)--build=$(BUILD)--target=$(TARGET)
--prefix=$(SYSROOT)--disable-nls
--with-lib-path=$(PREFIX)/lib&&
$(MAKE)--$(PROCS)&&$(MAKE) install
高於4.3版的gcc把這個編譯當作一個重置的編譯器,並且禁止在被一prefix指定的位置搜索startfiles。因為這次不是重置的編譯器,並且$(SYSROOT)目錄中的startfiles對於創
建一個鏈接到$$(SYSROOT)目錄庫的工作編譯器很重要,所以我們使用下面的補丁,它可以部分還原gcc的老功能tai . patch -Npl –i../gcc-4.5.0-startfiles_fix-l.patch
在正常條件下,運行gcc的fixincludes腳本,是為了修復可能損壞的頭文件。它會把宿主系統中已修復的頭文件安裝到gcc專屬頭文件目錄里,通過執行下面的命令,可以抑
制fixincludes腳本的運行[9](此時目錄為/gcc-4.5.0)。
cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@'
gcc/Makefile.in.orig > gcc/Makefile.in
下面更改gcc的默認動態鏈接器的位置,使用已安裝在/cross-root/ann-linux目錄下的鏈接器,這樣確保在gcc真實的編譯過程中使用新的動態鏈接器。即在編譯過程中創建的所有
二進制文件,都會鏈接到新的glibc文件
for file in
$(find gcc/config -name linux64.h-o -name linux.h –o -name sysv4.h)
do cp -uv $file{,.orig}
sed -a 's@/lib(64)?(32)?/Id@/cross-root/arm-linux&@g』-e's@/usr@/cross-rootlarm-linux@g' $file.orig>$file echo『
#undef STANDARD INCLUDE DIR
#define STANDARD_ INCLUDE DIR "/cross-root/arm-linux/include"
#define STANDARD STARTFILE PREFIX 1 "/cross-root/arm-linux/lib"
#define STANDARD_ STARTFILE_ PREFIX_ 2」」』>>$file
touch $file.orig done
完整編譯安裝gcc。最好通過指定--libexecdir更改libexecdir到atm-linux目錄下。--with-local-prefix選項指定gcc本地包含文件的安裝路徑此處設為$$(PREFIX),安裝後就會在內核頭文件的路徑下。路徑前指定$(Pwd)則以當前路徑為基點,不指定則默認以/home路徑為基點,這點要注意。
cross-g++:gcc-$(GCC-)
mkdir -p build/g十+&&cd build/g++&&
CC="$(TARGET)-gcc AR=$(TARGET)-ar&&
-B/cross-roodarm-linux/lib/"&&
RANLIB=$(TARGET)-ranlib&&
..//gcc-*/configure
--host=$(HOST)--build=$(BUILD)--target=$(TARGET)
--prefix=$(SYSROOT)--with-local-prefix=$(PREFIX)
--enable-clocale=gnu --enable-shared
--enable-threads=posix --enable -cxa_atexit
--enable-languages=c,c++--enable-c99
--enable-long-long --disable-libstdcxx-pch
--disable-libunwind-exceptions
--with-gmp=$(TEMP_PREFIX)
--with-mpfr=$(TEMP_PREFIX)
--with-mpc=$(TEMP_PREFIX)&&
$(MAKE) LD_IBRARY_ATH=
$(pwd)/$(../../gcc-4.5.0/config.guess)/libgcc&&
$(MAKE) install
編譯安裝gdb,至此完成整個工具鏈的製作。
cross-gdb: gdb-$(GDB V)
mkdir -p build/gdb&&cd build/gdb&&
../../gdb-*/configure --prefix=$(SYSROOT)
--target=$(TARGET)--disable-werror&&
$(MAKE)-j$(PROCS)&&$(MAKE) install
「make clean」命令清除編譯生成的文件和創建解壓的文件夾
.PHONY:clean
dean:
rm -fr $(TEMP_PREFIX) build
binutils-$(BINUTIL,S_V) gcc-$(GCC_V)
glibc-$(NEWL.IB_V) gdb-$(GDB_V)
gmp-$(GMP_V) mpc-$(MPC_V) mpfr-$(MPFR_V)
工具鏈測試
命令行中輸入以下內容:
echo 'main(){}』>mmy.c
arm-linux-gcc -o mmy.exe mmy.c
file mmy.exe
運行正常的結果:
mmy.exe: ELF 32-bit LSB executable, ARM, version 1,for GNU/Linux 2.6.22, dynamically linked (uses shared libs),not stripped.

❸ 什麼是交叉編譯器

交叉編譯器:在一種計算機環境中運行的編譯程序,能編譯出在另外一種環境下運行的代碼

❹ 如何對lighttpd進行交叉編譯安裝並配置lighttpdweb伺服器

1. 編譯、安裝
1.1. 先到lighttpd官網下載對應版本的軟體包:
http://www.lighttpd.net/
我下載的是 lighttpd-1.4.30.tar.gz
1.2. 將壓縮包解壓到任意目錄(我的是 /root/Desktop/common)得到文件夾 lighttpd-1.4.30
1.3. 在文件夾 lighttpd-1.4.30 中創建shell腳本,命名為:configure-arm.sh
1.4. 在shell腳本 configure-arm.sh 中輸入如下代碼:
#! /bin/sh
CC=arm-linux-gcc
AR=arm-linux-ar LD=arm-linux-ld RANLIB=arm-linux-ranlib
STRIP=arm-linux-strip ./configure --prefix=/opt/web/lighttpd-1.4.30-arm
--host=arm-linux --build=i686-pc-linux --disable-FEATURE --enable-shared
--disable-static --disable-lfs --disable-ipv6 --without-PACKAGE
--without-valgrind --without-openssl --without-kerberos5 --without-pcre
--without-zlib --without-bzip2 --without-lua

1.5. 打開控制台,cd進入 lighttpd-1.4.30 目錄
1.6. 給 configure-arm.sh 文件添加可執行屬性,執行命令:
chmod +x configure-arm.sh
1.7. 配置lighttpd,執行命令:
./configure-arm.sh
1.8. 編譯lighttpd,執行命令:
make
1.9. 安裝lighttpd,執行命令:
make install

❺ 交叉編譯的流程是什麼

採用交叉編譯的主要原因在於,多數嵌入式目標系統不能提供足夠的資源供編譯過程使用,因而只好將編譯工程轉移到高性能的主機中進行。
linux下的交叉編譯環境重要包括以下幾個部分:
1.對目標系統的編譯器gcc
2.對目標系統的二進制工具binutils
3.目標系統的標准c庫glibc
4.目標系統的linux內核頭文件
交叉編譯環境的建立步驟
一、下載源代碼 下載包括binutils、gcc、glibc及linux內核的源代碼(需要注意的是,glibc和內核源代碼的版本必須與目標機上實際使用的版本保持一致),並設定shell變數PREFIX指定可執行程序的安裝路徑。
二、編譯binutils 首先運行configure文件,並使用--prefix=$PREFIX參數指定安裝路徑,使用--target=arm-linux參數指定目標機類型,然後執行make install。
三、配置linux內核頭文件
首先執行make mrproper進行清理工作,然後執行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)進行配置(注意,一定要在命令行中使用ARCH=arm指定cpu架構,因為預設架構為主機的cpu架構),這一步需要根據目標機的實際情況進行詳細的配置,筆者進行的實驗中目標機為HP的ipaq-hp3630 PDA,因而設置system type為SA11X0,SA11X0 Implementations中選擇Compaq iPAQ H3600/H3700。
配置完成之後,需要將內核頭文件拷貝到安裝目錄: cp -dR include/asm-arm $PREFIX/arm-linux/include/asm cp -dR include/linux $PREFIX/arm-linux/include/linux
四、第一次編譯gcc
首先運行configure文件,使用--prefix=$PREFIX參數指定安裝路徑,使用--target=arm-linux參數指定目標機類型,並使用--disable-threads、--disable-shared、--enable-languages=c參數,然後執行make install。這一步將生成一個最簡的gcc。由於編譯整個gcc是需要目標機的glibc庫的,它現在還不存在,因此需要首先生成一個最簡的gcc,它只需要具備編譯目標機glibc庫的能力即可。
五、交叉編譯glibc
這一步驟生成的代碼是針對目標機cpu的,因此它屬於一個交叉編譯過程。該過程要用到linux內核頭文件,默認路徑為$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一個名為sys-linux的軟連接,使其內核頭文件所在的include目錄;或者,也可以在接下來要執行的configure命令中使用--with-headers參數指定linux內核頭文件的實際路徑。
configure的運行參數設置如下(因為是交叉編譯,所以要將編譯器變數CC設為arm-linux-gcc): CC=arm-linux-gcc ./configure --prefix=$PREFIX/arm-linux --host=arm-linux --enable-add-ons 最後,按以上配置執行configure和make install,glibc的交叉編譯過程就算完成了,這里需要指出的是,glibc的安裝路徑設置為$PREFIXARCH=arm/arm-linux,如果此處設置不當,第二次編譯gcc時可能找不到glibc的頭文件和庫。
六、第二次編譯gcc
運行configure,參數設置為--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。
運行make install。
到此為止整個交叉編譯環境就完全生成了。
幾點注意事項
第一點、在第一次編譯gcc的時候可能會出現找不到stdio.h的錯誤,解決辦法是修改gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS變數的設定中增加-Dinhibit_libc和-D__gthr_posix_h。

❻ Linux嵌入式交叉編譯工具鏈問題 淺談

簡介

交叉編譯工具鏈是一個由編譯器、連接器和解釋器組成的綜合開發環境,交叉編譯工具鏈主要由binutils、gcc和glibc 3個部分組成。有時出於減小libc庫大小的考慮,也可以用別的c庫來代替glibc,例如uClibc、dietlibc和newlib。交叉編譯工具鏈主要包括針對目標系統的編譯器gcc、目標系統的二進制工具binutils、目標系統的標准c庫glibc和目標系統的Linux內核頭文件。第一個步驟就是確定目標平台。每個目標平台都有一個明確的格式,這些信息用於在構建過程中識別要使用的不同工具的正確版本。因此,當在一個特定目標機下運行GCC時,GCC便在目錄路徑中查找包含該目標規范的應用程序路徑。GNU的目標規范格式為CPU-PLATFORM-OS。例如,建立基於ARM平台的交叉工具鏈,目標平台名為arm-linux-gnu。

交叉編譯工具鏈的製作方法

  1. 分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。

  2. 通過Crosstool腳本工具來實現一次編譯生成交叉編譯工具鏈。

  3. 直接通過網上(ftp.arm.kernel.org.uk)下載已經製作好的交叉編譯工具鏈。

方法1相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法2或方法3構建交叉工具鏈。方法3的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名的錯誤,建議你慎用此方法。


方法1:分步構建交叉編譯工具鏈


  1. 下載所需的源代碼包

  2. 建立工作目錄

  3. 建立環境變數

  4. 編譯、安裝Binutils

  5. 獲取內核頭文件

  6. 編譯gcc的輔助編譯器

  7. 編譯生成glibc庫

  8. 編譯生成完整的gcc

由於在問答中的篇幅,我不能細述具體的步驟,興趣的同學請自行閱讀開源共創協議的《Linux from scratch》,網址是:linuxfromscratch dot org


方法2:用Crosstool工具構建交叉工具鏈(推薦)

Crosstool是一組腳本工具集,可構建和測試不同版本的gcc和glibc,用於那些支持glibc的體系結構。它也是一個開源項目,下載地址是kegel dot com/crosstool。用Crosstool構建交叉工具鏈要比上述的分步編譯容易得多,並且也方便許多,對於僅僅為了工作需要構建交叉編譯工具鏈的你,建議使用此方法。

運行which makeinfo,如果不能找見該命令,在解壓texinfo-4.11.tar.bz2,進入texinfo-4.11目錄,執行./configure&&make&&make install完成makeinfo工具的安裝

  • 准備文件:

下載所需資源文件linux-2.4.20.tar.gz、binutils-2.19.tar.bz2、gcc-3.3.6.tar.gz、glibc- 2.3.2.tar.gz、glibc-linuxthreads-2.3.2.tar.gz和gdb-6.5.tar.bz2。然後將這些工具包文件放在新建的$HOME/downloads目錄下,最後在$HOME/目錄下解壓crosstool-0.43.tar.gz,命

令如下:
#cd$HOME/
#tar–xvzfcrosstool-0.43.tar.gz
  • 建立腳本文件

接著需要建立自己的編譯腳本,起名為arm.sh,為了簡化編寫arm.sh,尋找一個最接近的腳本文件demo-arm.sh作為模板,然後將該腳本的內容復制到arm.sh,修改arm.sh腳本,具體操作如下:

# cd crosstool-0.43

# cp demo-arm.sh arm.sh

# vi arm.sh

修改後的arm.sh腳本內容如下:

#!/bin/sh
set-ex
TARBALLS_DIR=$HOME/downloads#定義工具鏈源碼所存放位置。
RESULT_TOP=$HOME/arm-bin#定義工具鏈的安裝目錄
exportTARBALLS_DIRRESULT_TOP
GCC_LANGUAGES="c,c++"#定義支持C,C++語言
exportGCC_LANGUAGES
#創建/opt/crosstool目錄
mkdir-p$RESULT_TOP
#編譯工具鏈,該過程需要數小時完成。
eval'catarm.datgcc-3.3.6-glibc-2.3.2.dat'shall.sh--notest
echoDone.
  • 建立配置文件

在arm.sh腳本文件中需要注意arm-xscale.dat和gcc-3.3.6-glibc-2.3.2.dat兩個文件,這兩個文件是作為Crosstool的編譯的配置文件。其中arm.dat文件內容如下,主要用於定義配置文件、定義生成編譯工具鏈的名稱以及定義編譯選項等。

KERNELCONFIG='pwd'/arm.config#內核的配置
TARGET=arm-linux#編譯生成的工具鏈名稱
TARGET_CFLAGS="-O"#編譯選項


gcc-3.3.6-glibc-2.3.2.dat文件內容如下,該文件主要定義編譯過程中所需要的庫以及它定義的版本,如果在編譯過程中發現有些庫不存在時,Crosstool會自動在相關網站上下載,該工具在這點上相對比較智能,也非常有用。

BINUTILS_DIR=binutils-2.19
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.10-8(根據實際情況填寫)
GDB_DIR=gdb-6.5
  • 執行腳本

將Crosstool的腳本文件和配置文件准備好之後,開始執行arm.sh腳本來編譯交叉編譯工具。具體執行命令如下:

#cdcrosstool-0.43
#./arm.sh

經過數小時的漫長編譯之後,會在/opt/crosstool目錄下生成新的交叉編譯工具,其中包括以下內容:

arm-linux-addr2linearm-linux-g++arm-linux-ldarm-linux-size
arm-linux-ararm-linux-gccarm-linux-nmarm-linux-strings
arm-linux-asarm-linux-gcc-3.3.6arm-linux-objarm-linux-strip
arm-linux-c++arm-linux-gccbugarm-linux-objmpfix-embedded-paths
arm-linux-c++filtarm-linux-gcovarm-linux-ranlib
arm-linux-cpparm-linux-gprofarm-linux-readelf
  • 添加環境變數

然後將生成的編譯工具鏈路徑添加到環境變數PATH上去,添加的方法是在系統/etc/ bashrc文件的最後添加下面一行,在bashrc文件中添加環境變數

export PATH=/home/jiabing/gcc-3.3.6-glibc-2.3.2/arm-linux-bin/bin:$PATH

至此,arm-linux下的交叉編譯工具鏈已經完成,現在就可以使用arm-linux-gcc來生成試驗箱上的程序了!












❼ 如何在windows上用ndk交叉編譯其他平台程序

目標 :編譯arm64的.so庫

編譯方法:理論上應該有兩種交叉編譯方法,法一,在Linux伺服器上安裝交叉工具鏈,直接用交叉工具鏈進行編譯鏈接;法二,使用ndk完成交叉編譯,因為

ndk已經安裝好交叉編譯工具鏈,以及相關的系統庫和系統頭文件了。這兩種方法的區別在於,linux伺服器上的編譯使用的makefile和ndk使用的.mk
文件顯然不同。原因是ndk作為一個集成編譯環境,制定了一套特定的規則用於生成最終的編譯腳本。

這里簡單總結下,如何在windows用ndk進行交叉編譯arm64目標平台的.so庫:

step1:找到ndk開發工具包,官網之類的都可以下載,Android-ndk64-r10-windows-x86_64.rar文件

step2:解壓上述ndk工具包,將包含程序源文件和頭文件的文件夾testProject都放入android-ndk-r10下的samples目錄下。

放在其他地方當然也可以,但是後續相對路徑之類的不太好加,既然其他例子都放這,把代碼放這編譯是最保險的了。

step3:在testProject中增加一個jni的文件夾,必須要添加!!!!!!

step4:在jni文件夾中,添加一個Android.mk的文件,必須要添加!!!!!

step5:在jni文件夾中,添加一個Application.mk的文件與Android.mk並列,必須要添加!!!!!

step6:Android.mk和Application.mk合起來就類似於linux環境下的makefile編譯文件。

如何寫Android.mk,可以參考例子helllo-jni中jni文件夾下的Android.mk。

LOCAL_PATH:=$(call my-dir) #必須要寫的

include $(CLEAR_VARS) #必須要寫的

LOCAL_MODULE:=hello-jni #編譯出來的模塊名稱

LOCAL_SRC_FILES:=hello-jni.c #制定編譯的源文件名稱

include $(BUILD_SHARED_LIBRARY)#放在最後

除了上述變數之外,還有其他的指定的變數,

LOCAL_CFLAGS,用於指定編譯選項,這個和makefile中是完全一樣的,可以指定編譯選項-g,也可以指定編譯宏及宏值

LOCAL_LDLIBS,用於指定鏈接的依賴庫,這個可以makefile也是完全一樣的,可以指定鏈接庫用-l庫名,以及指定庫搜索路徑用_L路徑名

LOCAL_STATIC_LIBRARIES,指定鏈接的靜態庫名,makefile中沒有

LOCAL_C_INCLUDES,用於指定編譯頭文件的路徑,和makefile中不同,路徑前不需要加-I,直接寫路徑即可,可以是相對路徑或絕對路徑,

多個路徑之間用空格隔開。

編寫上述Android.mk碰到的問題有,

(1)使用默認的系統自動載入stl庫頭文件總是出錯,只好手動在LOCAL_STATIC_LIBRARIES指定sources/cxx-stl/stlport/stlport來完成對#include<string>這種c++形式的頭文件載入

(2)使用$(SYSROOT)/usr/include來完成對系統庫頭文件的載入,結果找不到sem_t符號,只好指定platforms/android-L/arch-arm64/usr/include

step7:Application.mk編寫

APP_STL指定使用的stl移植庫,動態或者靜態都行

APP_CPPFLAGS,指定app編譯的編譯選項

APP_ABI指定abi規范類型,例如arm64-v8a,也可以寫成ALL就是把所有的類型全部編一編

APP_PLATFORM指定編譯的platform名稱,這里可以寫成android-L或者不指定全編。

step8:編譯完成後,運行。

啟動cmd,使用cd /D進行到testProject的jni目錄下

step9:將android-ndk-r10下的ndk-build.cmd直接拖拽到cmd中,此時直接敲回車,就可以編譯了。當然也可以加一個 clean,清除編譯中間文件。

step10:檢查下編譯結果,編譯成功後在testProject中多了兩個文件夾與jni並列的,libs和obj。
編譯鏈接後的結果就在libs中!

❽ 怎麼在ubuntu系統下安詳交叉編譯器

1.主機:ubuntu 10.10 gcc-4.4.5, kernel-2.6.35
sudo apt-get install bison flex build-essential patch libncurses5-dev
更新系統基本的編譯工具集
(用UBUNTU最大的好處就是可以 在線更新一些需要的系統包,APT-GET)
2 使用的是CROSSTOOL做的,需要的軟體包

第一個是工具鏈編譯腳本
第二個是2進制工具集
第三個是GCC-3.4.5的源代碼
第四個是依賴的LINUX標准函數庫
第五個是依賴的thread庫
第六個是LINUX代碼
(1).linux 源代碼其實是用了 在編譯的時候需要調用一些了linux庫文件和數據結構或者是頭文件,類似驅動開發依賴源代碼
(2).這個是可以指定的找到合適的就可以,不一定就是這個版本的
第七個是標准庫的頭文件了
3 UBUNTU10自帶的GCC版本是4.4.5 太高編譯會出現語法錯誤,所以安裝4.1的就好
sudo apt-get install gcc-4.1
sudo rm /usr/bin/gcc (刪除GCC,它只是個到gcc-4.3.2的軟鏈接文件)
sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc (建立GCC到gcc-4.1的軟鏈接)
(重新做個軟體連接指向4.1就好,這個可以在/usr/bin 下會出現:gcc-4.1 gcc-4.4)
4 修改 dash (ubuntu 默認的是 dash ,編譯指向的是bash)
ls -la /bin/sh
看到鏈接的是 dash ,則請運行以下命令
sudo dpkg-reconfigure dash
選擇 no 以刪除 dash
此處如果不改好的話,編譯時會出現錯
5 以上系統配置完成,下面開始修改腳本編譯(一下就是網上參考的了,很多的都是這么做的,謝謝那些真正看懂腳本的大牛們)

$tar –zxvf crosstool-0.43.tar.gz
$cd crosstool-0.43
在此目錄下可以看到有很多.sh腳本和.dat配置文件,每一個支持的處理器都有它所相應的腳本。http://www.linuxidc.com/假如選用demo- arm- softfloat.sh 就是建立目標為支持軟浮點的arm交叉編譯工具鏈。
3.修改demo-arm-softfloat.sh
$vim demo-arm-softfloat.sh
修改下面兩句
TARBALLS_DIR=$HOME/downloads //表示下載的源碼的存放目錄
RESULT_TOP=/opt/crosstools //表示生成的工具鏈的存放目錄
為:
TARBALLS_DIR=/home/linux/downloads(源碼存放目錄)
RESULT_TOP=/home/linux/crosstools(生成工具鏈目錄)
4.修改 gcc-3.4.5-glibc-2.3.6.dat
$ vim gcc-3.4.5-glibc-2.3.6.dat
修改內容為:
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.26.5(內核版本)
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6
5.修改glibc-2.3.6.tar.bz2包內的configure文件

case $ac_prog_version in
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
2.1[3-9]*) 《--------------------------------------------3920行
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
修改為
case $ac_prog_version in
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
2.[1-2][0-9]*) 《--------------------------------------------3920行
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
還有3981行也有這樣的代碼 一個是ld,一個是ar
6.$ ./ demo-arm-softfloat.sh
注意啊UBUNTU許可權管理很嚴格,在執行腳本前,最好的就是把crosstool腳本所在的目錄和幾個源文件的目錄設置成 777
腳本運行的第一個是創建build的目錄,在腳本所在的目錄下,然後是解壓所有的源文件,檢查所有的依賴關系,進行編譯
大概需要很長時間吧,我是睡覺醒來看看 好了,,,,,,呵呵
即使如此的工作,幹了2個通宵搞定,當然邊干我還在三國殺,,,,,,,
當然成功後,有點小激動,熬了一宿,失眠了,,,,亢奮中

❾ 如何交叉編譯mkfs.jffs2等工具鏈mtd-utils

首先說明一下:
在YAFFS2源文件的utils目錄下,執行make就可以生成 mkyaffs2image工具,執行
.(要製作yaffs2的目錄) (目標鏡像)/mkyaffs2image

acl_2.2.47.orig.tar.gz
lzo-2.03.tar.gz
mtd-utils_20080508.orig.tar.gz
zlib-1.2.3.tar.gz
mkfs.jffs2.for.arm-linux-gcc.3.4.1平台.tar.bz2
mkfs.jffs2.for.arm-linux-gcc.4.3.2平台.tar.bz2
mkfs.jffs2.for.pc平台.tar.bz2

如果只需要mkfs.jffs2工具,那麼ubuntu 8.10下直接安裝jffnms軟體包即可,
luther@gliethttp:~$ sudo apt-get install jffnms
如果需要將jffs2移植到arm開發板上,那麼就需要下載源碼進行交叉編譯了,這就是本文的內容.
1.下載工具軟體源碼包
luther@gliethttp:~$ wget http://ftp.de.debian.org/debian/pool/main/m/mtd-utils/mtd-utils_20080508.orig.tar.gz
luther@gliethttp:~$ wget http://www.zlib.net/zlib-1.2.3.tar.gz
luther@gliethttp:~$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
luther@gliethttp:~$ mkdir libs 用來存放下面生成的lib庫.
2.編譯zlib庫
luther@gliethttp:~/zlib-1.2.3$ ./configure --prefix=~/libs --shared
對於交叉編譯輸入如下指令
luther@gliethttp:~/zlib-1.2.3$ CC=arm-linux-gcc ./configure --prefix=~/libs --shared
luther@gliethttp:~/zlib-1.2.3$ make -j4
luther@gliethttp:~/zlib-1.2.3$ make install
luther@gliethttp:~$ tree ~/libs
/home/ubuntu/libs
|-- include
| |-- zconf.h
| `-- zlib.h
|-- lib
| |-- libz.so -> libz.so.1.2.3
| |-- libz.so.1 -> libz.so.1.2.3
| `-- libz.so.1.2.3
`-- share
`-- man
`-- man3
`-- zlib.3
5 directories, 6 files
這就表示完成了.
3.編譯lzo庫
luther@gliethttp:~/lzo-2.03$ ./configure --prefix=/home/ubuntu/libs --enable-shared
對於交叉編譯輸入如下指令
luther@gliethttp:~/lzo-2.03$ CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/home/ubuntu/libs --enable-shared --disable-static
這個還必須要絕對路徑才行.
luther@gliethttp:~/lzo-2.03$ make
luther@gliethttp:~/lzo-2.03$ make install
luther@gliethttp:~$ tree ~/libs
.
|-- include
| |-- lzo
| | |-- lzo1.h
| | |-- lzo1a.h
| | |-- lzo1b.h
| | |-- lzo1c.h
| | |-- lzo1f.h
| | |-- lzo1x.h
| | |-- lzo1y.h
| | |-- lzo1z.h
| | |-- lzo2a.h
| | |-- lzo_asm.h
| | |-- lzoconf.h
| | |-- lzodefs.h
| | `-- lzoutil.h
| |-- zconf.h
| `-- zlib.h
|-- lib
| |-- liblzo2.a
| |-- liblzo2.la
| |-- liblzo2.so -> liblzo2.so.2.0.0
| |-- liblzo2.so.2 -> liblzo2.so.2.0.0
| |-- liblzo2.so.2.0.0
| `-- libz.a
`-- share
`-- man
`-- man3
`-- zlib.3
6 directories, 22 files
手工將靜態庫刪掉就行了,
如果是arm平台還需要strip優化.
4.編譯mtd-utils-20080508前的准備工作.
編譯之前的代碼工作
luther@gliethttp:~$ wget http://ftp.de.debian.org/debian/pool/main/a/acl/acl_2.2.47.orig.tar.gz
luther@gliethttp:~$ mkdir libs/include/sys -p
luther@gliethttp:~$ cp acl-2.2.47/include/acl.h libs/include/sys
luther@gliethttp:~/mtd-utils-20080508$ export LD_LIBRARY_PATH=~/libs/lib:$LD_LIBRARY_PATH
如果還找不到-llzo2,那麼把他拷到/usr/lib下,對於交叉編譯器,就是拷貝到
比如
luther@gliethttp:~/libs/lib$ sudo cp -a * /vobs/tools/arm-tools/arm-linux-gcc-3.4.1/arm-linux/lib/
luther@gliethttp:~/mtd-utils-20080508$ vim Makefile
修改安裝路徑
DESTDIR=.
SBINDIR=gliethttp/sbin
MANDIR=gliethttp/share/man
INCLUDEDIR=gliethttp/include
修改CFLAGS變數
CFLAGS := -I./include -I/home/ubuntu/libs/include $(OPTFLAGS)
如果是arm-linux-gcc定義為
CFLAGS := -I./include -I/home/ubuntu/libs/include -DAI_ADDRCONFIG=0x0020 $(OPTFLAGS)
來自/usr/include/netdb.h
luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/Makefile
DESTDIR := ~/mtd-utils-20080508
SBINDIR=gliethttp/sbin
MANDIR=gliethttp/share/man
INCLUDEDIR=gliethttp/include
luther@gliethttp:~/mtd-utils-20080508$ vim recv_image.c
拷貝/usr/include/netinet/in.h文件中
arm-linux-gcc中不需要拷貝它.
struct ip_mreq
{

struct in_addr imr_multiaddr;

struct in_addr imr_interface;
};
結構體數據到頭部,否則在u盤版的ubuntu 8.10上老是提示沒有ip_mreq定義,雖然上面明明寫了#define _USE_MISC
arm-linux-gcc中還需要創建如3下個目錄
luther@gliethttp:~/mtd-utils-20080508$ mkdir arm-linux
luther@gliethttp:~/mtd-utils-20080508$ cp -r ubi-utils arm-linux/
luther@gliethttp:~/mtd-utils-20080508$ cp -r include arm-linux/
luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/libpfiflash.c
將所有EBUF(PFIFLASH_ERRSTR[-rc]);全部替換為EBUF("%s", PFIFLASH_ERRSTR[-rc]);
vim下替換腳本為
:%s/EBUF(PFIFLASH_ERRSTR\[-rc\]);/EBUF("\%s", PFIFLASH_ERRSTR\[-rc\]);/g
luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/ubimirror.c
將第206行的
fprintf(stderr, err_buf);
改為
fprintf(stderr, "%s", err_buf); // 想法是好的,因為err_buf中含有%d等format信息,這樣介面更加統一,但是編譯器似乎還並不支持這樣的操作.[luther.gliethttp]
luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/unubi.c
將第898行
char fname[PATH_MAX];
改為
char fname[PATH_MAX+1];
luther@gliethttp:~/mtd-utils-20080508$ cd ubi-utils/new-utils
因為-O2優化的原因,會導致如下log信息
error: ignoring return value of 『scanf』, declared with attribute warn_unused_result
所有手工先編譯.o
luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ gcc -Iinclude -Isrc -I../../include -Wall -Werror -Wall src/ubiformat.c -c -o ubiformat.o
對於交叉編譯執行如下1條語句
luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ arm-linux-gcc -Iinclude -Isrc -I../../include -Wall -Werror -Wall src/ubiformat.c -c -o ubiformat.o
luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ cd -
好了,上面的所有修改完成之後,就可以執行make成功編譯了[luther.gliethttp].
luther@gliethttp:~/mtd-utils-20080508$ make
如果是交叉編譯,執行
luther@gliethttp:~/mtd-utils-20080508$ make CROSS=arm-linux-
luther@gliethttp:~/mtd-utils-20080508$ make install
對於交叉編譯,執行
luther@gliethttp:~/mtd-utils-20080508$ make CROSS=arm-linux- install
luther@gliethttp:~/mtd-utils-20080508$ tree gliethttp/
gliethttp/
|-- sbin
| |-- bin2nand
| |-- doc_loadbios
| |-- docfdisk
| |-- flash_erase
| |-- flash_eraseall
| |-- flash_info
| |-- flash_lock
| |-- flash_otp_mp
| |-- flash_otp_info
| |-- flash_unlock
| |-- flashcp
| |-- ftl_check
| |-- ftl_format
| |-- jffs2mp
| |-- mkbootenv
| |-- mkfs.jffs2
| |-- mkpfi
| |-- mtd_debug
| |-- nand2bin
| |-- nandmp
| |-- nandtest
| |-- nandwrite
| |-- nftl_format
| |-- nftlmp
| |-- pddcustomize
| |-- pfi2bin
| |-- pfiflash
| |-- recv_image
| |-- rfdmp
| |-- rfdformat
| |-- serve_image
| |-- sumtool
| |-- ubiattach
| |-- ubicrc32
| |-- ubicrc32.pl
| |-- ubidetach
| |-- ubigen
| |-- ubimirror
| |-- ubimkvol
| |-- ubinfo
| |-- ubinize
| |-- ubirmvol
| |-- ubiupdatevol
| `-- unubi
`-- share
`-- man
`-- man1
`-- mkfs.jffs2.1.gz
4 directories, 45 files
ep9312開發板上沒有任何文件系統flash數據讀取
# ./mtd_debug read /dev/mtd0 0 100 gliethttp.bin
Copied 100 bytes from address 0x00000000 in flash to gliethttp.bin
# hexmp gliethttp.bin
0000000 03ff ea00 350c e59f 001c e583 410e e3a0
0000010 4004 e583 4a03 e3a0 4001 e254 fffd 1aff
0000020 4106 e3a0 4004 e583 420f e202 5000 e594
0000030 4001 e084 5000 e594 4001 e084 5000 e594
0000040 4001 e084 5000 e594 4010 e3a0 4008 e583
0000050 4050 e3a0 4001 e254 fffd 1aff 4e1e e3a0
0000060 4008 e583
0000064
#
# ./mtd_debug read /dev/mtd2 0 100 gliethttp.bin;hexmp gliethttp.bin -Cv
Copied 100 bytes from address 0x00000000 in flash to gliethttp.bin
00000000 1f 8b 08 00 ca 14 7d 4a 02 03 e4 5a 0f 70 93 e7 |......}J...Z.p..|
00000010 79 7f 3f 49 36 b2 31 41 80 a0 0e 38 cd 57 70 16 |y.?I6.1A...8.Wp.|
00000020 93 18 f3 19 3b 60 12 9a d9 60 08 09 4e 22 c0 a4 |....;`...`..N"..|
00000030 b4 81 ca 42 92 6d 0d 59 d2 49 72 02 2b 4d dd 60 |...B.m.Y.Ir.+M.`|
00000040 72 84 e1 86 03 a7 21 01 8a d2 b2 4b 2e f3 56 76 |r.....!....K..Vv|
00000050 63 b7 34 0b 1d cd b1 1d 6b b3 95 36 dc 95 db d1 |c.4.....k..6....|
00000060 8b 90 d1 ea |....|
00000064