① (ARM + linux)GNU鏈接腳本中的".ARM.attributes"是什麼意思
所謂gnu鏈接腳本,其實一般都是lds腳本緩搏,或者說是elf格式的bin文件組成的腳本文件,主要是告訴你代碼是怎麼排列在elf文件鏈亂終,至於為啥要燒到arm,其實一般都燒錄在flash中的,然後arm引導程序啟動就需要從flash獲取機器貓,也就是你說的那些段,常見的有data,棚哪檔bss,text,rely等
② arm-unknown-linux-gnu-gcc和arm-linux-gcc
都是交叉編譯工具液櫻余鏈啊,僅僅是名字的差異罷了。設置好系統路徑鬧滾後可以直接在linux平台上交叉頌猜編譯的,祝賀你嵌入式學習愉快
③ 交叉編譯工具鏈 arm-arago-linux-gnueabi-gcc 中的arago和gnueabi代表什麼意思
arm-arago-linux-gnueabi-gcc
arm :CPU Architecture
arago: Hardware Platform or Vendor
linux:Operating System
gnueabi: C Library
arago 那個段落,表示的是供應商,對於 arm 這里也可以是 hardfloat 或者 softfloat ,也就是使用的是硬浮點還是軟浮點。當然其實這個東西是在編譯 gcc 時,通過 --with-float= 指定而不是通過這里進行識別。但有的時候,一些編譯腳本會識別這里來確定浮點運算器是軟是硬。
gnueabi 是 C 函數庫的使用,比如 gnu 是 GNU C Library ,也就是 glibc 。對應的還有 uclibc 。附加的 eabi 其實是說,使用的是新的 EABI 二進制介面 Embedded application binary interface 。這個嵌入式專用介面比老的更好用,效率更高而且支持新的一些硬體功能。老的教 OABI 。當然,同 float 一樣可以通過參數直接定義。
這一大堆聯合起來,只是為了直觀的表現並且區別使用用途和功能定義。沒有必要太過於關注。
④ windows下的qemu怎麼模擬arm啊
使用Qemu模擬Cortex-A9運行U-boot和Linux 作者來源於網路
我的開發環境: Ubuntu-12.04 所有軟體包為最新
1. 安裝GNU工具鏈
sudo apt-get insatll gcc-arm-linux-gnueabi
sudo apt-get insatll g++-arm-linux-gnueabi
安裝完成後會在 /usr/arm-linux-gnueabi/ 目錄下生成庫文件、頭文件等。 我安裝的GCC版本為:
arm-linux-gnueabi-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
2. 安裝Qemu模擬器
手稿sudo apt-get install qemu qemu-system qemu-utils
這時應該已經可以運行qemu-system-arm命令了, 其版本為:
qemu-system-arm --version
QEMU emulator version 1.0.50 (Debian 1.0.50-2012.03-0ubuntu2), Copyright (c) 2003-2008 Fabrice Bellard
3. 編譯和運行U-boot:
到 ftp://ftp.denx.de/pub/u-boot/ 下載最新版本的U-Boot源代碼, 我用的目前最新版本 u-boot-2012.04.tar.bz2
解壓後進入源代碼目錄,在Makefile裡面增加兩行:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabi-
其實就是告訴它使用ARM編譯器來編譯。
make ca9x4_ct_vxp_config
make
這里配置目標板為 Cortex-A9x4 vexpress. 之所以選這個配置可以從 boards.cfg文件里看到, vexpress是ARM公司使用Cortext-A9的一個開發板,相關的代碼在 board/armltd/vexpress/ 目錄,配置文件為include/configs/ca9x4_ct_vxp.h。 而且關鍵的是Qemu裡面已經支持這個畢橡孝板卡。
編譯完成後會生成u-boot文件
運行:
qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel u-boot
或者
qemu-system-arm -M vexpress-a9 -m 256M -serial stdio -kernel u-boot
發現,如果沒有指定-nographics, 則必須要加-serial stdio才會有列印。
參數-m 256M為指定內存大小。-M 指定板卡的名稱, 支持的板卡可如純以用-M ?查看, 如下:
#qemu-system-arm -M ?
Supported machines are:
beagle Beagle board (OMAP3530)
beaglexm Beagle board XM (OMAP3630)
............
versatilepb ARM Versatile/PB (ARM926EJ-S)
versatileab ARM Versatile/AB (ARM926EJ-S)
vexpress-a9 ARM Versatile Express for Cortex-A9
vexpress-a15 ARM Versatile Express for Cortex-A15
正常運行的結果:
qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel u-boot
U-Boot 2012.04 (Jul 08 2012 - 00:14:08)
DRAM: 256 MiB
WARNING: Caches not enabled
Flash: ## Unknown flash on Bank 1 - Size = 0x00000000 = 0 MB
## Unknown flash on Bank 2 - Size = 0x00000000 = 0 MB
*** failed ***
MMC: MMC: 0
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: smc911x-0
Hit any key to stop autoboot: 0
VExpress#
VExpress# printenv
baudrate=38400
bootcmd=run bootflash;
bootdelay=2
bootflash=run flashargs; cp ${ramdisk_addr} ${ramdisk_addr_r} ${maxramdisk}; bootm ${kernel_addr} ${ramdisk_addr_r}
console=ttyAMA0,38400n8
。。。。。
注意:如果在檢測Flash failed後停止運行,是因為在 arch/arm/lib/board.c裡面 board_init_r()函數里檢測Flash失敗後調用了hang(), 暫時先把hang()去掉就可以運行下去了。
⑤ arm-none-linux-gnueabi交叉工具鏈與arm-linux-gcc 有區別嗎
eabi標準的要好些,可能arm-linux-gcc就是arm-none-linux-gnueabi的一個鏈接
終於,郁悶已久的問題攻破了,用了三種配置交叉編譯的方法,最終在開發板上實現成功了,現在想一想,有的時候真的也是運氣薯逗。
之前已經試驗過使用arm-linux-gcc-3.4.1配置交叉編譯編譯環境,配置成功了,在開發板上失敗了~
後來使用腳本創建交叉編譯環境(crosstool-0.43),配置成功了(這個用了相當長的時間),在開發板上失敗了~
終於,在一個偶然的機會(其實是瀏覽無數網頁後),我終於找到了一個好的方法,並成功在開發板上運行。先說一下網上的一些方法,有些所謂的默認安裝了一些程序,但是在實際運行時發現根本沒有安裝,而且很多地方不知道該如何安裝。再有就是文章一上來就說安裝什麼什麼軟體,但是在網上搜根本找不到。只能說很多人只轉載文章,根本沒有試驗過數唯賣。但是我還是幸運的找到了一個靠譜的文章http://www.adamjiang.com/pukiwiki/index.php?%E7%BC%96%E8%AF%91mini2440%E5%B7%A5%E5%85%B7%E9%93%BE
根據上面的做法,我成功了,在此小做總結。
首先下載工具鏈,幸好這篇文章給出了這個網站,要不還不知道要找多久。
http://www.codesourcery.com/.../arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
70多M很快就下完了,若不是root用戶下,可以將文件解壓到home的某個目錄下。
tar xjvfo arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /home/..../arm
那麼,在這個目錄下會生成一個arm-2008q3文件夾。
更改路徑不用說了,或者臨時或者非臨時。我就直接改~/.bashrc了,在最後加:
export PATH=/usr/local/arm-2008q3/bin:${PATH}
ok~現在使你路徑生效吧:
source ~/.bashrc
再輸入:export CROSS_COMPILE=arm-none-linux-gnueabi-
作用是:當你編譯軟體的時候,Makefile在大多數情況向會取得CROSS_COMPILE所指定的交叉編譯工具。
也可以輸入:export CROSS_COMPILE=/usr/local/arm-2008q3/bin/arm-none-linux-gnueabi-
這種種方法是通過絕對路徑來指定交叉編譯工具,這樣做可以更精確的為交叉編譯定位,同時可以避免很多錯誤。你可以通過下面這樣的例子指定交叉編譯工具山念的絕對路徑。
現在一切就緒,隨便編譯個hello world.c文件,用arm-none-linux-gnueabi-gcc helloworld.c -o helloworld,生成的helloworld文件通過nfs掛載到板子上。
最最後,在minicom下輸入:./helloworld。
就會顯示你希望見到的輸出了。。。。。。
首先,從下面的地址下載工具鏈
http://www.codesourcery.com/.../arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
等待下載完成後,將工具鏈解壓到/usr/local/目錄,如果你沒有編譯主機上的root許可權的話,你可以將工具鏈解壓到Linux用戶的home目錄中的某個位置(比如${HOME}/bin)
tar xjvfo arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /usr/local
這個操作將會在/usr/local目錄中創建一個么名為arm-2008q3的目錄。
接下來,你需要將這個新進添加的工具鏈的位置添加到PATH變數之中。編譯你的~/.bashrc文件,在其中加入新的PATH變數
export PATH=/usr/local/arm-2008q3/bin:${PATH}
使用source命令在當前shell中啟用這個變化,這樣你就不需要重新登入系統使用新變數了。
source ~/.bashrc
或者直接在shell中使用export對當前shell做同樣的操作。
export PATH=/usr/local/arm-2008q3/bin:${PATH}
如果你並不是bash用戶,你可以修改你使用的shell所對應的環境設置文件,比如,對於zsh來說,您應該修改~/.zsh文件。或者,你需要在每次登入shell後首先運行上面的export操作。
因為在開發主機上進行交叉編譯意味著使用開發主機的能力生成另外一個體系結構上運行的二進制代碼,所以,一般來說,你需要編譯的軟體通常都會接受一個叫做CROSS_COMPILE的變數來指定產生哪個體系結構的代碼。所以,配置工具鏈的最後一個步驟就是設置這個變數。如果你現在使用ls命令查看以下
ls /usr/local/arm-2008q3/bin/
目錄的話,你會看到很多以arm-none-linux-gnueabi-開始的可執行文件,而這個共同的前綴就是你需要的CROSS_COMPILE變數。現在,使用export命令設置環境變數
export CROSS_COMPILE=arm-none-linux-gnueabi-
現在,當你編譯軟體的時候,Makefile在大多數情況向會取得CROSS_COMPILE所指定的交叉編譯工具。當然,前提是,這些交叉編譯工具在你的PATH變數上。還有一種方法是通過絕對路徑來指定交叉編譯工具,這樣做可以更精確的為交叉編譯定位,同時可以避免很多錯誤。你可以通過下面這樣的例子指定交叉編譯工具的絕對路徑。
export CROSS_COMPILE=/usr/local/arm-2008q3/bin/arm-none-linux-gnueabi-
在大多數情況下,你並不需要將上面的export命令加入~/.bashrc這樣的文件,因為,你並不總是需要它們來做交叉編譯。比如,你僅僅希望編譯運行在開發主機上的程序時。
這樣,工具鏈就准備好了。
⑥ 交叉工具鏈的工具鏈的構建方法
通常構建交叉工具鏈有如下三種方法:
方法一 分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用下列的方法二構建交叉工具鏈。
方法二 通過Crosstool腳本工具來實現一次編譯,生成交叉編譯工具鏈,該方法相對於方法一要簡單許多,並且出錯的機會也非常少,建議大多數情況下使用該方法構建交叉編譯工具鏈。
方法三 直接通過網上下載已經製作好的交叉編譯工具鏈。該方法的優點不用多說,當然是簡單省事,但該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的,沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名其妙的錯誤,建議讀者慎用此方法。
下面摘錄一段:
DIY自己的老鋒數GNU交叉工具鏈(i386-arm)
嵌入式設備由於不具備一定的處理器能力和存儲空間,程序開發一般用PC來完成,然後將可執行文件下載到嵌入式系統中運行。這是嵌入式程序開發的不二選擇——Host/target模式。但這引發了一個問題:由於Host和Target的處理器體系結構不同,我們不能直接用PC上既有的程序開發工侍首具,必須使用跨平台開發工具,即在Host上生成能在Target上運行格式的目標文件。
與在PC上進行程序開發類似,嵌入式系統開發也需要編譯器、鏈接器、解釋程序等。本文討論GNU跨平台開發工具鏈的建立,包括: ld, gas, ar, gcc, glibc.
自己建立交叉編譯環境是一件很頭疼的事(處理版本的依賴性基咐, 漫長的編譯過程...),如果你不想經歷這樣的痛苦,可以選擇網上編譯好了的工具鏈進行安裝.如果你用的是Debian/Ubuntu的發行版, 推薦使用Emdebian. 如果使用uClinux, 也可安裝arm-elf-tools.
⑦ 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。
分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。
通過Crosstool腳本工具來實現一次編譯生成交叉編譯工具鏈。
直接通過網上(ftp.arm.kernel.org.uk)下載已經製作好的交叉編譯工具鏈。
方法1相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法2或方法3構建交叉工具鏈。方法3的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名的錯誤,建議你慎用此方法。
方法1:分步構建交叉編譯工具鏈
下載所需的源代碼包
建立工作目錄
建立環境變數
編譯、安裝Binutils
獲取內核頭文件
編譯gcc的輔助編譯器
編譯生成glibc庫
編譯生成完整的gcc
由於在問答中的篇幅,我不能細述具體的步驟,興趣的同學請自行閱讀開源共創協議的《Linux from scratch》,網址是:linuxfromscratch dot org
。
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來生成試驗箱上的程序了!
⑧ 什麼是工具鏈
機器上。兩個機子有不同的機器指令。
工具鏈:可能指編譯、匯編、鏈接等一整套工具。
下面摘錄一段團橘談:
DIY自己的GNU交叉工具鏈塌碰(i386-arm)
嵌入式設備由於不具備一定的處理器能力和存儲空間,程序開發一般用PC來完成,然後將可執行文件下載到嵌入式系統中運行。這是目前嵌入式程序開發的不二選擇——Host/target模式。但這引發了一個問題:由於Host和Target的處理器體系結構不同,我們不能直接用PC上既有的程序開發工具,必須使用跨平台開發工具,即在Host上生成能在Target上運行格式的目標文件。
與在PC上進行程序開發類似,嵌入式系統開發也需要編譯器、鏈接器、解釋程序等。本文討論GNU跨平台開發工具鏈的建立,包括: ld, gas, ar, gcc, glibc.
自己建立交叉編譯環境是一件很頭疼的事(處理版本的依賴性, 漫長的伍此編譯過程...),如果你不想經歷這樣的痛苦,可以選擇網上編譯好了的工具鏈進行安裝.如果你用的是Debian/Ubuntu的發行版, 推薦使用Emdebian. 如果使用uClinux, 也可安裝arm-elf-tools.
關於Emdebian和arm-elf-tools的更多介紹, 情看本blog的這篇文章!
⑨ 怎麼在ubuntu安裝gnu工具鏈
安裝ARM-Linux-GCC工具鏈
只需要一句命令:
sudo apt-get install gcc-arm-linux-gnueabi
前提是你的Ubuntu系統版本是官網支旅州冊拆宏持的最新的版本,若不是,請升級。執行以上命令即可。跡掘