GCC、ARM-LINUX-GCC、ARM-ELF-GCC淺析

来源:http://www.cnblogs.com/roucheng/archive/2016/06/11/GCC.html
-Advertisement-
Play Games

一、GCC簡介: The GNU Compiler Collection,通常簡稱GCC,是一套由GNU開發的編譯器集,為什麼是編輯器集而不是編譯器呢?那是因為它不僅支持C語言編譯,還支持C++, Ada, Objective C等許多語言。另外GCC對硬體平臺的支持,可以所無所不在,它不僅支持X8 ...


一、GCC簡介:

The GNU Compiler Collection,通常簡稱GCC,是一套由GNU開發的編譯器集,為什麼是編輯器集而不是編譯器呢?那是因為它不僅支持C語言編譯,還支持C++, Ada, Objective C等許多語言。另外GCC對硬體平臺的支持,可以所無所不在,它不僅支持X86處理器架構, 還支持ARM, Motorola 68000, Motorola 8800, Atmel AVR, MIPS等處理器架構。

 

二、GCC內部結構:

GCC內部結構主要由Binutils、gcc-core、Glibc等軟體包組成。

1. Binutils:它是一組開發工具,包括連接器,彙編器和其他用於目標文件和檔案的工具。關於Binutils的介紹可以參考Binutils簡單介紹。【這個軟體包依賴於不同的目標機的平臺。因為不同目標機的指令集是不一樣的,比如arm跟x86就不一樣】

2. gcc-core:顧明之意是GCC的核心部分,這部分是只包含c的編譯器及公共部分,而對其他語言【C++、Ada等】的支持包需要另外安裝,這也是GCC為何如此強大的重要原因。【它依賴於Binutils,可以參考安裝GCC

3. Glibc:包含了主要的c庫,這個庫提供了基本的常式,用於分配記憶體,搜索目錄,讀寫文件,字元串處理等等。【這個包GCC編譯生成的庫,前輩們為了方便大家開發,就把Glibc放到GCC中】

舉例描述下上面3個包是如何進行運作的。有一個c源文件test.c源碼如下:

#include<stdio.h>

int main(int argc, char *argv[])

{

printf("Hello Linux!!\n");

 

return 0;

}/* 何問起 hovertree.com */

 

$ gcc -o test test.c編譯生成test可執行文件。gcc編譯流程分為四個步驟:預處理、編譯、彙編、鏈接。個人認為預處理和編譯主要由gcc-core來完成,彙編和鏈接主要由Binutils來完成。那麼何時用到glibc呢?看到源碼中的printf函數沒有,這個函數在GCC中是以庫函數的形式存在,這個庫函數在glibc庫中,在stdio.h頭文件中被聲明。

總的來說,如果真正瞭解了上面3個軟體包的作用,自然就明白GCC是如何工作的。

 

三、GCC的安裝:

既然GCC本身就是一個軟體集合,那麼這些軟體集合又怎麼安裝呢,因為這個過程很複雜,我也沒有安裝過,但這個不是本文的重點,就不講了。不過網上的《Linux徹底定製指南》講得非常詳細,感興趣的可以看一看。

 

四、交叉編譯:

交叉編譯(或交叉建立)是這樣一種過程,它在一種機器結構下編譯的軟體將在另一種完全不同的機器結構下執行。一個常見的例子是在PC機上為運行在基於ARM、PowerPC或MIPS的目標機的編譯軟體。幸運的是,GCC使得這一過程所面臨的困難要比聽起來小得多。

GCC中的一般工具通常都是通過在命令行上調用命令(如gcc)來執行的。在使用交叉編譯的情況下,這些工具將根據它編譯的目標而命名。例如,要使用交叉工具鏈為ARM機器編譯簡單的Hello World程式,你可以運行如下所示的命令:

使用如下命令編譯並測試這個代碼:

$ arm-linux-gcc -o hello hello.c

 

五、arm-linux-gcc:

arm-linux-gcc是基於ARM目標機的交叉編譯軟體,前面幾年安裝arm-linux-gcc交叉編譯軟體對與一個初級嵌入式工程師來說特別棘手,因為它需要安裝多個軟體包,而且安裝過程中不能有半點差錯,因為每個軟體包都有它的依賴關係【換句話就是說安裝某個軟體包時,如果它的依賴軟體版本太低或者沒有安裝都將導致該軟體包安裝失敗】;嗯,廢話不說了,入正題,下麵是我摘自創建ARMlinux交叉編譯環境的實踐的一部分,詳細的安裝過程請參考原文或GOOGLE搜索之。

......

1、源文件準備 
binutils-2.14.tar.gz 
ftp://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.gz 
gcc-core-2.95.3.tar.gz 
ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-core-2.95.3.tar.gz 
gcc-g++2.95.3.tar.gz 
ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-g++-2.95.3.tar.gz 
glibc-2.2.4.tar.gz 
ftp://ftp.gnu.org/gnu/glibc/glibc-2.2.4.tar.gz 
glibc-linuxthreads-2.2.4.tar.gz 
ftp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.2.4.tar.gz 
linux-2.4.21.tar.gz 
ftp://ftp.kernle.org/pub/linux/kernel/v2.4/linux-2.4.21.tar.gz 
patch-2.4.21-rmk1.gz # linux kernel patch for arm 
ftp://ftp.arm.linux.org.uk/pub/l ... atch-2.4.21-rmk1.gz 

binutils-2.14.tar.gz這個壓縮包包含有ld,ar,as等一些產生或者處理二進位文件的工具。 
gcc-core-2.95.3.tar.gz這個壓縮包是GCC的主體部分,GCC是GNU Compiler Collection的簡稱,顧名思義,它能夠編譯很多種高級語言,例如C、C++,Java等,而這個壓縮包中含有C編譯器,及公共部分,而對其他語言的支持,採用另外的壓縮包單獨發佈。 
gcc-g++2.95.3.tar.gz,這個壓縮包就是為使GCC能夠編譯C++程式而單獨發佈的。 
glibc-2.2.4.tar.gz,libc是很多用戶層應用都要用到的庫,kernel和bootloader不需要這個庫的支持,這個庫主體部分封裝在這個壓縮包內。 
glibc-linuxthreads-2.2.4.tar.gz,這是Libc用於支持Posix線程而單獨發佈的一個壓縮包。 
linux-2.4.21.tar.gz,這個壓縮包就是Linux的內核。 
patch-2.4.21-rmk1.gz,這個壓縮包是用來給Linux內核打補丁,以使其可以支持ARM的硬體平臺。

......

可以看出arm-linux-gcc跟GCC所需的安裝包的名字大同小易,可這是為什麼呢?不知道網友沒有想到過這個問題,可能網友知道這些包跟GCC所用的包是不相同的,僅僅名字不一樣而已,但是知道為什麼不一樣恐怕還是有相當多的人不清楚。個人認為要瞭解arm-linux-gcc與GCC的關係和區別,這個問題才是關鍵所在。好了,不賣關子了,入正題,因為我們知道X86跟ARM所使用的指令集是不一樣的,所以所需要的binutils肯定不一樣咯;上面提到過gcc-core是依賴於binutils的,自然ARM跟X86所使用的gcc-core包也不一樣;glibc一個c庫,最終是以庫的形式存在於編譯器中,自然ARM所使用的glibc庫跟X86同樣也是不一樣的咯,其它的依此類推。

 

六、arm-linux-gcc和arm-elf-gcc:

arm-elf-gcc跟arm-linux-gcc一樣,也是是基於ARM目標機的交叉編譯軟體。但是它們不是同一個交叉編譯軟體,兩者是有區別的,兩者區別主要在於使用不同的C庫文件。arm-linux-gcc使用GNU的Glibc,而arm-elf-gcc一般使用 uClibc/uC-libc或者使用REDHAT專門為嵌入式系統的開發的C庫newlib。關於兩者的區別,請參考arm-linux-gcc arm-elf-gcc區別


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 記錄一下自己的個人網站的搭建過程。其實網上有很多教程了,有的講的好,很詳細,有的就很籠統了,當然還有抄別人的,我這篇就純屬記錄一下自己搭建的過程。 搭建一個個人網站要知道以下三個步驟, 做個比喻吧:功能變數名稱就是你家地址,通過這個地址,別人才可以找到你家;空間就是你家的大小,多少平米啊,網頁文件就是你家的 ...
  • 用圖文形式全面介紹以最簡單的方法在 Raspberry Pi 2 上安裝 Windows 10 IoT Core 操作系統及搭建 VS2015 IoT 開發環境。 ...
  • 最近練習C#項目:何問起收藏夾(HoverTreeSCJ),實現編輯網址時,遇到這個問題:比如打開視窗後,要自動顯示數據。解決方法:那麼可以通過窗體的構造函數傳遞參數。比如窗體類: 那麼新建窗體實例時就可以通過參數id傳遞數值,在SetUrlId 方法中讀取載入數據到界面。例如 new Form_E ...
  • 這是我登陸後設置cookie的方法,本來cookieValueName是用FormsAuthentication.FormsCookieName替代的,突然有一天發總是得到null值,(目前情況也不明,可能是多個cookie的問題[也不太像,之前好好的,突然就變了])之後,直接改名傳固定值"CQSP ...
  • java常量池技術 java中常量池技術說的通俗點就是java級別的緩存技術,方便快捷的創建一個對象。當需要一個對象時,從池中去獲取(如果池中沒有,就創建一個並放入池中),當下次需要相同變數的時候,不用重新創建,從而節省空間。 java八種基本類型的包裝類和對象池 java中的基本類型的包裝類、其中 ...
  • Java程式 --創建游標包 --存儲過程 推薦:http://www.cnblogs.com/roucheng/p/3504465.html ...
  • 作為一個經驗豐富的C/C++程式員, 肯定親手寫過各種功能的代碼, 比如封裝過資料庫訪問的類, 封裝過網路通信的類,封裝過日誌操作的類, 封裝過文件訪問的類, 封裝過UI界面庫等, 也在實際的項目中應用過, 但是回過頭仔細想想,其實以前自己寫過的這些代碼,只能是在特定的項目或者特定的環境中使用, 對 ...
  • 相關:http://www.cnblogs.com/roucheng/p/cfenge.html ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...