導航:首頁 > 源碼編譯 > linux嵌入式編譯

linux嵌入式編譯

發布時間:2022-06-13 11:42:24

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來生成試驗箱上的程序了!












Ⅱ 嵌入式Linux開發中的交叉編譯是什麼意思

所謂交叉編譯是指在A系統上編譯B系統的二進制代碼。
嵌入式的應用程序,甚至操作系統是運行在特定目標平台上,例如一塊arm架構的目標板。而編譯程序的時候通常是在普通x86構架下的Linux操作系統的PC上。在PC上編譯嵌入式應用程序的過程叫做交叉編譯。

Ⅲ 嵌入式linux的程序怎樣編譯

編譯及安裝簡要步驟: 編輯Makefile版本信息 定義內核特性,生成配置文件.config,用於編譯:make xconfig 編譯內核:make 安裝內核:make install 安裝模塊:make moles_install

Ⅳ 嵌入式Linux內核編譯求解!!!!!

本人也是試驗中的菜鳥一枚,有些經驗還有理解大家分享。
你說的這些步驟,是開發板移植或者產品移植過程中的一環,移植,就是把PC上編寫好的,已經可以完成功能的程序編程開發板晶元,你用的是arm的晶元,那就是用arm的指令系統可以辨認執行的文件。
zimage是內核映像的image文件的壓縮版,主要減少映像大小。如果是用pc機的編譯系統編譯出來,就是能在PC機上運行的linux內核,OS,放在開發板上,也是一樣的功用。
至於開發板內核會不會變,應該說你每一次燒入一個內核的時候,效果都相當於對PC機進行了一次系統重裝,系統肯定是會變的,變成了你燒錄進去的編譯好的linux2.6.28.這一點可以肯定。但是是不是變得和以前不一樣就不一定了,也許內核的文件從頭到尾都是一個,更有可能的是你手上就沒有出廠時燒入的內核程序,人家沒給你,那麼你除非不燒,掠過內核的部分永遠不變,只改變文件系統,那麼內核肯定是會變的。另外對內核改變不需要太猶豫,沒有那塊開發板上的文件從頭到尾沒變過的,內核文件也一樣,會有這種情況的只有出廠產品。開發板就是大膽折騰,才能把開發板玩好。
系統內核用zimage這樣的形式,是深層的原因是因為節省固化flash空間,還是有利於cpu內部結構運行,沒有研究過。
zimage不是直接下到板子里就能運行的,配置的問題先不說,啟動不是直接從zimage啟動的,因為這個是壓縮文件,至少要解壓之後才能使用。
但是實際上用的也不是zimage映像文件。而是uimage文件。zimage和uimage差不多。
uimage文件是用於被uboot引導的文件,是一個64K的文件頭和一個zimage文件組成的。
從編譯角度來說,現在手上的內核的創建映像的makefile文件中的目標似乎是一口氣把這幾個映像文件都生成了。單獨使用make uimage也能生成uimage映像文件。但既然uimage是從zimage轉化而來,那麼應該是必須先要編譯出了zimage才能有uimage文件生成。
有了uimage文件後,就要有uboot文件,有的板子因為搬運和運行的操作流程,還會有一級bootstrap,這是因為內部ram大小決定的。uboot是為了必要的硬體初始化和引導內核和文件系統而存在的,uboot將內核需要的軟體和硬體環境都配置好了之後,將內核復制解壓到內存中,並跳轉到內存里內核的入口,將操作權交給內核。內核正是啟動,配置無誤後掛載文件系統。
如果這些程序都完成,那麼開發板就可以運行起來了。
很不幸,我現在還沒有搞定。
但是如果你不需要移植,只是要運用一個配置好的開發板,那麼你想了解的可能是這個,下載到flash中文件的名稱和順序和地址。
名稱沒有確定的,但是大概是這樣的形式:bootloader.bin(其中包括uboot和其它形式boot,可能最初還會有bootstrap)+zimage+root.(jffs*/yaffs*/etx*)等。
燒入的地址也是要嚴格對應程序,或者手冊說明建議中的,如果出現相互覆蓋或者該有的文件不在應該的位置,那麼也是不會啟動成功的。
linux和嵌入式linux都不是很簡單的,任重道遠,共同進步吧。

Ⅳ 我是個嵌入式新手,在編譯linux-2.6.30.1的時候出現了如下錯誤: /tmp/ccygt4eh.s:34169: Fatal error: can

嵌入式系統是面向用戶、面向產品、面向應用的,它必須與具體應用相結合才會具有生命力、才更具有優勢。因此可以這樣理解上述三個面向的含義,即嵌入式系統是與應用緊密結合的,它具有很強的專用性,必須結合實際系統需求進行合理的裁減利用。所以嵌入式系統有以下幾個特點:

簡述嵌入式系統的特點

1、系統內核小。由於嵌入式系統一般是應用於小型電子裝置的,系統資源相對有限,所以內核較之傳統的操作系統要小得多。比如Enea公司的OSE分布式系統,內核只有5K,而Windows的內核簡直沒有可比性。

2、專用性強。嵌入式系統的個性化很強,其中的軟體系統和硬體的結合非常緊密,一般要針對硬體進行系統的移植,即使在同一品牌、同一系列的產品中也需要根據系統硬體的變化和增減不斷進行修改。同時針對不同的任務,往往需要對系統進行較大更改,程序的編譯下載要和系統相結合,這種修改和通用軟體的「升級」是完全兩個概念。

3、系統精簡。嵌入式系統一般沒有系統軟體和應用軟體的明顯區分,不要求其功能設計及實現上過於復雜,這樣一方面利於控制系統成本,同時也利於實現系統安全。

4、高實時性的系統軟體(OS)是嵌入式軟體的基本要求。而且軟體要求固態存儲,以提高速度;軟體代碼要求高質量和高可靠性。

5、嵌入式軟體開發要想走向標准化,就必須使用多任務的操作系統。嵌入式系統的應用程序可以沒有操作系統直接在晶元上運行;但是為了合理地調度多任務、利用系統資源、系統函數以及和專家庫函數介面,用戶必須自行選配RTOS開發平台,這樣才能保證程序執行的實時性、可靠性,並減少開發時間,保障軟體質量。

6、嵌入式系統開發需要開發工具和環境。由於其本身不具備自舉開發能力,即使設計完成以後用戶通常也是不能對其中的程序功能進行修改的,必須有一套開發工具和環境才能進行開發,這些工具和環境一般是基於通用計算機上的軟硬體設備以及各種邏輯分析儀、混合信號示波器等。開發時往往有主機和目標機的概念,主機用於程序的開發,目標機作為最後的執行機,開發時需要交替結合進行。

7、嵌入式系統與具體應用有機結合在一起,升級換代也是同步進行。因此,嵌入式系統產品一旦進入市場,具有較長的生命周期。

Ⅵ 在嵌入式LINUX中,可以直接編譯並運行程序嗎

當然可以。理論上,你只需要在平台中有一個可以跑的編譯器(准確說環境比較合適吧。。),可以把你的代碼翻譯成平台可以運行的格式,那麼就行了。。理論上,你甚至自己可以做一個
「編譯器」,如何在嵌入式系統中,把你的某個代碼,比如:「主函數**列印
¥我愛XXX¥退出」翻譯成你的平台可以執行的格式,然後運行。。。^_^,起碼我是這樣理解的。但是MS還沒有人這樣做。原因可能主要是幾個:1.嵌入式平台的資源有限。2.目前MS在裡面搭一個合適的開發環境,無疑是很痛苦的事情。

Ⅶ 在嵌入式LINUX中,可以直接編譯並運行程序嗎

當然可以。
理論上,你只需要在平台中有一個可以跑的編譯器(准確說環境比較合適吧。。),可以把你的代碼翻譯成平台可以運行的格式,那麼就行了。。
理論上,你甚至自己可以做一個 「編譯器」,如何在嵌入式系統中,把你的某個代碼,比如:

主函數**
列印 ¥我愛XXX¥
退出

翻譯成你的平台可以執行的格式,然後運行。。。
^_^,起碼我是這樣理解的。
但是MS還沒有人這樣做。
原因可能主要是幾個:
1.嵌入式平台的資源有限。
2.目前MS在裡面搭一個合適的開發環境,無疑是很痛苦的事情。

Ⅷ linux嵌入式系統的開發為什麼要用到交叉編譯器交叉編譯器的作用是什麼

linux嵌入式系統的開發的應用資料,交叉編譯器等等,這方面的資料,

到「工搜網資料文庫」索取吧。那裡有詳細的資料

Ⅸ 嵌入式linux應用程序通常用什麼編譯器編譯

Linux有一系列功能強大的編譯器:vi、emace是屏幕互動式編譯器,GNU CC是GNU項目中符合ANSI C標準的編譯系統。

vi命令是Linux下全屏幕文本編輯,雖然這個編譯器特簡陋,對於初學者來說不是很友好,但是在Linux中vi的作用非常大。

主要的三種模式:命令模式、輸入模式、末行模式。

掌握這三種模式十分重要:

命令模式:vi啟動後默認進入的是命令模式,從這個模式使用命令可以切換到另外兩種模式,同時無論在任何模式下只要按一下[Esc]鍵都可以返回命令模式。在命令模式中輸入字幕「i」就可以進入vi的輸入模式編輯文件。

輸入模式:在這個模式中我們可以編輯、修改、輸入等編輯工作,在編輯器最後一行顯示一個「--INSERT--」標志著vi進入了輸入模式。當我們完成修改輸入等操作的時候我們需要保存文件,這時我們需要先返回命令模式,在進入末行模式保存。

末行模式:在命令模式輸入「:」即可進入該模式,在末行模式中有好多好用的命令。

vim是vi編輯器的改進版本,在vi編譯的基礎上擴展了很多實用的功能。

至於vi/vim的命令就不給大家介紹了,我們在日常實際的使用之中隨著積累都會掌握。

Ⅹ 請簡述嵌入式linux內核的編譯過程

編譯及安裝簡要步驟:
編輯Makefile版本信息

定義內核特性,生成配置文件.config,用於編譯:make xconfig

編譯內核:make

安裝內核:make install

安裝模塊:make moles_install

具體步驟如下:

內核配置

先定義內核需要什麼特性,並進行配置。內核構建系統(The kernel build system)遠不是簡單用來構建整個內核和模塊,想了解更多的高級內核構建選項,你可以查看 Documentation/kbuild 目錄內的內核文檔。

可用的配置命令和方式:

make menuconfig

命令:make menuconfig

編譯內核

編譯和安裝內核

編譯步驟:

$ cd /usr/src/linux2.6

$ make

安裝步驟 (logged as

$ make install

$ make moles_install

提升編譯速度

多花一些時間在內核配置上,並且只編譯那些你硬體需要的模塊。這樣可以把編譯時間縮短為原來的1/30,並且節省數百MB的空間。另外,你還可以並行編譯多個文件:

$ make -j <number>

make 可以並行執行多個目標(target)(KEMIN:前提是目標規則間沒有交叉依賴項,這個怎麼做到的?)

$ make -j 4

即便是在單處理器的工作站上也會很快,讀寫文件的時間被節省下來了。多線程讓CPU保持忙碌。

number大於4不見得有效了,因為上下文切換過多反而降低的工作的速度。

make -j <4*number_of_processors>

內核編譯tips

查看完整的 (gcc, ld)命令行: $ make V=1

清理所有的生成文件 (to create patches...): $ make mrproper

部分編譯:$ make M=drivers/usb/serial

單獨模塊編譯:$ make drivers/usb/serial/visor.ko

最終生成的文件

vmlinux 原始內核鏡像,非壓縮的

arch/<arch>/boot/zImage zlib壓縮的內核鏡像(Default image on arm)

arch/<arch>/boot/bzImage bzip2壓縮的內核鏡像。通常很小,足夠放入一張軟盤(Default image on i386)

閱讀全文

與linux嵌入式編譯相關的資料

熱點內容
捷豹小型空氣壓縮機 瀏覽:555
綠盾文檔加密系統哪裡有賣 瀏覽:637
我的世界怎麼開掛在伺服器裡面 瀏覽:789
西門子自鎖正反轉編程圖 瀏覽:749
出國英語pdf 瀏覽:920
演算法線性匹配 瀏覽:674
山東省dns伺服器雲主機 瀏覽:554
安卓5g軟體怎麼隱藏 瀏覽:839
編譯內核空間不足開不了機 瀏覽:887
漢紀pdf 瀏覽:474
在哪裡下載國家醫保app 瀏覽:657
沒有與文件擴展關聯的編譯工具 瀏覽:426
我的世界反編譯mcp下載 瀏覽:19
安卓手柄下載什麼軟體 瀏覽:70
pushrelabel演算法 瀏覽:850
硬碟資料部分文件夾空白 瀏覽:617
cssloader的編譯方式 瀏覽:941
java面板大小 瀏覽:506
怎麼用命令方塊打出字體 瀏覽:500
台灣加密貨幣研究小組 瀏覽:299