當前位置:首頁 » 編程軟體 » tcpdump交叉編譯

tcpdump交叉編譯

發布時間: 2022-09-05 08:36:23

『壹』 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.

『貳』 arm-linux-gcc已安裝,可是編譯是總是出現arm-none-linux-gnueabi-gcc:命令未找到

cc1: error: invalid option `abi=apcs-gnu'

你的交叉編譯器有問題吧……

看看這個解決辦法:
http://blog.sina.com.cn/s/blog_538376bd01000a2c.html

不過要我說,弄嵌入式首先要會自己做交叉編譯工具,直接拿別人的,出問題只能在那裡傻坐著。
其實自己編譯個最新版本的交叉編譯工具,我的 core 2 dou T5450 其實也就需要三個小時搞定。當然我這是全自動的,你手動半天也夠了吧?
自己編譯一個 gcc 4.4.2 + binutils 2.20.1 + glibc 2.11 + kernel-header 2.6.33 也不需要多麻煩吧?
至少自己編譯起程序來不會出現各種 XXOO 的問題。

『叄』 gcc交叉編譯怎麼找頭文件及lib庫的

是在specs裡面讀取的路徑信息。
命令行中鍵入 gcc -v
Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs
Configured with: /usr/build/package/orig/test.respin/gcc-3.4.4-3/configure --ver
bose --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libe
xecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-langu
ages=c,ada,c++,d,f77,pascal,java,objc --enable-nls --without-included-gettext --
enable-version-specific-runtime-libs --without-x --enable-libgcj --disable-java-
awt --with-system-zlib --enable-interpreter --disable-libgcj-debug --enable-thre
ads=posix --enable-java-gc=boehm --disable-win32-registry --enable-sjlj-exceptio
ns --enable-hash-synchronization --enable-libstdcxx-debug
Thread model: posix
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)

注意「--prefix=/usr」 以及「--libdir=/usr/lib 」
表示gcc ld as 等可執行文件安裝在/usr/bin,而libc.a 等文件是在/usr/lib中。
壓縮交叉編譯器時,也是要解壓縮在在--prefix 指定的目錄下。
比如 下載了arm-linux 的交叉編譯器cross-3.3.2.tar.bz2,解壓縮之後,運行 arm-linux-gcc -v
得到 --prefix=/usr/local/arm。那麼就要把 bin lib 等所有的文件和文件夾到/usr/local/arm目錄下。
否則到時候運行arm-linux-gcc hello.c會提示找不到stdio.h 或者 lib.so.6 等

HOWTO Use the GCC specs file

About Specs file
The "gcc" program invoked by users is a convenient front-end driver executable which will invoke other programs in the background such as cc1, as or ld to do its work according to the command line parameter given. A specs file is plain text used to control the default behavior for the "gcc" front-end. The specs file is usually built-in but for flexibility purposes, it can be overridden with an external version.
Basic Specs file modifications
CC will proce a specs file via the following command.
gcc -mpspecs > specs
You may use a text editor of your choice to inspect it. It may be confusing at first, but there are many places of interest. To use the specs file, invoke gcc with -specs= or place it at "/mingw/lib/gcc/mingw32//specs" to make GCC use it by default, where refers to the GCC version installed.
Adding include directories to the search path
& #160;he *cpp: section should be modified. It contains the following by default:
*cpp:
%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT}
If "z:\libx\include" needs to be added to the GCC includes search path, it should be changed to the following
*cpp:
%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} -I/z/libx/include
Adding lib directories to the search path
& #160;he *link_libgcc: section should be modified. It contains the following by default:
*link_libgcc:
%D
& #160;f "z:\libx\lib" needs to be added to the GCC library search path, it should be changed to the following
*link_libgcc:
%D -L/z/libx/lib

『肆』 如何在linux平台構建基於newlib工具鏈

交叉編譯通俗地講就是在一種平台上編譯出能運行在體系結構不同的另一種平台上的程式,比如在PC平台(X86 CPU)上編譯出能運行在以ARM為內核的CPU平台上的程式,編譯得到的程式在X86 CPU平台上是不能運行的,必須放到ARM CPU平台上才能運行,雖然兩個平台用的都是Linux系統。這種方法在異平台移植和嵌入式研發時非常有用。相對和交叉編譯,平常做的編譯叫本地編譯,也就是在當前平台編譯,編譯得到的程式也是在本地執行。用來編譯這種跨平台程式的編譯器就叫交叉編譯器,相對來說,用來做本地編譯的工具就叫本地編譯器。所以要生成在目標機上運行的程式,必須要用交叉編譯工具鏈來完成。在裁減和制定Linux內核用於嵌入式系統之前,由於一般嵌入式研發系統存儲大小有限,通常都要在性能優越的PC上建立一個用於目標機的交叉編譯工具鏈,用該交叉編譯工具鏈在PC上編譯目標機上要運行的程式。交叉編譯工具鏈是個由編譯器、連接器和解釋器組成的綜合研發環境,交叉編譯工具鏈主要由binutils、gcc和glibc 3個部分組成。有時出於減小 libc 庫大小的考慮,也能用別的 c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。建立交叉編譯工具鏈是個相當復雜的過程,如果不想自己經歷復雜繁瑣的編譯過程,網上有一些編譯好的可用的交叉編譯工具鏈能下載,但就以學習為目的來說讀者有必要學習自己製作一個交叉編譯工具鏈。本章通過具體的實例講述基於ARM的嵌入式Linux交叉編譯工具鏈的製作過程。 構建交叉編譯器的第一個步驟就是確定目標平台。在GNU系統中,每個目標平台都有一個明確的格式,這些信息用於在構建過程中識別要使用的不同工具的正確版本。因此,當在一個特定目標機下運行GCC時,GCC便在目錄路徑中查找包含該目標規范的應用程式路徑。GNU的目標規范格式為CPU-PLATFORM-OS。例如x86/i386 目標機名為i686-pc-linux-gnu。本章的目的是講述建立基於ARM平台的交叉工具鏈,所以目標平台名為arm-linux-gnu。 通常構建交叉工具鏈有3種方法。 方法一 分步編譯和安裝交叉編譯工具鏈所需要的庫和原始碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法二或方法三構建交叉工具鏈。 方法二 通過Crosstool腳本工具來實現一次編譯生成交叉編譯工具鏈,該方法相對於方法一要簡單許多,並且出錯的機會也非常少,建議大多數情況下使用該方法構建交叉編譯工具鏈。 方法三 直接通過網上(ftp.arm.kernel.org.uk)下載已製作好的交叉編譯工具鏈。該方法的好處不用多說,當然是簡單省事,但和此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的沒有靈活性,所以構建所用的庫及編譯器的版本也許並不適合你要編譯的程式,同時也許會在使用時出現許多莫名的錯誤,建議讀者慎用此方法。 為了讓讀者真正的學習交叉編譯工具鏈的構建,下面將重點周詳地介紹前兩種構建ARM Linux交叉編譯工具鏈的方法。 2.2.1 分步構建交叉編譯鏈 分步構建,顧名思義就是一步一步地建立交叉編譯鏈,不同於2.2.2節中講述的Crosstool腳本工具一次編譯生成的方法,該方法適合那些希望深入學習了解構建交叉編譯工具鏈的讀者。該方法相對來說難度較大,通常情況下困難重重,猶如唐僧西天取經,不過本文會盡可能周詳地介紹構建的每一個步驟,讀者完萬能根據本節的內容自己獨立實踐,構建自己的交叉工具鏈。該過程所需的時間較長,希望讀者有較強的耐心和毅力去學習和實踐他,通過實踐能使讀者更加清晰交叉編譯器的構建過程及各個工具包的作用。該方法所需資源如表2.1所示。 表2.1 所需資源 安裝包 下載地址 安裝包 下載地址 linux-2.6.10.tar.gz ftp.kernel.org glibc-2.3.2.tar.gz ftp.gnu.org binutils-2.15.tar.bz2 ftp.gnu.org glibc-linuxthreads-2.3.2.tar.gz ftp.gnu.org gcc-3.3.6.tar.gz ftp.gnu.org 通過相關站點下載以上資源後,就能開始建立交叉編譯工具鏈了。 1.建立工作目錄 首先建立工作目錄,工作目錄就是在什麼目錄下構建交叉工具鏈,目錄的構建一般沒有特別的需求,能根據個人喜好建立。以下所建立的目錄是作者自定義的,當前的用戶定義為mike,因此用戶目錄為/home/mike,在用戶目錄下首先建立一個工作目錄(armlinux),建立工作目錄的命令行操作如下: # cd /home/mike # mkdir armlinux 再在這個工作目錄armlinux下建立3個目錄 build-tools、kernel 和 tools。具體操作如下: # cd armlinux # mkdir build-tools kernel tools 其中各目錄的作用如下。 ● build-tools 用來存放下載的binutils、gcc、glibc等原始碼和用來編譯這些原始碼的目錄; ● kernel 用來存放內核原始碼; ● tools 用來存放編譯好的交叉編譯工具和庫文件。 2.建立環境變數 該步驟的目的是為了方便重復輸入路徑,因為重復操作每件相同的事情總會讓人覺得非常麻煩,如果讀者不習慣使用環境變數就能略過該步,直接輸入絕對路徑就能。聲明以下環境變數的目的是在之後編譯工具庫的時候會用到,非常方便輸入,尤其是能降低輸錯路徑的風險。 # export PRJROOT=/home/mike/armlinux # export TARGET=arm-linux # export PREFIX=$PRJROOT/tools # export TARGET_PREFIX=$PREFIX/$TARGET # export PATH=$PREFIX/bin:$PATH 注意,用export聲明的變數是臨時的變數,也就是當注銷或更換了控制台,這些環境變數就消失了,如果還需要使用這些環境變數就必須重復export操作,所以有時會非常麻煩。值得慶幸的是,環境變數也能定義在bashrc文件中,這樣當注銷或更換控制台時,這些變數就一直有效,就不用老是export這些變數了。 3.編譯、安裝Binutils Binutils是GNU工具之一,他包括連接器、匯編器和其他用於目標文件和檔案的工具,他是二進制代碼的處理維護工具。安裝Binutils工具包含的程式有addr2line、ar、as、c++filt、gprof、ld、nm、obj、objmp、ranlib、readelf、size、strings、strip、libiberty、libbfd和libopcodes。對這些程式的簡單解釋如下。 ● addr2line 把程式地址轉換為文件名和行號。在命令行中給他一個地址和一個可執行文件名,他就會使用這個可執行文件的調試信息指出在給出的地址上是哪個文件及行號。 ● ar 建立、修改、提取歸檔文件。歸檔文件是包含多個文件內容的一個大文件,其結構確保了能恢復原始文件內容。 ● as 主要用來編譯GNU C編譯器gcc輸出的匯編文件,產生的目標文件由連接器ld連接。 ● c++filt 連接器使用他來過濾 C++ 和 Java 符號,防止重載函數沖突。 ● gprof 顯示程式調用段的各種數據。 ● ld 是連接器,他把一些目標和歸檔文件結合在一起,重定位數據,並連接符號引用。通常,建立一個新編譯程式的最後一步就是調用ld。 ● nm 列出目標文件中的符號。 ● obj 把一種目標文件中的內容復制到另一種類型的目標文件中。 ● objmp 顯示一個或更多目標文件的信息。使用選項來控制其顯示的信息,他所顯示的信息通常只有編寫編譯工具的人才感興趣。 ● ranlib 產生歸檔文件索引,並將其保存到這個歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標文件。 ● readelf 顯示elf格式可執行文件的信息。 ● size 列出目標文件每一段的大小及總體的大小。默認情況下,對於每個目標文件或一個歸檔文件中的每個模塊只產生一行輸出。 ● strings 列印某個文件的可列印字元串,這些字元串最少4個字元長,也能使用選項-n設置字元串的最小長度。默認情況下,他只列印目標文件初始化和可載入段中的可列印字元;對於其他類型的文件他列印整個文件的可列印字元。這個程式對於了解非文本文件的內容非常有幫助。 ● strip 丟棄目標文件中的全部或特定符號。 ● libiberty 包含許多GNU程式都會用到的函數,這些程式有getopt、obstack、strerror、strtol和strtoul。 ● libbfd 二進制文件描述庫。 ● libopcode 用來處理opcodes的庫,在生成一些應用程式的時候也會用到他。 Binutils工具安裝依賴於Bash、Coreutils、Diffutils、GCC、Gettext、Glibc、Grep、Make、Perl、Sed、Texinfo等工具。 介紹完Binutils工具後,下面將分步介紹安裝binutils-2.15的過程。 首先解壓binutils-2.15.tar.bz2包,命令如下: # cd $PRJROOT/build-tools # tar -xjvf binutils-2.15.tar.bz2 接著設置Binutils工具,建議建立一個新的目錄用來存放設置和編譯文件,這樣能使源文件和編譯文件獨立開,具體操作如下: # cd $PRJROOT/build-tools # mkdir build-binutils # cd build-binutils # ../ binutils-2.15/configure --target=$TARGET --prefix=$PREFIX 其中選項?target的意思是制定生成的是 arm-linux 的工具,--prefix 是指出可執行文件安裝的位置。執行上述操作會出現非常多check信息,最後產生 Makefile 文件。接下來執行make和安裝操作,命令如下: # make # make install 該編譯過程較慢,需要數十分鍾,安裝完成後查看/home/mike/armlinux/tools/bin目錄下的文件,如果查看結果如下,表明此時Binutils工具已安裝結束。 # ls $PREFIX/bin arm-linux-addr2line arm-linux-ld arm-linux-ranlib arm-linux-strip arm-linux-ar arm-linux-nm arm-linux-readelf arm-linux-as arm-linux-obj arm-linux-size arm-linux-c++filt arm-linux-objmp arm-linux-strings 4.獲得內核頭文件 編譯器需要通過系統內核的頭文件來獲得目標平台所支持的系統函數調用所需要的信息。對於Linux內核,最佳的方法是下載一個合適的內核,然後復制獲得頭文件。需要對內核做一個基本的設置來生成正確的頭文件;不過,不必編譯內核。對於本例中的目標arm-linux,需要以下步驟。 (1)在kernel目錄下解壓linux-2.6.10.tar.gz內核包,執行命令如下: # cd $PRJROOT/kernel # tar -xvzf linux-2.6.10.tar.gz (2)接下來設置編譯內核使其生成正確的頭文件,執行命令如下: # cd linux-2.6.10 # make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig 其中ARCH=arm表示是以arm為體系結構,CROSS_COMPILE=arm-linux-表示是以arm-linux-為前綴的交叉編譯器。也能用config和xconfig來代替menuconfig,推薦用make menuconfig,這也是內核研發人員用的最多的設置方法。注意在設置時一定要選擇處理器的類型,這里選擇三星的S3C2410(System Type->ARM System Type->/Samsung S3C2410),如圖2.1所示。設置完退出並保存,檢查一下內核目錄中的include/linux/version.h和include/linux/autoconf.h文件是不是生成了,這是編譯glibc時要用到的,如果version.h 和 autoconf.h 文件存在,說明生成了正確的頭文件。 screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt=』Click here to open new window\nCTRL+Mouse wheel to zoom in/out』;}" border=0> 圖2.1 Linux 2.6.10內核設置界面 復制頭文件到交叉編譯工具鏈的目錄,首先需要在/home/mike/armlinux/tools/arm-linux目錄下建立工具的頭文件目錄inlcude,然後復制內核頭文件到此目錄下,具體操作如下: # mkdir -p $TARGET_PREFIX/include # cp -r $PRJROOT/kernel/linux-2.6.10/include/linux $TARGET_PREFIX/include # cp -r $PRJROOT/kernel/linux-2.6.10/include/asm-arm $TARGET_PREFIX/include/asm 5.編譯安裝boot-trap gcc 這一步的目的主要是建立arm-linux-gcc工具,注意這個gcc沒有glibc庫的支持,所以只能用於編譯內核、BootLoader等不必C庫支持的程式,後面創建C庫也要用到這個編譯器,所以創建他主要是為創建C庫做准備,如果只想編譯內核和BootLoader,那麼安裝完這個就能到此結束。安裝命令如下: # cd $PRJROOT/build-tools # tar -xvzf gcc-3.3.6.tar.gz # mkdir build-gcc # cd gcc-3.3.6 # vi gcc/config/arm/t-linux 由於是第一次安裝ARM交叉編譯工具,沒有支持libc庫的頭文件,所以在gcc/config/arm/t- linux文件中給變數TARGET_LIBGCC2_CFLAGS增加操作參數選項-Dinhibit_libc -D__gthr_ posix_h來屏蔽使用頭文件,否則一般默認會使用/usr/inlcude頭文件。 將TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer ?fPIC改為TARGET_LIBGCC2- CFLAGS=-fomit-frame-pointer-fPIC -Dinhibit_libc -D__gthr_posix_h 修改完t-linux文件後保存,緊接著執行設置操作,如下命令: # cd build-gcc # ../ build-gcc /configure --target=$TARGET --prefix=$PREFIX --enable-languages=c --disable-threads --disable-shared 其中選項--enable-languages=c表示只支持C語言,--disable-threads表示去掉thread功能,這個功能需要glibc的支持。--disable-shared表示只進行靜態庫編譯,不支持共享庫編譯。 接下來執行編譯和安裝操作,命令如下: # make # make install 安裝完成後,在/home/mike/armlinux/tools/bin下查看,如果arm-linux-gcc等工具已生成,表示boot-trap gcc工具已安裝成功。 6.建立glibc庫 glibc是GUN C庫,他是編譯Linux系統程式非常重要的組成部分。安裝glibc-2.3.2版本之前推薦先安裝以下的工具: ● GNU make 3.79或更新; ● GCC 3.2或更新; ● GNU binutils 2.13或更新。 首先解壓glibc-2.2.3.tar.gz和glibc-linuxthreads-2.2.3.tar.gz原始碼,操作如下: # cd $PRJROOT/build-tools # tar -xvzf glibc-2.2.3.tar.gz # tar -xzvf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3 然後進行編譯設置,glibc-2.2.3設置前必須新建一個編譯目錄,否則在glibc-2.2.3目錄下不允許進行設置操作,此處在$PRJROOT/build-tools目錄下建立名為build-glibc的目錄,設置操作 如下: # cd $PRJROOT/build-tools # mkdir build-glibc # cd build-glibc # CC=arm-linux-gcc ../glibc-2.2.3 /configure --host=$TARGET --prefix="/usr" --enable-add-ons --with-headers=$TARGET_PREFIX/include 選項CC=arm-linux-gcc是把CC(Cross Compiler)變數設成剛編譯完的gcc,用他來編譯glibc。--prefix="/usr"定義了一個目錄用於安裝一些和目標機器無關的數據文件,默認情況下是/usr/local目錄。--enable-add-ons是告訴glibc用linuxthreads包,在上面已將他放入glibc原始碼目錄中,這個選項等價於-enable-add-ons=linuxthreads。--with-headers告訴glibc linux內核頭文件的目錄 位置。 設置完後就能編譯和安裝 glibc了,具體操作如下: # make # make install 7.編譯安裝完整的gcc 由於第一次安裝的gcc沒有交叉glibc的支持,目前已安裝了glibc,所以需要重新編譯來支持交叉glibc。並且上面的gcc也只支持C語言,目前能讓他同時支持C語言還要和C++語言。具體操作如下: # cd $PRJROOT/build-tools/gcc-2.3.6 # ./configure --target=arm-linux --enable-languages=c,c++ --prefix=$PREFIX # make # make install 安裝完成後會發目前$PREFIX/bin目錄下又多了arm-linux-g++ 、arm-linux-c++等文件。 # ls $PREFIX/bin arm-linux-addr2line arm-linux-g77 arm-linux-gnatbind arm-linux-ranlib arm-linux-ar arm-linux-gcc arm-linux-jcf-mp arm-linux-readelf arm-linux-as arm-linux-gcc-3.3.6 arm-linux-jv-scan arm-linux-size arm-linux-c++ arm-linux-gccbug arm-linux-ld arm-linux-strings arm-linux-c++filt arm-linux-gcj arm-linux-nm arm-linux-strip arm-linux-cpp arm-linux-gcjh arm-linux-obj grepjar arm-linux-g++ arm-linux-gcov arm-linux-objmp jar 8.測試交叉編譯工具鏈 到此為止,已介紹完了用分步構建的方法建立交叉編譯工具鏈。下面通過一個簡單的程式測試剛剛建立的交叉編譯工具鏈看是否能夠正常工作。寫一個最簡單的hello.c源文件,內容如下: #include int main( ) { printf(「Hello,world!\n」); return 0; } 通過以下命令進行編譯,編譯後生成名為hello的可執行文件,通過file命令能查看文件的類型。當顯示以下信息時表明交叉工具鏈正常安裝了,通過編譯生成了ARM體系可執行的文件。注意,通過該交叉編譯鏈編譯的可執行文件只能在ARM體系下執行,不能在基於X86的普通PC上執行。 # arm-linux-gcc -o hello hello.c # file hello hello: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.4.3, dynamically linked (uses shared libs), not stripped 2.2.2 用Crosstool工具構建交叉工具鏈 Crosstool是一組腳本工具集,可構建和測試不同版本的gcc和glibc,用於那些支持glibc的體系結構。他也是個開源項目,下載地址是http://kegel.com/crosstool。用Crosstool構建交叉工具鏈要比上述的分步編譯容易得多,並且也方便許多,對於僅僅為了工作需要構建交叉編譯工具鏈的讀者建議使用此方法。用Crosstool工具構建所需資源如表2.2所示。

『伍』 如何將tcpmp移植到arm嵌入式系統

1.在http://www.tcpmp.org下載libpcap-0.9.8.tar.gz和tcpmp-3.9.8.tar.gz兩個文件。

2.將這兩個文件放在/home下解壓。

3.編譯,安裝libpcap-0.9.8:

(1)進入libpcap目錄,打開configure。將下面兩端代碼注釋掉

#if test
-z "$with_pcap" && test
"$cross_compiling" = yes; then
# { {
echo "$as_me:$LINENO:
error: pcap type not determined when
cross-compiling; use --with-pcap=..."
>&5
#echo "$as_me:
error: pcap type not determined when
cross-compiling; use --with-pcap=..."
>&2;}
# { (exit 1);
exit 1; }; }
#fi
.......
# if test $ac_cv_linux_vers =
unknown ; then
# {
{ echo
"$as_me:$LINENO:
error: cannot determine linux version when
cross-compiling" >&5
#echo "$as_me:
error: cannot determine linux version when
cross-compiling"
>&2;}
# { (exit 1);
exit 1; }; }
# fi

運行./configure
--host=arm-linux(如果不注釋掉上面兩段代碼,可能會出現determine linux version when
cross-compiling或pcap type not determined when
cross-compiling導致無法configure)。運行開始的時候可能會出現個warning說不能用--host,configure的時候會自動識別交叉編譯,但事實上不是這樣,還是需要./configure
--host=arm-linux才會識別用什麼交叉編譯。

(2)配置之後,會生成Makefile。打開Makefile發現CC=arm-linux-gcc,說明交叉編譯配置成功。但還需要把prefix項為prefix=/usr/local/arm/3.4.1/arm-linux。然後make,make
install。發現/usr/local/arm/3.4.1/arm-linux/include有了3個pcap文件,libpcap編譯安裝成功。
3.編譯,安裝tcpmp-3.9.8

(1)進入tcpmp目錄,打開configure,將下面一段代碼注釋掉

# if test
$ac_cv_linux_vers = unknown ; then
# {
{ echo
"$as_me:$LINENO:
error: cannot determine linux version when
cross-compiling" >&5
#echo "$as_me:
error: cannot determine linux version when
cross-compiling"
>&2;}
# { (exit 1);
exit 1; }; }
# fi

運行./configure
--host=arm-linux

(2)打開生成的Makefile,將INCLS項改為INCLS=-I.-I./../libpcap-0.9.8
-I$(srcdir)/missing -I/usr/local/include,

DEFS項改為DEFS=-DHAVE_CONFIG_H -I./../libpcap-0.9.8
-I/usr/local/include
-I$(srcdir)missing -D_U="__attribute__((unused))"。

LDFLAGS=-L/usr/local/lib。然後make,make
install。在/usr/local/sbin下有個tcpmp的二進制文件,這個就是交叉編譯成功的tcpmp

(3)將這個二進制文件放到tftpboot文件夾,用過tftp將這個文件下載到arm板上,chmod
777 tcpmp將其變為可執行文件。

(4)運行tcpmp,成功!

『陸』 如何將tcpmp移植到arm嵌入式系統

(1)進入tcpmp目錄,打開configure,將下面一段代碼注釋掉
# if test $ac_cv_linux_vers = unknown ; then
# { { echo "$as_me:$LINENO: error: cannot determine linux version when cross-compiling" >&5
#echo "$as_me: error: cannot determine linux version when cross-compiling" >&2;}
# { (exit 1); exit 1; }; }
# fi
運行./configure --host=arm-linux
(2)打開生成的Makefile,將INCLS項改為INCLS=-I.-I./../libpcap-0.9.8 -I$(srcdir)/missing -I/usr/local/include,
DEFS項改為DEFS=-DHAVE_CONFIG_H -I./../libpcap-0.9.8 -I/usr/local/include -I$(srcdir)missing -D_U="__attribute__((unused))"。
LDFLAGS=-L/usr/local/lib。然後make,make install。在/usr/local/sbin下有個tcpmp的二進制文件,這個就是交叉編譯成功的tcpmp
(3)將這個二進制文件放到tftpboot文件夾,用過tftp將這個文件下載到arm板上,chmod 777 tcpmp將其變為可執行文件。
(4)運行tcpmp,成功!

『柒』 交叉編譯libnpg庫 ./configure CC=mipsisa32-elf-gcc --host=mipsisa32-linux 求大神給予幫助

編譯安裝。關鍵要看configure後,屏幕上出現的那一堆內容的最末尾有沒有error:
沒有就可以進行下一步。至於其他的,例如warning,可以忽略。
make和make install也是一樣

『捌』 如何在Windows下構建ARM Linux QT開發環境

准備工作:
首先,最不可思議的,是要在Linux下把QT編譯一遍,因為庫都是一樣的,需要的就是一些Windows下的qmake、moc、uic之類的工具而已。因為QT源碼很多地方不能在Windows下面交叉編譯通過,雖然我改了一些代碼和配置(一會兒我貼出補丁來),但我只用它編譯了qtbase、qtdeclarative這兩個模塊和qttools模塊中的一部分。
Linux下的編譯可以參照我之前寫的這篇文章。參考配置:
開發包:
./configure -extprefix /opt/qt/5.2.1/arm -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v
運行庫:
./configure -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v
做完這一步,你獲得兩樣東西,sysroot和linux下的ARM QT開發文件。sysroot是編譯QT之前,用Buildroot做的開發用根目錄。這兩個東西都要拷貝到Windows里,因為Windows不支持符號連接,拷貝需要需要去掉這些連接,這么做:
cp [源目錄] [目標目錄] -Lr
第二,需要一個Windows下模擬Linux環境的東西和編譯器,我用的是MSYS和MinGW,因為他們編譯出來的程序比Cygwin快。在這里可以找到:http://www.mingw.org/。
第三,需要Linaro ARM GCC編譯器,Windows版本的。在這里可以找到:http://www.linaro.org/downloads/
第四,需要python,Windows版本的。在這里可以找到:https://www.python.org/downloads/
下載、安裝,然後在MSYS根目錄的/etc/profile裡面export PATH=$PATH:[Python安裝目錄]
第五,需要pkg-config,Windows版本的,這個比較麻煩,需要下載以下三個文件,並提取出我們需要的東西:
http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip
(提取pkg-config.exe)
http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.28/glib_2.28.8-1_win32.zip
(提取libglib-2.0-0.dll)
http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/gettext-runtime_0.18.1.1-2_win32.zip (提取intl.dll)
把他們都放到MSYS的bin目錄下,然後給pkg-config.exe做一個腳本pkg-config,因為下載的pkg-config.exe比較蠢,在同時指定PKG_CONFIG_SYSROOT_DIR和PKG_CONFIG_LIBDIR這兩個環境變數的時候,第一個cflags會輸出兩次PKG_CONFIG_SYSROOT_DIR。這么做這個腳本:
#!/bin/sh
pushd / > /dev/null
ROOTDIR=`pwd -W 2>/dev/null`
popd > /dev/null
SYSROOT=$PKG_CONFIG_SYSROOT_DIR
pkg-config.exe "$@" | sed "s#$SYSROOT$SYSROOT#$SYSROOT#g" | sed "s#$ROOTDIR##g"
最後去掉$ROOTDIR前綴是為了和Linux Makefile兼容,同時也不會影響在make中的地址轉換,最後,QT源碼和我的補丁。
我的補丁如下:
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/configure qt-everywhere-opensource-src-5.2.1/qtbase/configure
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/configure 2014-02-02 04:37:23 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/configure 2014-08-27 22:34:47 +0800
@@ -4022,6 +4022,10 @@
done

(cd "$outpath/qmake"; "$MAKE") || exit 2
+ if [ -e "$outpath/bin/qmake.exe" ]; then
+ echo '#!/bin/sh' > "$outpath/bin/qmake"
+ echo "$outpath/bin/qmake.exe" '"$@"' "-unix" >> "$outpath/bin/qmake"
+ fi
fi # Build qmake

echo "Running configuration tests..."
@@ -4091,9 +4095,9 @@
# when xcompiling, check environment to see if it's actually usable
if [ -z "$PKG_CONFIG_LIBDIR" ]; then
if [ -n "$CFG_SYSROOT" ] && [ -d "$CFG_SYSROOT/usr/lib/pkgconfig" ]; then
- PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig:$CFG_SYSROOT/usr/share/pkgconfig
+ PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig\;$CFG_SYSROOT/usr/share/pkgconfig
if [ -n "$GCC_MACHINE_DUMP" ]; then
- PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig
+ PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR\;$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig
fi
export PKG_CONFIG_LIBDIR
echo >&2 "Note: PKG_CONFIG_LIBDIR automatically set to $PKG_CONFIG_LIBDIR"
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-02-02 04:37:37 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-08-28 00:08:34 +0800
@@ -11,14 +11,21 @@
include(../common/g++-unix.conf)

# modifications to g++.conf
-QMAKE_CC = arm-linux-gnueabi-gcc
-QMAKE_CXX = arm-linux-gnueabi-g++
-QMAKE_LINK = arm-linux-gnueabi-g++
-QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++
+QMAKE_CC = arm-linux-gnueabihf-gcc
+QMAKE_CXX = arm-linux-gnueabihf-g++
+QMAKE_LINK = arm-linux-gnueabihf-g++
+QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++

# modifications to linux.conf
-QMAKE_AR = arm-linux-gnueabi-ar cqs
-QMAKE_OBJCOPY = arm-linux-gnueabi-obj
-QMAKE_NM = arm-linux-gnueabi-nm -P
-QMAKE_STRIP = arm-linux-gnueabi-strip
+QMAKE_AR = arm-linux-gnueabihf-ar cqs
+QMAKE_OBJCOPY = arm-linux-gnueabihf-obj
+QMAKE_NM = arm-linux-gnueabihf-nm -P
+QMAKE_STRIP = arm-linux-gnueabihf-strip
+
+# support for OpenGL
+QMAKE_LIBS_EGL = -lEGL
+QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM
+QMAKE_LIBS_OPENGL_ES2 = -lGLESv2
+#QMAKE_LIBS +=
+
load(qt_config)
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp 2014-02-02 04:37:29 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp 2014-08-26 13:53:15 +0800
@@ -1161,8 +1161,8 @@

QString srcf = (*sit).toQString();
QString dstf = (*oit).toQString();
- t << escapeDependencyPath(dstf) << ": " << escapeDependencyPath(srcf)
- << " " << escapeDependencyPaths(findDependencies(srcf)).join(" \\\n\t\t");
+ t << escapeDependencyPath(dstf).replace(QRegExp("\\\\"), "/") << ": " << escapeDependencyPath(srcf).replace(QRegExp("\\\\"), "/")
+ << " " << escapeDependencyPaths(findDependencies(srcf)).replaceInStrings(QRegExp("\\\\"), "/").join(" \\\n\t\t");

ProKey comp, cimp;
for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) {
@@ -3346,6 +3346,8 @@
QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst)
{
QString ret;
+ QString src_p = src;
+ QString dst_p = dst;
if (project->isEmpty(replace_rule)
|| project->isActiveConfig("no_sed_meta_install")) {
ret += "-$(INSTALL_FILE) \"" + src + "\" \"" + dst + "\"";
@@ -3362,7 +3364,7 @@
+ "," + windowsifyPath(replace.toQString()) + ",gi");
}
}
- ret += " \"" + src + "\" >\"" + dst + "\"";
+ ret += " \"" + src_p.replace(QRegExp("\\\\"), "/") + "\" >\"" + dst_p.replace(QRegExp("\\\\"), "/") + "\"";
}
return ret;
}

struct TermChain {
TermChain(PatternTerm term)
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro
--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro 2014-02-02 04:37:57 +0800
+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro 2014-08-28 10:42:55 +0800
@@ -1,4 +1,7 @@
option(host_build)
+
+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x
+
QT = core-private
DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII

diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro
--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro 2014-02-02 04:37:57 +0800
+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro 2014-08-28 10:46:59 +0800
@@ -1,4 +1,7 @@
option(host_build)
+
+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x
+
QT = core-private

qtHaveMole(qmldevtools-private) {
接下來開始配置:

其中-extprefix定義安裝位置,在編譯完以後可以改,一會兒說;-prefix、-plugindir、-importdir、-qmldir定義的位置是目標板上的位置,加雙斜杠是為了防止MSYS翻譯這些路徑成MSYS的路徑,其他的設定與Linux下的編譯沒有不同。Linux下編譯的sysroot可以拷貝到例如:E:/MinGW/opt/sysroot-arm。
然後編譯
make mole-qtbase
make mole-qtdeclarative
cd qttools/src/linguist
../../../qtbase/bin/qmake.exe -unix linguist.pro
make
編譯的時候可能會有幾個庫有鏈接錯誤,找不到一大堆gl、egl打頭的函數,這是因為相應的Makefile裡面的LIBS沒有自動加上-lEGL -lGLES_CM -lGLESv2;但是正式使用qmake的時候不會,很奇怪;因為也就幾個地方,出問題了手工加一下吧,我沒去查原因改代碼。
編譯linguist的時候可能會遇到這個問題:http://qt-project.org/forums/viewthread/33370,按裡面說的處理。
編譯完了以後,把下列文件拷貝到Linux下編譯的ARM QT開發包的bin目錄中去:

然後,刪掉對應的ARM QT開發包的bin目錄中沒有exe後綴的文件,那些是Linux下的。
最後一步,確保安裝路徑正確,也就是說,如果配置Windows下QT的時候設定-extprefix E:/MinGW/opt/qt/5.2.1/arm,那就要把替換過exe文件的ARM QT開發包放到這個位置,如果路徑改了,可以用二進制搜索工具去qmake.exe中替換這個字串。
補充一下關於調試的問題,其實不是很關鍵。
在使用Debug模式編譯的時候,最後會出現如下提示:
warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB. Attempting to continue with the default i386 settings.
這是因為在mkspecs/features/unix/gdb_dwarf_index.prf中,有這樣一段:
QMAKE_GDB_INDEX += \
test \$\$(gdb --version | sed -e \'s,[^0-9][^0-9]*\\([0-9]\\)\\.\\([0-9]\\).*,\\1\\2,;q\') -gt 72 && \
gdb --nx --batch --quiet -ex \'set confirm off\' -ex \"save gdb-index $$QMAKE_GDB_DIR\" -ex quit \'$(TARGET)\' && \
test -f $(TARGET).gdb-index && \
$$QMAKE_OBJCOPY --add-section \'.gdb_index=$(TARGET).gdb-index\' --set-section-flags \'.gdb_index=readonly\' \'$(TARGET)\' \'$(TARGET)\' && \
$$QMAKE_DEL_FILE $(TARGET).gdb-index || true

很顯然,這段代碼把調試用的GDB默認為「gdb」了,所以應該改成你用的gdb,比如arm-linux-gnueabihf-gdb。另外,這里的sed對GDB版本的判斷,無法識別像「GNU gdb (Sourcery CodeBench Lite 2014.05-29) 7.7.50.20140217-cvs」這樣的版本信息的,只能識別像「GNU gdb (GDB) 7.6.1」這樣的版本信息,所以你有可能看不到剛才那段提示。想解決,要麼重新寫一段sed的正則表達式,要麼直接就把這個test ... -gt 72刪掉。

『玖』 如何交叉編譯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

『拾』 tcpmp抓包按了Ctrl+C後依然沒有停止抓包是為什麼

我想問問,我的tcpmp在官網下載了,自己交叉編譯以後,在設備里啟動跑,但是Ctrl+C根本沒有反應

熱點內容
ftp導出報錯 發布:2025-02-13 17:41:20 瀏覽:997
腳本下載教程 發布:2025-02-13 17:39:06 瀏覽:235
解壓密碼re 發布:2025-02-13 17:39:02 瀏覽:558
linuxdump內存 發布:2025-02-13 17:37:30 瀏覽:57
游戲客戶端源碼 發布:2025-02-13 17:37:19 瀏覽:594
win7打開文件夾聲音 發布:2025-02-13 17:35:03 瀏覽:606
用php做計算 發布:2025-02-13 17:27:43 瀏覽:447
老編程軟體 發布:2025-02-13 17:27:43 瀏覽:768
看別人解壓 發布:2025-02-13 17:16:17 瀏覽:270
938編程 發布:2025-02-13 17:02:27 瀏覽:510