最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

i.MX6ULL開發(fā)板源碼自制交叉編譯器

2021-12-27 14:12 作者:武漢萬象奧科  | 我要投稿

前言

文章基于HD-IMX6ULL-MB ?系列開發(fā)板測試驗證,該開發(fā)板由武漢芯路遙科技有限公司與武漢萬象奧科電子有限公司合作推出。此開發(fā)板基于 NXP iMX6ULL 系列 Cortex-A7 高性能處理器設計,適用于快速開發(fā)一系列具有創(chuàng)新性的產品如人機界面工業(yè) 4.0 掃描儀、車載終端以及便攜式醫(yī)療設備。

i.MX6ULL開發(fā)板


自己制作交叉編譯器


早期(2009年以前)我們在做嵌入式系統(tǒng)開發(fā)時,第一件事就是自己制作交叉編譯器。當時做交叉編譯器 ? 需要自己下載gcc、glibc、binutils等相關工具的源碼,然后一個一個源碼編譯安裝。制作交叉編譯器的 ?過程中最痛苦的莫過于各個軟件之間的版本依賴關系,如gcc 4.6.2 依賴 glibc 2.13,如果你選定 gcc 4.7 則可能編譯制作失敗,然后再嘗試一個新的版本重新編譯,直至找到一個合適的版本為止。


后來為了方便交叉編譯器的制作,有很多組織或個人開始編寫這些制作交叉編譯器的腳本或框架,并測 試解決這些軟件版本之間的依賴關系。當時最知名的莫過于基于 glibc 的 crosstool 和 基于 uclibc 的

buildroot 了。在開始講解如何制作交叉編譯器之前,我們首先來了解一下 C運行庫。


1.嵌入式C運行庫


1.1glibc庫

glibc是gnu發(fā)布的libc庫,也即c運行庫。glibc是linux ? 系統(tǒng)中最底層的api(應用程序開發(fā)接口),幾乎其它任何的運行庫都會倚賴于glibc。glibc除了封裝linux操作系統(tǒng)所提供的系統(tǒng)服務外,它本身也提供了 許多其它一些必要功能服務的實現(xiàn),主要的如下:

  1. string,字符串處理

  2. signal,信號處理

  3. dlfcn,管理共享庫的動態(tài)加載

  4. direct,文件目錄操作

  5. elf,共享庫的動態(tài)加載器,也即interpreter

  6. iconv,不同字符集的編碼轉換

  7. inet,socket接口的實現(xiàn)

  8. intl,國際化,也即gettext的實現(xiàn)

  9. io

  10. linuxthreads

  11. locale,本地化

  12. login,虛擬終端設備的管理,及系統(tǒng)的安全訪問

  13. malloc,動態(tài)內存的分配與管理

  14. nis

  15. stdlib,其它基本功能


gcc 是編譯器,基本上 Linux 下所有的程序(包括內核)都是 gcc 編譯的,libc 當然也是。gcc 和 libc 是互相依賴的兩個軟件,它們合作的方式類似 Linux 系統(tǒng)的 "自舉"。先在一個可以運行的帶有老 libc 和

gcc 的系統(tǒng)上,用老 gcc 編譯出一個新版本的 gcc + 老 libc,再用這個新 gcc 編譯出一個新 gcc + 新

libc,再用這套新的組合編譯整個新系統(tǒng)。


1.2 uClibc庫

PC上常用的標準庫glibc是一個非常寵大而完整的庫,但早期對于嵌入式系統(tǒng)來說,由于Flash和RAM的 存儲空間有線,其體積顯得過于大了一些。uClibc的出現(xiàn)就是為了解決這個問題,uClibc盡可能的兼容

Glibc,大多數(shù)應用程序可以在很小或完全不修改的情況下就可能使用uClibc替代glibc。通過uClibc來代 ?替Glibc,可以在不改變應用程序功能的前提下,大大減少發(fā)布文件的大小,無論應用程序以靜態(tài)鏈接來 編譯,還是以動態(tài)鏈接形式編譯。


uClibc比一般用于Linux發(fā)行版的C庫GNU C Library (glibc)要小得多,glibc目標是要支持最大范圍的硬件和內核平臺的所有C標準,而uClibc專注于嵌入式Linux.很多功能可以根據空間需求進行取舍。現(xiàn)在uClibc更多運行于標準的以及無MMU的Linux系統(tǒng)上,支持i386,x86 64,ARM (big/little endian), AVR32,Blackfin,h8300,m68k,MIPS (big/little endian), PowerPC,SuperH (big/little endian),

SPARC,和v850等處理器。


由于當前嵌入式系統(tǒng)硬件性能的提升,用于存儲程序的Flash空間和用于運行程序的RAM空間都有了大幅 提升,為了保證程序更大的兼容性,uClibc也逐步退出了歷史的舞臺了。



uClibc早期官網: uClibc最新官網:

https://www.uclibc.org/ h ttps://uclibc-ng.org/



1.3 eglibc庫


EGLIBC(Embedded GLIBC,縮寫為EGLIBC)是glibc的原創(chuàng)作組織FSF所新推出的glibc的一種變體, 目的在于將glibc用于嵌入式系統(tǒng)。它是GNU C 庫(glibc)的一個分支,也采用GNU寬通用公共許可證

(LGPL)發(fā)布。它希望能應用于嵌入式系統(tǒng),但它的源代碼與可執(zhí)行文件仍然保持與glibc一致。它的作 者宣稱它不是glibc的一個分支,而是用來容納glibc核心開發(fā)者拒絕采納的patch。


2009年5月6日,因為與glibc核心開發(fā)者之間對程序發(fā)展方向的爭議,Debian開發(fā)者宣布將要采用EGLIBC來取代glibc。Ubuntu自9.10后也采用了EGLIBC,Ark Linux也使用它。2014年初,官網上宣布,eglibc已經停止開發(fā),因為現(xiàn)在的目標是在glibc上直接解決問題(goals are now being addressed directly in GLIBC),Debian開發(fā)者也恢復到使用glibc了。


1.4 newlib庫


在做一些單片機的裸機程序開發(fā)時,有時候最想要的是實現(xiàn)一個printf打印函數(shù),以便及時輸出各種信 ? ? 息。除去底層的設備驅動不說,printf本身的實現(xiàn)就有夠麻煩,如果平時有保存相關的代碼還好,不然就 很浪費時間。除此之外,還有一些諸如strlen、strcpy之類的函數(shù),我們不愿意自己寫,既麻煩而且效率 ?不高,如果能借助已有的代碼或庫就好了。


Newlib 就滿足了這點需求,它是一個面向嵌入式系統(tǒng)的C運行庫。最初是由Cygnus ?Solutions收集組裝的一個源代碼集合,取名為newlib,現(xiàn)在由Red ? Hat維護。對于與GNU兼容的嵌入式C運行庫,Newlib 并不是唯一的選擇,但是從成熟度來講,newlib是最優(yōu)秀的。newlib具有獨特的體系結構,具有可移植 ?性強,具有可重入特性、功能完備等特點,使得它能夠非常好地滿足深度嵌入式系統(tǒng)的要求。


Newlib 庫是一個開源的c函數(shù)庫,包括libc和libm兩部分。它支持ANSI ?C庫標準,針對不同處理器架構進行優(yōu)化,輕量級,適用于嵌入式系統(tǒng)。其特點如下:

  1. 支持printf和優(yōu)化的字符串操作

  2. 支持malloc和free等內存操作

  3. 支持函數(shù)可重入功能(不過這種支持對內存有壓力,總之是感覺弊大于利)

  4. 支持libm數(shù)學庫(不過一般嵌入式用不到浮點數(shù),而且用模擬的開銷略大)

  5. newlib的函數(shù)是分文件實現(xiàn)的,如果用不到,絕不加入鏈接,一般不會造成目標文件猛增的情況。

  6. newlib C庫一般在制作單片機裸機開發(fā)的交叉編譯器時,使用得比較多。



2 ?Crosstool-ng制作交叉編譯器


Crosstool早期是個很不錯的交叉編譯器制作工具,但是后來完善得不夠好,于是有人弄出了個更好的

—— crosstool-ng(crosstool Next Generation)。其特點如下:

支持menuconfig(類似于Linux內核配置) 支持眾多的架構

可選多種不同的C庫等模塊提供示例配置

支持多種主機編譯環(huán)境:各種Linux發(fā)行版,Cygwin等。


接下來,我們學習了解一下如何使用 crosstool-ng 來制作一個ARM交叉編譯器。


2.1 Crosstool-NG 編譯與安裝


首先我們到 Crosstool-NG 的官方站點(https://crosstool-ng.github.io/)下載其軟件源碼壓縮包,并解壓縮源碼。



接下來進入到源碼路徑下,開始Linux系統(tǒng)下源碼安裝的三部曲: ./configure、make、 make install

。 這里在configure 時通過 --prefix 選項指定將編譯生成的文件安裝到當前路徑下即可。在進行

./configure 時可能會提示 help2man、 libtool 找不到,這可能是系統(tǒng)沒有安裝或者安裝的版本過低導致的,直接使用 sudo apt install 命令安裝相關系統(tǒng)命令即可。



上面命令成功編譯安裝之后,可執(zhí)行程序將會放到 install 文件夾下,接下來我們可以測試 ct-ng 命令是否能夠成功執(zhí)行。接下來我們將會使用該程序來制作交叉編譯器。



2.2 交叉編譯器配置


在Crosstool-NG的安裝路徑下,有很多參考的交叉編譯器示例配置,我們沒有必要所有的選項都自己從

0開始配置,可以在某個示例配置的基礎上來修改。



因為i.MX6ULL是ARM ?CortexA7核的處理器,但在上面的示例配置中并沒有該架構的相關配置,這樣我們在 A8的基礎上來進行修改,這兩種架構大致都差不多。我們將ARM CortexA8的示例配置拷貝一份并命名為 .config, 接下來的 ct-ng menuconfig 將會默認讀取該配置文件。



接下來使用 export 命令導出 ct-ng 命令所在的路徑,如果是使用 SecureCRT 遠程登錄到Linux服務器上操作的話,還需要 export TERM=vt100 ?命令配置TERM環(huán)境變量,否則接下來的配置可能不能輸入。接下來再執(zhí)行 ct-ng menuconfig 對交叉編譯器制作進行配置。



下面是Crosstool-NG的配置界面,我們接下來需要在這里進行修改。在配置的過程中,上、下方向鍵 用來選擇相應選項,TAB鍵 用來選擇底下的 <Select> 或 <Exit>:




在 Paths and misc options 選項中,我們主要要修改如下幾個選項,修改指定下載的軟件包存放路徑

${PWD}/tarballs 和 交叉編譯器的安裝路徑 /opt/xtools/cortexA7:





在 Target options 選項中,我們主要修改 “ Floating point” 選項,因為 iMX6ULL處理器帶有 FPU,這里為了保持兼容性,選擇 softfp (FPU)。





在 Toolchain options 選項中,如果想拷貝該交叉編譯器給別的機器使用,則可以選中"Build Static Toolchain",另外修改 "Tuple's vendor string" 選項中指定交叉編譯器名稱。





在 Operating System 選項中,因為我們移植的Linux內核目標版本為 5.10.x, 所以這里內核的版本選擇要跟開發(fā)板上移植的版本保持一致,否則今后編譯Linux內核時可能會出現(xiàn)兼容性問題。在這里, crosstool-NG的默認內核版本較低,這里需要修改配置為我們想要的版本。下面的這些選項配置,依賴Paths and misc options 菜單中的 [*] Try features marked as EXPERIMENTAL選項。

"Source of linux" 選擇 (Custom location)

"Custom source location" 里設置 Linux路徑為 (${PWD}/tarballs/linux-5.10.tar.xz) ,接下來我們將會手動下載相應的Linux內核源碼壓縮包到這里;

"Version of linux" 里選擇 (newer than anything below) ;



在 C-library 選項中,C library 選擇 (glibc) ,其他使用默認


剩余的其它選項,我們就不作任何修改采用默認配置。關于 C compiler ?編譯器里的相關選項,大家也可以了解一下。



配置完成后回到主菜單,使用 Tab鍵 切換到 < Exit > ,然后選擇保存退出即可。交叉編譯器配置完成之后,接下來我們就準備開始交叉編譯器的編譯過程。





2.3 交叉編譯器編譯


在前面的配置中,我們計劃將交叉編譯器安裝到系統(tǒng)的 /opt/xtools 路徑下,這里我們首先需要使用

root 權限創(chuàng)建這個文件夾,并給所有其他用戶 寫 權限。





CrossTool-NG在編譯過程中,會下載制作交叉編譯器所需要的軟件源碼包,但有些軟件包的下載地址可 能已經失效,這時我們可以自己找到相關軟件的相應版本軟件包,然后手動下載到指定的壓縮包存放路 ? 徑下,如前面配置中指定的 ?${PWD}/tarballs ?。下面是一些已知的失效文件,我們提前手動下載好,其它所需要的軟件包將會在開始編譯后自動下載。



接下來我們就開始交叉編譯的編譯制作過程,這個過程的時間依賴PC的性能。我的Linux服務器處理器 ? 是Intel(R) Xeon(R) CPU E31235 @ 3.20GHz,4核8線程,所以我這里使用 ct-ng build.8 命令用8個進程同時編譯。



交叉編譯器編譯完成之后,我們可以使用下面命令查看制作好的交叉編譯器相關版本信息:



2.4 交叉編譯器測試


接下來我們使用制作好的交叉編譯器,交叉編譯之前寫好的 hello.c 測試程序,并放到 ARM 開發(fā)板上運行測試。需要注意的是因為新制作的交叉編譯器跟開發(fā)板上運行的C運行庫版本不一致,這里必須加上 -

static 進行靜態(tài)鏈接,這樣編譯生成的程序才能在開發(fā)板上運行。



ARM 開發(fā)板上下載運行測試:



版權聲明 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

本文檔所有內容文字資料由凌云實驗室郭工編著,主要用于凌云嵌入式Linux教學內部使用,版權歸屬 作者個人所有。任何媒體、網站、或個人未經本人協(xié)議授權不得轉載、鏈接、轉帖或以其他方式復制發(fā)布/發(fā)表。已經授權的媒體、網站,在下載使用時必須注明來源,違者本人將依法追究責任。

Copyright (C)2021 凌云物網智科實驗室·郭工

Author: GuoWenxue guowenxue@gmail.com


i.MX6ULL開發(fā)板源碼自制交叉編譯器的評論 (共 條)

分享到微博請遵守國家法律
林周县| 龙游县| 泰顺县| 托克托县| 双流县| 元谋县| 云浮市| 页游| 韩城市| 香格里拉县| 大兴区| 大丰市| 崇义县| 郧西县| 石门县| 英超| 景德镇市| 东海县| 灵台县| 衡东县| 昌平区| 绥德县| 上虞市| 尚义县| 鄢陵县| 陇南市| 金湖县| 四会市| 蒲城县| 交口县| 香港| 兖州市| 太湖县| 泸溪县| 枣强县| 萨嘎县| 肃宁县| 青河县| 华坪县| 鄂尔多斯市| 宜州市|