日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Buildroot构建指南——工具链

發(fā)布時(shí)間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Buildroot构建指南——工具链 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Linux系統(tǒng)的交叉編譯工具鏈用來(lái)將源代碼變成bin文件或者庫(kù)文件的一個(gè)軟件。一般大家默認(rèn)工具鏈等于gcc或者arm-linux-gcc,但是實(shí)際上,gcc只是工具鏈的編譯器部分,不是全部,制作一個(gè)工具鏈的原材料,除了gcc,還需要linux內(nèi)核,libc庫(kù)等一系列的軟件包。所謂萬(wàn)事開(kāi)頭難,如何在Buildroot中使用自己的交叉編譯工具鏈則是第一道難關(guān)。

Buildroot支持從零開(kāi)始用原材料軟件包自動(dòng)構(gòu)造工具鏈,也支持直接使用第三方制作好的工具鏈。

toolchain-buildroot 從零開(kāi)始自動(dòng)制作工具鏈
在make menuconfig –> Toolchain –>Toolchain type中,有2個(gè)選項(xiàng),選擇buildroot toolchain則是使用buildroot默認(rèn)的自動(dòng)化腳本從零開(kāi)始制作交叉編譯工具鏈,如果是選擇externaltoolchain 則是使用外部制作好的工具鏈。

Figure 1 ?toolchain type 選項(xiàng)

在mini2440_defconfig的配置文件中,我們可以看到,它并沒(méi)有toochain相關(guān)的選項(xiàng),只是在cpu指令集部分選擇了ARM920T ?,這種情況它會(huì)采用buildroot-toolchain也就是buildroot默認(rèn)的自動(dòng)化腳本,從零開(kāi)始制作工具鏈。實(shí)際上,你只要make toolchain然后等待幾分鐘,Buildroot就會(huì)將制作好的全新工具鏈放到output/host/目錄下了。

Figure 2 mini2440_defconfig配置部分截圖

? ? ? 整個(gè)工具鏈自動(dòng)化制作過(guò)程可以參考toolchain/ 目錄下的toolchain-buildroot/ 、toolchain.mk、helpers.mk、toolchain-wrapper.mk等幾個(gè)腳本,我就不詳細(xì)說(shuō)了。但是有幾個(gè)關(guān)鍵點(diǎn)我還是強(qiáng)在下面列一下。總之制作過(guò)程還是很復(fù)雜的,所以如果是初學(xué)者,用手工方法從零開(kāi)始做交叉編譯工具鏈,將是多大的挑戰(zhàn)。

a). ?從圖3中我們可以看到制作交叉工具鏈大概需要的原材料軟件包

Figure3 制作交叉工具鏈的原材料

工具鏈主要的原材料包括:gcc,、libc庫(kù),、linux內(nèi)核頭文件、binutils以及一系列自動(dòng)構(gòu)建打包工具如m4、gmp、mpc等。

另外要強(qiáng)調(diào)的是,從工具鏈的原材料可以知道為什么Linux內(nèi)核、驅(qū)動(dòng)以及應(yīng)用軟件要用同一個(gè)工具鏈編譯,為什么內(nèi)核版本要適配它的工具鏈。這是因?yàn)楣ぞ哝湵旧淼闹谱饕蕾囉谔囟ò姹镜腖inux內(nèi)核和libc庫(kù)。

b). 從圖1的makemenuconfig –> Toolchain這一系列選項(xiàng)可以看到,制作工具鏈還可以選擇libc庫(kù)(uclibc還是glibc,自己添加Android特有的Bionic libc),不同的libc性能,size,效率,穩(wěn)定性以及GPL協(xié)議支持上有著一定的差異,需要使用者謹(jǐn)慎選擇和測(cè)試。mini2440直接采用buildroot提供的默認(rèn)的uclibc,不保證其穩(wěn)定性和bug。

另外,toolchain后面還有Linux內(nèi)核版本以及MMUsupport以及gcc版本的選擇,可見(jiàn)如果需要定制特定的Linux內(nèi)核(比如不帶MMU的實(shí)時(shí)版),除了移植內(nèi)核之外,還需要特別為其定制工具鏈。

c). make menuconfig –> Target option 中的選項(xiàng)也是與交叉工具鏈密切相關(guān)的。

其中芯片的CPU的大小端,是否編譯成elf格式,指令集,ABI的類型(EABI是Embeded ABI的意思,EABIHF是采用硬浮點(diǎn)的ABI),以及軟硬浮點(diǎn)特性(軟浮點(diǎn)不會(huì)有編譯兼容性問(wèn)題,但是在支持硬浮點(diǎn)的高級(jí)嵌入式芯片,采用軟浮點(diǎn)配置,很多性能會(huì)發(fā)揮不佳,但是ARM9這種低端平臺(tái)用軟浮點(diǎn)應(yīng)該OK)等等選項(xiàng),都是應(yīng)該考慮的點(diǎn)。

?

Figure4 與交叉工具鏈相關(guān)的target option選項(xiàng)

toolchain-external 使用第三方現(xiàn)成工具鏈
這節(jié)用友善的Tiny4412開(kāi)發(fā)板官方提供的工具鏈為例,介紹如何將外部第三方工具鏈移植到到Buildroot的編譯環(huán)境。Tiny4412開(kāi)發(fā)板用的SOC芯片的基于ARM-Cortex-A9內(nèi)核的三星Exyons-4412 真四核SOC芯片,曾經(jīng)是三星旗艦手機(jī)Galaxy-S3的主打SOC。

從友善官方提供的交叉編譯工具鏈的包命名來(lái)看,工具鏈?zhǔn)褂玫膅cc版本是4.5.1,有vfp則說(shuō)明工具鏈支持應(yīng)付點(diǎn)編譯。V6應(yīng)該是指令集是ARMV6,但是ARM-V6實(shí)際上是ARM11的指令集,Cortex-A9的應(yīng)該是ArmV7才對(duì), 這里應(yīng)該是命名出錯(cuò)了,算是一個(gè)小漏洞吧。

Figure5 ?友善官方提供的tiny4412交叉編譯工具鏈

移植步驟如下:

1. ? ? ?為了不產(chǎn)生命名誤導(dǎo),我們將工具鏈的壓縮包中4.5.1/* 目錄下的所以內(nèi)容拷貝出來(lái),放到一個(gè)叫toolchain-tiny4412重新壓縮成名字為arm-linux-gcc-4.5.1-tiny4412.tar.bz2的壓縮包,將其cp到/mnt/sdb/3rd-pkg目錄下,細(xì)心的朋友已經(jīng)發(fā)現(xiàn),根據(jù)前面一篇Buildroot快速入門的內(nèi)容,這個(gè)文件夾是我保存第三方軟件包的專門文件夾,待會(huì)Buildroot會(huì)用file的方法從該文件夾中把工具鏈cp到buildroot/dl/目錄下的。

Figure6 保存在/mnt/sdb/3rd-pkg 目錄下的工具鏈壓縮包

2. ? ? ?在make menuconfig –> Toolchain –>Toolchain type中選中external toolchain,下面的Toolchain欄中的arm-linux-gcc-4.5.1for tiny4412選項(xiàng),實(shí)際上原本是沒(méi)有的,是我自己加上去的。
?

Figure7 Toolchain的選擇

3. ? ? ?那么如何把自己的工具鏈加上去呢?cd buildroot/toolchain/toolchain-external/文件夾,根據(jù)前一篇文章快速上手的經(jīng)驗(yàn),要加自己的工具鏈,肯定是該配置,再改mk文件啦!

在該目錄的Config.in文件的108行,有一個(gè)現(xiàn)成的第三方ARM cortex-A9 第三方交叉工具鏈的配置代碼。
?

Figure8 ?buildroot/toolchain/toolchain-external/Config.in中的ARM Cortex-A9現(xiàn)成參考配置

我們可以參考模仿這段代碼,稍微修改,在這段代碼后面加入我們自己的配置代碼:

注意,命名很重要,變量名一定是BR2_TOOLCHAIN_EXTERNAL_開(kāi)頭,后面加上自己的工具鏈名。
?

Figure9 Config.in中參考修改的tiny4412工具鏈配置代碼

在我的修改中,出來(lái)提示字符串和help部分的相關(guān)注釋和提示文字,主要是把主機(jī)gcc版本的最低要求降低到4.5,再去掉了內(nèi)核頭文件最低版本限制(這里其實(shí)是友善官方的疏忽,友善在制作工具鏈的時(shí)候,采用的Linux內(nèi)核頭文件版本很低,和編譯的內(nèi)核版本不匹配,導(dǎo)致頭文件版本檢查會(huì)報(bào)錯(cuò),因而我去掉了最低版本的限制,這也是潛在漏洞之一吧)。

4. ?配置交叉工具鏈前綴名。在Config.in的690行左右,為剛才添加的BR2_TOOLCHAIN_EXTERNAL_TINY4412_ARM選擇工具鏈前綴名。

前綴名的格式組成是這樣的:目標(biāo)cpu-廠商-操作系統(tǒng)-庫(kù)和abi格式,我們參考之前模仿的配置,選擇arm-nonelinux-gnueabi,實(shí)際上,友善官方給的工具鏈就是以arm-nonelinux-gnueabi作為前綴命名的。

?Figure10? 工具鏈前綴名配置

Figure11 tiny4412官方的工具鏈命名

5. ? ? ?修改toolchain-external.mk 文件,加入自己配置。在296行,仿照前面一個(gè)工具鏈的變量配置,為BR2_TOOLCHAIN_EXTERNAL_TINY4412_ARM的配置增加下載地址和壓縮包的名字,壓縮包名字在第一步已經(jīng)做好。至于下載地址,直接抄過(guò)來(lái)就行了,友善提供的定制化工具鏈,網(wǎng)上下載不到的。

Figure12 為toolchain-external.mk 加入tiny4412工具鏈的配置

事實(shí)上,打開(kāi)那個(gè)地址,我們可以看到由sourcery官方維護(hù)的很多現(xiàn)成制作好的工具鏈,所以嘛直接拿來(lái)用就好了,自己從零制作工具鏈多麻煩啊!當(dāng)然這些工具鏈的穩(wěn)定性還是需要自己測(cè)試一番。

Figure13 sourcery網(wǎng)上可下載的現(xiàn)成工具鏈

6. ? ? ?在menuconfig中設(shè)置下載的鏡像地址。這個(gè)和前一篇文章一樣,將本地保存工具鏈的地址,按照格式,設(shè)置為file的鏡像地址。實(shí)際上,Buildroot的下載腳本,默認(rèn)的規(guī)定是優(yōu)先去本地的file鏡像地址找軟件包,找不到之后,才會(huì)走git或者網(wǎng)站下載等其它方法。當(dāng)然網(wǎng)上肯定是下載不到的,但是先從本地找到就OK,這也是第一步為什么要保存工具鏈壓縮包到該地址的原因。

關(guān)于Buildroot下載軟件包的順序,可以參考package/pkg-download.mk的腳本,在214行可以看到,只有在本地file路徑找不到了,才會(huì)采用配置的(PKG)_SITE_METHOD方法去獲取軟件包。

?Figure14? 工具鏈的下載鏡像地址

Figure15 Buildroot自動(dòng)下載腳本的下載過(guò)程

7. ? ? ?menuconfig中的幾項(xiàng)配置。修改完配置腳本和編譯構(gòu)建mk腳本后,還得在menuconfig中把修改的東西配置進(jìn)去。

在target Option的配置中,注意上一節(jié)提到的幾點(diǎn)。但是這里有幾個(gè)新的選項(xiàng)需要注意

a). CPU架構(gòu)選擇的是Cortex-A9

b) vfp友善官方給的工具鏈?zhǔn)侵С值?#xff0c;所以這里可以打開(kāi),這樣就能支持硬浮點(diǎn)了

c) NEON SIMD是CPU支持的高性能多媒體引擎的功能,這是4412這種級(jí)別的多媒體處理器的殺手級(jí)功能,但是我們現(xiàn)在并不了解它的特性,也不知道友善的工具鏈在制作的有沒(méi)有把該功能加上去,因而暫時(shí)不打開(kāi)。但是專業(yè)的工程師要去了解這項(xiàng)功能,以便發(fā)揮SOC和CPU的潛能。

d). VFP硬浮點(diǎn)的版本,這一項(xiàng)由于友善的資料不明確,暫時(shí)選VFPv3-D16版本,根據(jù)說(shuō)明,Coretex-A9對(duì)這個(gè)版本都會(huì)支持的。

e). ABI的問(wèn)題,根據(jù)圖11的內(nèi)容,友善的工具鏈應(yīng)該只是用了EABI來(lái)做的,沒(méi)有用EABIhf。這幾項(xiàng)是什么意思呢?浮點(diǎn)選項(xiàng)其實(shí)有軟浮點(diǎn)、硬浮點(diǎn)EABI(softfp)和硬浮點(diǎn)EABIhf三個(gè)。

軟浮點(diǎn)就是用軟件模擬浮點(diǎn)運(yùn)算

硬浮點(diǎn)EABI就是用浮點(diǎn)指令,但是為了兼容舊版本的軟浮點(diǎn)編譯出來(lái)的庫(kù)還是用整數(shù)寄存器傳遞浮點(diǎn)數(shù),這樣犧牲了一些效率,但是在工具鏈中存在舊的軟浮點(diǎn)庫(kù)時(shí),是可以兼容并不會(huì)出現(xiàn)編譯錯(cuò)誤的。

硬浮點(diǎn)EABIhf則是使用純粹的硬浮點(diǎn)指令和浮點(diǎn)寄存器來(lái)計(jì)算浮點(diǎn)數(shù),這樣效率會(huì)更高,但是不再兼容工具鏈中舊版的軟浮點(diǎn)下編譯出來(lái)的庫(kù),如果不重新制作硬浮點(diǎn)EABIhf的工具鏈,可能會(huì)出現(xiàn)編譯問(wèn)題。

EABIhf需要知道整個(gè)工具鏈的庫(kù)的兼容特性,目前看起來(lái)友善官方工具鏈不支持這個(gè)選項(xiàng),其工具鏈命名也是EABI,但是有支持vfp,因而我們選擇硬浮點(diǎn)EABI的配置。具體要如何支持EABIhf,可以搜其它相關(guān)文章,這個(gè)可能需要重新制作整個(gè)工具鏈。

以上這些選項(xiàng)實(shí)際上都是編譯toolchain-wrapper傳遞的,toolchain-wrapper是一個(gè)中間層,負(fù)責(zé)編譯時(shí),傳遞某些特定選項(xiàng)給工具鏈,以上這些選項(xiàng)確定后,都會(huì)被toolchain-wrapper以參數(shù)的時(shí)候在編譯時(shí)傳遞給交叉工具鏈的。

Figure 16 menuconfig -->target option的配置

Figure 17 menuconfig -->toolchain的配置

在加入了tiny4412的配置后,最后在toolchani中選擇自己的工具鏈,選上MMU功能,然后用pipe選項(xiàng)進(jìn)行編譯加速。

最后,make toolchain ?,你就可以看到Buildroot系統(tǒng)如何構(gòu)建出tiny4412的工具鏈了。

小結(jié)
整體而言,從零制作一個(gè)工具鏈,對(duì)嵌入式的知識(shí)掌握還是需要深入的掌握,另外,工具鏈對(duì)整個(gè)系統(tǒng)代碼的穩(wěn)定性有著極大的影響,所以直接用自動(dòng)制作的工具鏈,一定要經(jīng)過(guò)嚴(yán)格的壓力測(cè)試,否則容易出現(xiàn)各種隱患。

因而,采用第三方制作好的,有專門公司維護(hù)的工具鏈,應(yīng)該是一個(gè)更為有效的開(kāi)發(fā)方式。

原文鏈接:https://blog.csdn.net/zhou_chenz/article/details/52346134

?

?

?

總結(jié)

以上是生活随笔為你收集整理的Buildroot构建指南——工具链的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。