交叉編譯器通常以 arm-none-linux-gnueabi.tar.bz2 這樣的名稱發布(不同廠家的不同開發平台,交叉編譯工具鏈的實際名稱可能有所差別,請以實際為准),解壓命令:
vmuser@Linux-host: ~$ tar xjvf arm-none-linux-gnueabi.tar.bz2
如果希望解壓到一個指定的目錄,可以先將 arm-none-linux-gnueabi.tar.bz2 壓縮包復制到目標目錄,然後進入目標目錄再運行解壓命令,也可以在任意目錄解壓,通過-C 指定目標目錄。假定希望解壓到「/home/ctools/」目錄,則命令如下:
vmuser@Linux-host: ~$ tar xjvf arm-none-linux-gnueabi.tar.bz2 -C /home/ctools/
在終端中添加環境變數,需要每次打開終端都設置,也很麻煩。可以考慮將設置的過程添加到系統配置文件中。/etc/profile 是系統全局的配置文件,在該文件中設置交叉編譯器的路徑,能夠讓登錄本機的全部用戶都可以使用這個編譯器。
打開終端,輸入「sudo vi /etc/profile」命令,打開/etc/profile 文件,在文件末尾添加:
export PATH=$PATH:/home/ctools/arm-2011.03/bin/
然後輸入「. /etc/profile」(點+空格+文件名),執行 profile 文件,使剛才的改動生效。如果沒有書寫錯誤,此時打開終端,輸入 arm-none-linux-gnueabi-,然後按鍵盤 TAB 鍵,同樣可以看到很多 arm-none-linux-gnueabi-開頭的命令。
這些周立功那邊很多的,不知道你有沒去看過。
❷ 交叉編譯器的交叉編譯
在一種計算機環境中運行的編譯程序,能編譯出在另外一種環境下運行的代碼,我們就稱這種編譯器支持交叉編譯。這個編譯過程就叫交叉編譯。簡單地說,就是在一個平台上生成另一個平台上的可執行代碼。這里需要注意的是所謂平台,實際上包含兩個概念:體系結構(Architecture)、操作系統(Operating System)。同一個體系結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體系結構上運行。舉例來說,我們常說的x86 Linux平台實際上是Intel x86體系結構和Linux for x86操作系統的統稱;而x86 WinNT平台實際上是Intel x86體系結構和Windows NT for x86操作系統的簡稱。
有時是因為目的平台上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器的某些特徵;有時是因為目的平台上的資源貧乏,無法運行我們所需要編譯器;有時又是因為目的平台還沒有建立,連操作系統都沒有,根本談不上運行什麼編譯器。
交叉編譯這個概念的出現和流行是和嵌入式系統的廣泛發展同步的。我們常用的計算機軟體,都需要通過編譯的方式,把使用高級計算機語言編寫的代碼(比如C代碼)編譯(compile)成計算機可以識別和執行的二進制代碼。比如,我們在Windows平台上,可使用Visual C++開發環境,編寫程序並編譯成可執行程序。這種方式下,我們使用PC平台上的Windows工具開發針對Windows本身的可執行程序,這種編譯過程稱為native compilation,中文可理解為本機編譯。然而,在進行嵌入式系統的開發時,運行程序的目標平台通常具有有限的存儲空間和運算能力,比如常見的 ARM 平台,其一般的靜態存儲空間大概是16到32MB,而CPU的主頻大概在100MHz到500MHz之間。這種情況下,在ARM平台上進行本機編譯就不太可能了,這是因為一般的編譯工具鏈(compilation tool chain)需要很大的存儲空間,並需要很強的CPU運算能力。為了解決這個問題,交叉編譯工具就應運而生了。通過交叉編譯工具,我們就可以在CPU能力很強、存儲空間足夠的主機平台上(比如PC上)編譯出針對其他平台的可執行程序。
要進行交叉編譯,我們需要在主機平台上安裝對應的交叉編譯工具鏈(cross compilation tool chain),然後用這個交叉編譯工具鏈編譯我們的源代碼,最終生成可在目標平台上運行的代碼。
❸ 如何構建MIPS交叉編譯工具鏈
第一步 創建目錄以及環境變數
在當前用戶目錄下創建target-project文件夾,在該文件夾下創建mips-mole文件夾,在mips-mole文件夾下創建三個文件夾:build-tools,kernel,tools,最後,在build-tools文件夾下創建build-gcc,build-boot-gcc,build-glibc,build-binutils文件夾。命令如下:
$ cd ~
$ mkdir -p ./target-project/mips-mole/{kernel/,tools/,build-tools/{build-gcc,build-boot-gcc,build-glibc,build-binutils}}
$ tree ./target-project/mips-mole/
使用腳本構建環境變數
#! /bin/bash
注意修改/home/用戶名,修改正確後,使用source使腳本生效
$ cd target-project
$ chmod +x mips.sh
$ source mips.sh
可以使用echo査看相關變數名以觀察環境變數是否生效。
最後把linux-2.6.38.tar.bz2下載放置在kernel文件夾下,binutils-2.22.tar.gz,gcc-4.6.2.tar.gz,glibc-2.14.tar.gz,glibc-ports-2.14.tar.gz,gmp-5.0.4.tar.gz,mpc-0.9.tar.gz,mpfr-3.0.1.tar.gz下載放置在build-tools文件夾下。
第二步 安裝基於MIPS的linux頭文件
$ cd $PRJROOT/kernel
$ tar -xjvf linux-2.6.38.tar.bz2
$ cd linux-2.6.38
在指定路徑下創建include文件夾,用來存放相關頭文件。
$ mkdir -p $TARGET_PREFIX/include
保證linux源碼是干凈的。
$ make mrproper
生成需要的頭文件。
$ make ARCH=mips headers_check
$ make ARCH=mips INSTALL_HDR_PATH=dest headers_install
將dest文件夾下的所有文件復制到指定的include文件夾內。
$ cp -rv dest/include/* $TARGET_PREFIX/include
最後刪除dest文件夾
$ rm -rf dest
$ ls -l $TARGET_PREFIX/include
第三步 安裝binutils-2.22
$ cd $PRJROOT/build-tools
$ tar -xzvf binutils-2.22.tar.gz
$ cd build-binutils
$ ../binutils-2.22/configure --target=$TARGET --prefix=$PREFIX
$ make
$ make install
再安裝automake。
$ tar -xzvf automake-1.11.1.tar.gz
$ cd automake-1.11.1
$ ./configure
$ make
$ sudo make install
下面開始修改相關文件,主要是去掉-Werror。
$ cd $PRJROOT/build-tools/binutils-2.22/gas
$ ge dit configure
將下面內容
# Enable -Werror by default when using gcc
if test "${GCC}" = yes -a -z "${ERROR_ON_WARNING}" ; then
ERROR_ON_WARNING=yes
fi
修改為
# Enable -Werror by default when using gcc
if test "${GCC}" = yes -a -z "${ERROR_ON_WARNING}" ; then
ERROR_ON_WARNING=no
fi
但是,需要重新configure生成Makefile.in。
$ ./configure (在binutils/gas路徑下的configure)
$ make distclean (切記)
然後重新執行第三步,這次編譯可過。
第四步 安裝gcc引導器
$ cd $PRJROOT/build-tools
$ tar -xzvf gcc-4.6.2.tar.gz
$ tar -xjvf gmp-5.0.4.tar.bz2
$ mv gmp-5.0.4 ./gcc-4.6.2/gmp
$ tar -xzvf mpc-0.9.tar.gz
$ mv mpc-0.9 ./gcc-4.6.2/mpc
$ tar -xzvf mpfr-3.0.1.tar.gz
$ mv mpfr-3.0.1 ./gcc-4.6.2/mpfr
$ cd build-boot-gcc
$ ../gcc-4.6.2/configure --target=$TARGET --prefix=$PREFIX --disable-shared <br>--without-headers --with-newlib --enable-languages=c --disable-decimal-float <br>--disable-libgomp --disable-libmudflap --disable-libssp --disable-threads --disable-multilib
編譯並安裝gcc引導器、libgcc庫。
$ make all-gcc
$ make all-target-libgcc
$ make install-gcc
$ make install-target-libgcc
第五步 編譯glibc
$ cd $PRJROOT/build-tools
$ tar xzvf glibc-2.14.tar.gz
$ cd glibc-2.14
刪除Makefonfig文件中的內容-lgcc_eh。
$ cp -v Makeconfig{,.b腸花斑拘職餃辦邪暴矛k}
$ sed -e 's/-lgcc_eh//g' Makeconfig.bk > Makeconfig
$ cd ..
$ tar -xjvf glibc-ports-2.14.tar.bz2
$ mv glibc-ports-2.14 ./glibc-2.14/ports
$ cd build-glibc
$ CC=mipsel-linux--gcc ../glibc-2.14/configure --host=$TARGET --prefix="/usr" <br>--enable-add-ons --with-headers=$TARGET_PREFIX/include libc_cv_forced_unwind=yes <br>libc_cv_c_cleanup=yes
注意:此時如何設置了LD_LIBRARY_PATH環境變數會configure error,需要刪除該變數重新configure。
$ make
$ make install_root=$TARGET_PREFIX prefix=」」 install
第六步 完全安裝gcc
首先,也是很重要的是去掉libc等庫文件的絕對路徑。
$ cd $TARGET_PREFIX/lib
備份一下。
$ cp libc.so libc.so.bk
$ gedit libc.so
將原內容
GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a AS_NEEDED ( /lib/ld.so.1 ) )
修改為
GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld.so.1 ) )
$ cp libpthread.so libpthread.so.bk
$ gedit libpthread.so
將原內容
GROUP ( /lib/libpthread.so.0 /lib/libpthread_nonshared.a )
修改為
GROUP ( libpthread.so.0 libpthread_nonshared.a )
然後可以完全編譯gcc。
❹ 如何在ubuntu中搭建交叉編譯環境toolchain
1.安裝交叉編譯環境 sudo apt-get install gcc g++ libcc1 libg++ make gdb
2.安裝交叉編譯器 f
tp:
//ftp.
arm.linux.org.uk/pub/armlinux/toolchain/ 下載 cross -3.2.tar.bz2或者懶得去找乾脆
wget f
tp://ftp.
arm.linux.org.uk/pub/armlinux/toolchain/ cross -3.2.tar.bz2
解壓
sudo tar jxvf /home/zhaifang/cross -3.2.tar.bz2
sudo mv /home/zhaifang/usr/local/arm /usr/local
3.交叉編譯器加入路徑 sudo vi /etc/bash.bashrc後面加入
if [ -d /usr/local/arm ] ; then
PATH=/usr/local/arm/bin:'${PATH}'
fi
4.使環境生效 #source /etc/profile
5.檢查 echo $PATH 出現/usr/local/arm/bin說明成功了
6.測試 arm-linux-gcc -v
❺ 如何安裝交叉編譯器 詳細�0�3
1.將源碼拷至目錄文件: a) 使用命令:cp 3.4.1.tar.bz2 /lishangfeng 拷貝交叉工具的文件至目錄文件; 2.將源文件進行解壓: a) 使用命令:tar xvf 3.4.1.tar.bz2 解壓源文件,得到目錄文件(3.4.1); 3.查看目錄下的文件: a) 使用命令:ls b) arm-linux bin include info lib libexec man tmp 4.修改環境變數: a) 打開終端,查看當前環境變數: b) 輸入命令:echo $PATH c) 添加新的環境變數: 使用命令:PATH = $PATH:/lishangfeng/3.4.1/bin (這樣添加只針對本終端有用) d) 若想將環境變數永久添加,可以使用以下方法: 1)打開更改腳本文件: 2)使用命令:gedit /root/.bashrc 3)在文件的最後一行加上如下代碼: export PATH=$PATH:/lishangfeng/3.4.1/bin 4)保存退出,重新啟動linux 系統即可。 5.至此交叉編譯器就安裝成功了。 製作人:尚賢博學 於2013 年3 月3 號西安石油大學製作完成(希望能幫助到廣大熱愛嵌入式的朋友們)
❻ 如何構建交叉編譯環境。
你說的是我下面的回答嗎?下面就一些問題作一個說明,以期拋磚引玉。
基於Linux操作系統的應用開發環境一般是由目標系統硬體(開發板)和宿主PC機所構成。目標硬體開發板用於運行操作系統和系統應用軟體,而目標板所用到的操作系統的內核編譯、應用程序的開發和調試則需要通過宿主PC機來完成(所以稱為交叉編譯)。雙方之間一般通過串口,並口或乙太網介面建立連接關系。
但在此我建議構建如下的交叉編譯環境,適合個人或研發小組使用:單獨拿出一台PC機(PII以上即可,就用以前淘汰的舊機器就可以),在該PC上安裝桌面的Linux操作系統(如Red Hat Linux 8.0及以上),可以採用默認的安裝選項(注意要包含FTP服務),這台PC作為Linux伺服器,除管理員以外,一般不直接讓其他人去操作。
將該Linux伺服器接入區域網,並新建一些合法用戶,以便其他的PC機(在此我們將其稱為工作站)的合法用戶能訪問到Linux伺服器。而其他的PC機(工作站)仍然使用Windows操作系統,原來幹啥繼續幹啥。
需要的軟體工具包括:
1、FTP客戶端程序(如Cuteftp,可到網上下載)。
2、Telnet工具(如SecureCRT,可到網上下載)。
3、移植到某一特定ARM平台的Linux操作系統內核源碼(一般由銷售商整理提供)。
4、GNU編譯工具,可由相關網站下載,或由銷售商整理提供。
在工作站安裝:
在某工作站PC上安裝FTP客戶端程序和Telnet工具,安裝完畢後應該可以在該工作站PC和Linux伺服器之間進行文件的傳輸,並在工作站PC可以通過Telnet登陸到Linux伺服器(可能需要將Linux伺服器的防火牆服務關閉才能完成)。
在Linux伺服器安裝:
將工作站PC上的Linux操作系統內核源碼壓縮包和GNU編譯工具通過FTP傳送到Linux伺服器的某個目錄(如合法的用戶目錄),然後在該目錄下解壓,並將GNU編譯工具安裝到默認的工作目錄即可,以上工作通過在工作站PC使用Telnet工具完成,而不需要在Linux伺服器上進行。
Linux操作系統內核的編譯:
Linux操作系統內核的編譯一般有一個比較固定的步驟,會根據MakeFile文件的不同而略有差異,可參考相關文檔,編譯的工作在工作站PC使用Telnet工具完成。
❼ 如何在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所示。
❽ 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操作系統中如何構建交叉開發環境
這個問題相當專業了,之前我去周立功那邊了解過的。
按照以下步驟進行安裝:
1) 安裝32位的兼容庫和libncurses5-dev庫
在安裝交叉編譯工具之前需要先安裝32位的兼容庫和libncurses5-dev庫,安裝32兼容庫需要從ubuntu的源庫中下載,所以需要在Linux主機系統聯網的條件下,通過終端使用如下命令安裝:
vmuser@Linux-host ~$sudo apt-get install ia32-libs
若Linux主機系統沒有安裝32位兼容庫,在使用交叉編譯工具的時候可能會出現錯誤:
-bash: ./arm-fsl-linux-gnueabi-gcc: 沒有那個文件或目錄
在終端中使用如下命令則可以安裝libncurses5-dev庫。
vmuser@Linux-host ~$sudo apt-get install libncurses5-dev
如果沒有安裝此庫,在使用make menucofig時出現如下所示的錯誤:
*** Unableto find the ncurses libraries or the
*** required headerfiles.
*** 'makemenuconfig' requires the ncurses libraries.
***
Installncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] 錯誤 1
make: *** [menuconfig] 錯誤 2
2) 安裝交叉編譯工具鏈
將交叉編譯工具「gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2」文件通過U盤的方式拷貝到Linux主機的「/tmp」目錄下,然後執行如下命令進行解壓安裝交叉編譯工具鏈:
vmuser@Linux-host ~$ cd /tmp
vmuser@Linux-host ~$ sudo tar -jxvfgcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2 -C /opt/
vmuser@Linux-host /tmp$ # 輸入vmuser用戶的密碼「vmuser」
執行完解壓命令後,交叉編譯工具鏈將被安裝到「/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0」目錄下。交叉編譯器的具體目錄是「/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin」,為了方便使用,還需將該路徑添加到PATH環境變數中,其方法為:修改「/etc/profile」文件,具體操作方法如下:
在終端中輸入如下指令
vmuser@Linux-host ~$ sudo vi /etc/profile # 若提示輸入密碼,則輸入「vmuser」
用vi編輯器打開「/etc/profile」文件後,在文件末尾增加如下一行內容:
export PATH=$PATH:/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin
文件修改並保存後,再在終端中輸入如下指令,更新環境變數,使設置生效。
vmuser@Linux-host ~$source /etc/profile
在終端輸入arm-fsl-linux-gnueabi-並按TAB鍵,如果能夠看到很多arm-fsl-linux-gnueabi-前綴的命令,則基本可以確定交叉編譯器安裝正確,如下圖所示。
❿ arm-linux-gcc交叉編譯器的製作,以及版本選擇問題。
,需要必須有足夠動經驗來支持。
另外,用 RH9 的都是高手,我想你的知識不需要來提問了吧?
1、在 PC 上編譯 arm 的程序當然需要較差編譯器,這個需要自己安裝,或者著現成的交叉編譯器環境,一般是一個特殊參數編譯出來的 gcc + binutils + glibc + linux-header。這個每個人動環境不同,一般都需要自己編譯一個,當然沒有特殊需求,也可以找現成的。不過很難找,因為這套環境還要和你動系統搭配,不然環境不匹配,連這個環境都不能運行,那就更談不上編譯東西了。
有關自己編譯搭建交叉編譯環境,可以看看一個特殊的 Linux 發行版 LFS 的分支: CLFS 。
2、移植分很多意思,移植有可能就意味著這套源代碼不能在目標系統上面編譯,需要你根據相應的知識去修改源代碼來讓這套代碼適應目標編譯器的要求,比如源代碼有 SSE4 的優化,這套程序在非 SSE4 CPU 上無法編譯運行,但目標機器連 SSE1 都不支持。那麼就需要移植。
或者移植僅僅是根據新的環境進行編譯,不需要進行源代碼修改,只需要進行一下編譯就能運行的程序,也可以稱為移植,就是從一個環境、架構 -》另一個環境、架構。都可以稱為移植,但真正的移植意味著修改程序源代碼來適應新環境。你說的這種移植是最簡單的移植。
3、決定目標硬體環境 -》搭建目標編譯器 -》製作目標環境(內核,基礎軟體庫)-》進行應用移植(移植需要的軟體、主應用程序)-》搭建系統文件系統 -》導入目標系統-》啟動目標系統&應用。說起來很簡單,因為這是完全沒有問題的條件下。
至於超級終端。那是用來控制目標系統的。目標系統有可能不能插鍵盤滑鼠顯示器,這就需要一個遠程網路鏈接來進行控制。以及通過遠程鏈接來發送數據。這都需要終端的支持。
虛擬機下面進行開發,不能發揮你的計算機的性能。而且因為隔著 VMware 的軟體模擬層,可能還不會很方便的讓你鏈接目標設備。
至於用 socket ,我還沒見到你的目標需要這個東西,因為所有的東西都是現成的源代碼。不需要你從 0 開始寫,當然你想自己寫一個系統內核,或者伺服器程序,或者全套的系統+應用,我絕對不攔你,但希望你寫完這套東西,能把源代碼發布出來。
ads 可以認為是一個支持環境,他本身不是一個系統的開發 SDK 。
-------------------------------------
ads 沒用過,印象里他還有模擬器,調試器什麼的程序。功能上要比 Linux 開發環境,WinCE 環境下面的東西更多更偏向於硬體方面,畢竟 ads 是 arm 出品的,不太可能偏向於軟體部分設計。Linux 和 WinCE 都是系統而不是硬體工具。
你可以認為交叉編譯器是一個應用程序,一個輸出器。把源代碼輸出為 arm 的代碼,這個應用程序的輸出,是靠他自己的環境,而不是當前系統的環境的。
當前系統的各個軟體的版本,不能影響交叉編譯器輸出的環境(理論上,現實有的時候總是從別的地方給你打擊……),交叉編譯器一般至少有 gcc 、binutils 、glibc 庫、linux kernel 頭文件。
在軟體需求上。
頭文件誰都不依賴,glibc 只需要內核頭文件,其他程序全都依賴於 glibc 。也就是所有程序都不依賴內核,僅僅是依賴於內核頭文件。
gcc 和 binutils 是把程序源代碼根據上面各個環節的需提供的功能來輸出為上面環節裡面的二進製程序。依賴你當前環境的,只有 gcc 和 binutils 兩個程序的執行、控制環節。只有他們兩個依賴的,而不是你的交叉編譯後的程序。
至於編譯器版本的選擇,新版本功能更好,舊版本兼容更好。
這個要看你的實際需要了。應用程序源代碼也調編譯器的,同時也依賴於軟體庫的功能。
arm 開發建議穩定、兼容優先。當然也可以嘗試最新的編譯環境,來獲取更好的優化(前提是還有什麼代碼優化的話)。
另外,團IDC網上有許多產品團購,便宜有口碑