真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

linux交叉編譯的原理是什么

本篇內(nèi)容主要講解“l(fā)inux交叉編譯的原理是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“l(fā)inux交叉編譯的原理是什么”吧!

成都創(chuàng)新互聯(lián)公司服務(wù)緊隨時(shí)代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過10余年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計(jì)師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對(duì)網(wǎng)站進(jìn)行網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對(duì)外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。

在linux中,交叉編譯是指在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)上的可執(zhí)行代碼,即編譯源代碼的平臺(tái)和執(zhí)行源代碼編譯后程序的平臺(tái)是兩個(gè)不同的平臺(tái)。使用交叉編譯的原因:1、目標(biāo)系統(tǒng)沒有能力在其上進(jìn)行本地編譯;2、有能力進(jìn)行源代碼編譯的平臺(tái)與目標(biāo)平臺(tái)不同。

本教程操作環(huán)境:linux5.9.8系統(tǒng)、Dell G3電腦。

交叉編譯

所謂"交叉編譯(Cross_Compile)",是指編譯源代碼的平臺(tái)和執(zhí)行源代碼編譯后程序的平臺(tái)是兩個(gè)不同的平臺(tái)。比如,在Intel x86架構(gòu)/Linux(Ubuntu)平臺(tái)下、使用交叉編譯工具鏈生成的可執(zhí)行文件,在ARM架構(gòu)/Linux下運(yùn)行。

簡單地說,就是在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)上的 可執(zhí)行代碼。同一個(gè) 體系結(jié)構(gòu)可以運(yùn)行不同的操作系統(tǒng);同樣,同一個(gè)操作系統(tǒng)也可以在不同的體系結(jié)構(gòu)上運(yùn)行。

交叉編譯是相對(duì)復(fù)雜的,必須考慮如下幾個(gè)問題:

  • CPU架構(gòu):比如ARM,x86,MIPS等等;

  • 字節(jié)序:大端(big-endian)和小端(little-endian);

  • 浮點(diǎn)數(shù)的支持;

  • 應(yīng)用程序二進(jìn)制接口(Application Binary Interface,ABI);

為什么要使用交叉編譯呢?主要有兩個(gè)原因:

  • 交叉編譯的目標(biāo)系統(tǒng)一般都是內(nèi)存較小、顯示設(shè)備簡陋甚至沒有,沒有能力在其上進(jìn)行本地編譯;

  • 有能力進(jìn)行源代碼編譯的平臺(tái)CPU架構(gòu)或操作系統(tǒng)與目標(biāo)平臺(tái)不同;

交叉編譯工具鏈?zhǔn)沁M(jìn)行交叉編譯的必不可少的工具,是嵌入式開發(fā)人員必須熟練掌握的技能。

為什么交叉編譯很難?

便攜式本機(jī)編譯很困難。

大多數(shù)程序是在 x86 硬件上開發(fā)的,在本地編譯的。交叉編譯會(huì)遇到兩種類型的問題:程序本身的問題和構(gòu)建系統(tǒng)的問題。

第一類問題會(huì)影響所有非 x86 目標(biāo),包括本機(jī)和交叉構(gòu)建。大多數(shù)程序?qū)\(yùn)行的機(jī)器類型做出假設(shè),必須與相關(guān)平臺(tái)匹配,否則程序?qū)o法運(yùn)行。常見的假設(shè)包括:

  • Word size - 將指針復(fù)制到 int 可能會(huì)在 64 位平臺(tái)上丟失數(shù)據(jù),通過乘以 4 而不是 sizeof(long) ,確定 malloc 的大小不好。整數(shù)溢出導(dǎo)致細(xì)微安全漏洞,ala“if (x+y < size) memset(src+x,0,y);”,當(dāng) x=1000 時(shí),在 32 位硬件上產(chǎn)生 4 GB 的 memset y=0xFFFFFFF0...

  • Endianness - 不同的系統(tǒng)用不同的方式在內(nèi)部存儲(chǔ)二進(jìn)制數(shù)據(jù),從磁盤或網(wǎng)絡(luò)中,讀取 int 或 float 數(shù)據(jù)可能需要轉(zhuǎn)換。

  • Alignment - 某些平臺(tái)(例如 arm)只能從 4 字節(jié)的偶數(shù)倍的地址,讀取或?qū)懭胝麛?shù),否則出現(xiàn)段錯(cuò)誤。處理任意alignment的處理,未alignment的數(shù)據(jù)都較慢,編譯器通常會(huì)填充結(jié)構(gòu)alignment變量。將結(jié)構(gòu)視為可以發(fā)送到磁盤或通過網(wǎng)絡(luò)發(fā)送的數(shù)據(jù)塊,需要額外的工作確保一致的表示。

  • 默認(rèn)簽名- “char”數(shù)據(jù)類型,默認(rèn)為有符號(hào)或無符號(hào),因平臺(tái)而異(從編譯器到編譯器),導(dǎo)致一些非常令人驚訝的錯(cuò)誤。簡單解決方法是提供一個(gè)編譯器參數(shù),如“-funsigned-char”,強(qiáng)制默認(rèn)值為已知值。

  • NOMMU - 如果目標(biāo)平臺(tái)沒有內(nèi)存管理單元,需要更改幾項(xiàng)內(nèi)容。需要 vfork(),不是 fork(),只有某些類型的 mmap() 工作(共享或只讀,但不能在寫入時(shí)復(fù)制),堆棧不會(huì)動(dòng)態(tài)增長。

大多數(shù)包的目標(biāo)是在本地編譯時(shí)可移植,至少會(huì)接受補(bǔ)丁,修復(fù)提交到適當(dāng)?shù)拈_發(fā)郵件列表的任何上述問題(NOMMU 問題除外)。

然后是交叉編譯。

linux交叉編譯的原理是什么

除了本機(jī)編譯的問題外,交叉編譯還有其自身的一系列問題:

  • 配置問題- 具有單獨(dú)配置步驟的包(標(biāo)準(zhǔn) configure/make/make install 的“./configure”部分),通常會(huì)測(cè)試字節(jié)順序或頁面大小等內(nèi)容,在本機(jī)編譯時(shí)可移植。交叉編譯時(shí),這些值在主機(jī)系統(tǒng)和目標(biāo)系統(tǒng)之間不同,在主機(jī)系統(tǒng)上運(yùn)行測(cè)試,給出錯(cuò)誤的答案。當(dāng)目標(biāo)沒有該軟件包或版本不兼容時(shí),配置檢測(cè)主機(jī)上,是否存在軟件包支持。

  • HOSTCC vs TARGETCC -構(gòu)建過程需要編譯在主機(jī)系統(tǒng)上運(yùn)行,如上述配置測(cè)試,或生成代碼的程序(如創(chuàng)建 .h 文件的 C 程序,在main構(gòu)建期間 #included )。用目標(biāo)編譯器替換主機(jī)編譯器,破壞在構(gòu)建過程中運(yùn)行庫。這樣的庫需要訪問主機(jī)和目標(biāo)編譯器,需要說明何時(shí)使用。

  • 工具鏈泄漏- 配置不當(dāng)?shù)慕徊婢幾g工具鏈,將主機(jī)系統(tǒng)的一些內(nèi)容泄漏到已編譯的程序中,導(dǎo)致通常易于檢測(cè),但難以診斷和糾正的故障。工具鏈可能 #include 錯(cuò)誤的頭文件,或在鏈接時(shí)搜索錯(cuò)誤的庫路徑。共享庫通常依賴于其它共享庫,可能會(huì)潛入對(duì)主機(jī)系統(tǒng)的意外鏈接時(shí)引用。

  • 庫- 動(dòng)態(tài)鏈接的程序必須在編譯時(shí),訪問適當(dāng)?shù)墓蚕韼?。目?biāo)系統(tǒng)的共享庫,需要添加到交叉編譯工具鏈中,以便程序可以鏈接到。

  • 測(cè)試- 在本機(jī)構(gòu)建上,開發(fā)系統(tǒng)提供了方便的測(cè)試環(huán)境。交叉編譯時(shí),確認(rèn)“hello world”構(gòu)建成功,可能需要(至少)配置引導(dǎo)加載程序,內(nèi)核,根文件系統(tǒng)和共享庫。

linux交叉編譯的原理是什么

  • 腳注 1:計(jì)算機(jī)類型之間最顯著的區(qū)別是執(zhí)行程序的處理器,其它差異包括庫 ABI(例如 glibc 與 uClibc),具有可配置字節(jié)序的機(jī)器(arm 與 armeb),或不同模式的機(jī)器,可以運(yùn)行 32 位和 64 位代碼(例如 x86 上的 x86-64)。

  • 腳注 2:在構(gòu)建編譯器時(shí),第三種類型稱為“加拿大交叉”,一種不在主機(jī)系統(tǒng)上運(yùn)行的交叉編譯器。加拿大交叉構(gòu)建了一個(gè)編譯器,該編譯器在一個(gè)目標(biāo)平臺(tái)上運(yùn)行,另一臺(tái)目標(biāo)機(jī)器生成代碼。首先創(chuàng)建從主機(jī)到第一個(gè)目標(biāo)的臨時(shí)交叉編譯器,作為第二個(gè)目標(biāo)構(gòu)建另一個(gè)交叉編譯器構(gòu)建這樣的外部編譯器。第一個(gè)交叉編譯器的目標(biāo)成為運(yùn)行新編譯器的主機(jī),第二個(gè)目標(biāo)是新編譯器生成輸出的平臺(tái)。這種技術(shù)通常用于為目標(biāo)平臺(tái)交叉編譯新的本機(jī)編譯器。

  • 腳注 3:現(xiàn)代桌面系統(tǒng)足夠快,模擬目標(biāo)在模擬器下進(jìn)行本地編譯,實(shí)際上是一種可行的策略。比交叉編譯慢得多,需要為目標(biāo)查找或生成本機(jī)構(gòu)建環(huán)境(無論如何都必須設(shè)置交叉編譯器),可能會(huì)因模擬器和要部署的真實(shí)硬件之間的差異崩潰。

  • 腳注 4:交叉編譯工具鏈傾向于為其實(shí)用程序的名稱加上前綴,ala “armv5l-linux-gcc”。如果簡單地稱為“gcc”,主機(jī)和本機(jī)編譯器就不能同時(shí)在 $PATH 中。

linux交叉編譯的原理是什么

到此,相信大家對(duì)“l(fā)inux交叉編譯的原理是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


網(wǎng)站標(biāo)題:linux交叉編譯的原理是什么
網(wǎng)站路徑:http://weahome.cn/article/poegho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部