3分鐘看懂gcc、arm-Linux-gcc和arm-elf-gcc的組成及區別

2021-02-13 嵌入式ARM

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

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

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

3. Glibc:包含了主要的 c 庫,這個庫提供了基本的例程,用於分配內存,搜索目錄,讀寫文件,字符串處理等等。kernel 和 bootloader不需要這個庫的支持。

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

1. #include<stdio.h>  

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

3. {  

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

5.     return 0;  

6. }  

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


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

相關焦點

  • gcc、arm-linux-gcc和arm-elf-gcc的關係?
    二、GCC的組成結構GCC 內部結構主要由 Binutils、gcc-core、Glibc 等軟體包組成。舉例描述下上面 3 個包是如何進行運作的。五、arm-elf-gccarm-elf-gcc 跟 arm-linux-gcc 一樣,也是是基於 ARM 目標機的交叉編譯軟體。但是它們不是同一個交叉編譯軟體,兩者是有區別的,兩者區別主要在於使用不同的 C 庫文件。
  • gcc&arm-linux-gcc編譯過程詳解
    :1.gcc 2.指針,3.Makefile ,今天是第一部分gcc,內容同樣適用於arm-linux-gcc。第1節_gcc編譯器1_常用選項_編譯過程詳解gcc的使用方法gcc [選項] 文件名gcc常用選項 一個c/c++文件要經過預處理、編譯、彙編和連結才能變成可執行文件。
  • /arm-none-linux-gnueabi-gcc: No such file or directory
    ++ arm-none-linux-gnueabi-readelfarm-none-linux-gnueabi-gcc arm-none-linux-gnueabi-sizearm-none-linux-gnueabi-gcc-4.4.1 arm-none-linux-gnueabi-spritearm-none-linux-gnueabi-gcov arm-none-linux-gnueabi-stringsarm-none-linux-gnueabi-gdb
  • 【教程】arm-linux-gcc 4.3.2編譯uboot-1.1.6
    在第三期項目的視頻中,官方提供了一整套新的工具鏈,bootloader,內核和文件系統(arm-linux-gcc_4.3.2, uboot-2012.04.01
  • GNU/GCC 基礎介紹
    pc端:x86_64-linux-gnu-。否則就是gcc嵌入式(MIPS):mips-linux-gnu-。arm對應的是arm-linux-gnu,不同的平臺取代不同。彙編器和連結器。g++C++ 編譯器,事實上最終調的是cc1plus 和彙編器和連結器。常用,事實上gcc 也可以編c++程序。cppC和C++預處理器,同 gcc -E 選項c++用法同g++addr2line是一個可以將指令的地址和可執行映像轉為文件名、函數名和原始碼行數的工具。在程序崩潰時,可以快速定位代碼位置。調試ar用於建立、修改和提取檔案文件。
  • gcc中 -pthread和 -lpthread的區別
    $ gcc -v x.o -ox -pthread  /usr/lib/gcc/i486-linux-gnu/4.2.4/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both  -dynamic-linker /lib/ld-linux.so.2 -ox  /usr/lib/gcc/i486
  • GCC:優化 Linux、網際網路和一切 | Linux 中國
    發行版中包含的許多應用程式包也是用 GCC 構建的,例如 Python、Perl、Ruby、nginx、Apache HTTP 伺服器、OpenStack、Docker 和 OpenShift。各個 Linux 發行版使用 GCC 構建的大量代碼組成了內核、庫和應用程式軟體。
  • 一次搞定 Arm Linux 交叉編譯
    為了讓這個流程變得簡單,開發者們為不同的晶片開發了不同的編譯器,比如針對 Arm 平臺的 arm-linux-gcc,針對 mips 平臺的 mips-linux-gnu-gcc,這些編譯器都是基於 GCC 針對具體的架構指令集進行對應配置,所以它們在運行的時候就就會生成和該目標平臺對應的可執行文件。
  • SQLite3在ARM Cortex-A9開發板上的移植
    /configure   --prefix=$PWD/build     --host=arm-linux      CC=/opt/arm-linux-gcc-4.6.4/bin/arm-linux-gcc  OR  # .
  • gcc和g++是什麼,有什麼區別?
    需要強調的一點是,這並不是 gcc 和 g++ 的區別,gcc 指令也可以用來編譯 C++ 程序,同樣 g++ 指令也可以用於編譯 C 語言程序。那麼,gcc 和 g++ 的區別是什麼呢?接下來就給讀者做詳細的講解。實際上,只要是 GCC 支持編譯的程序代碼,都可以使用 gcc 命令完成編譯。
  • linux下Clang和gcc的區別
    這也是 gcc 做不到的 。專注,因為 clang 只需要完成詞法和語法分析,代碼優化和機器代碼的生成工作由 llvm 完成。所以和全部由自己包下的 gcc 比起來, clang 可以更專注地做好一件事。這種結構也使 clang 可以被單獨拿出來用在其他的程序裡,成為其它 app (主要是 IDE)的內嵌 C/C++ parser 。
  • 【Linux公開課】gcc編譯控制選項
    10.1.4 gcc編譯控制選項 前面已經講過,gcc的基本用法是:$ gcc [選項] [文件名] gcc後很多編譯控制選項,使得gcc可以根據不同的參數進行不同的編譯處理,可供gcc調用的參數大約有100來個,但實際使用中,並不會用到這麼多選項和參數。
  • GCC寫個庫給你玩,就這?
    -vgcc --versiong++ -vg++ --versiongcc和g++的區別gcc和g++ 都是GNU (組織)的一個編譯器。,C++的語法規則更加嚴謹一些編譯階段,g++會調用gcc, 對於C++代碼,兩者是等價的,但是因為gcc命令不能自動和C++程序使用的庫聯接,所以通常用g++來完成連結,為了統一起見,乾脆編譯/連結統統用g++了 ,這就給人一種錯覺,好像 cpp 程序只能用 g++ 似的.
  • Linux GCC簡明教程(使用GCC編寫C語言程序)
    但是 Vim 和 Emacs 並不容易上手,使用者需要記憶很多命令和快捷鍵,熟練才能生巧,所以需要一段時間的學習和適應,這會增加初學者的學習成本,所以這裡不推薦大家使用。CentOS 下有一款自帶的圖形界面編輯器,叫做 Gedit。Gedit 是一款簡單實用的文本編輯器,界面優雅,支持語法高亮,比 Vim 容易上手,它和 Windows 下的編輯器沒有什麼兩樣。
  • 嵌入式入門必看:用幾張圖輕鬆看懂GCC!
    GCC使用方法最基礎也是最高端的方法Linux環境下man gcc 命令查看幫助信息GCC常用參數編譯過程參數參數作用-c只編譯不連結,生成目標文件 .o-S只編譯不彙編,生成彙編代碼-E只預編譯-g包含調試信息-o 文件名指定輸出目標文件-I 路徑名搜索頭文件路徑庫選項參數linu
  • 如何在Ubuntu 18.04上安裝GCC編譯器
    sudo apt install build-essential該命令將安裝一堆新包,包括gcc,g ++和make。鍵入以下命令安裝所需的GCC和G ++版本:linuxidc@linuxidc:~/www.linuxidc.com$  sudo apt install gcc-7 g++-7 gcc-8 g++-8 gcc
  • GCC編譯基礎
    ❝在gcc中,如果指定-shared不指定-fPIC會報錯,無法生成非PIC的動態庫,不過clang可以。❞庫中函數和變量的地址是相對地址,不是絕對地址,真實地址在調用動態庫的程序加載時形成。動態庫的名稱有別名(soname),真名(realname)和連結名(linker name)。
  • 詳解命令-GCC
    選項 -Sgcc -S test.i將預處理輸出文件test.i彙編成test.s文件。選項 -cgcc -c test.s將彙編輸出文件test.s編譯輸出test.o文件。無選項鍊接gcc test.o -o test將編譯輸出文件test.o連結成最終可執行文件test。選項 -Ogcc -O1 test.c -o test使用編譯優化級別1編譯程序。級別為1~3,級別越大優化效果越好,但編譯時間越長。
  • gcc c語言編譯流程
    GCC原本作為GNU作業系統的官方編譯器,現已被大多數類Unix作業系統(如Linux、BSD、Mac OS X等)採納為標準的編譯器,GCC同樣適用於微軟的Windows。GCC是自由軟體過程發展中的著名例子,由自由軟體基金會以GPL協議發布。C運行庫C語言標準主要由兩部分組成:一部分描述C的語法,另一部分描述C標準庫。
  • 經典實用技術文:GCC如何內嵌彙編指令?
    但是,GCC與Microsoft的實現方法的與Borland只在格式上有點區別。當然,GCC的嵌入彙編是 AT&T格式的。還好,不管什麼格式,只是表達形式的不同而已,其內在含義是一模一樣的。還是那句話各種編譯器的實現方法是大同小異的,並沒有本質的區別。兩種實現方式首先,我們看一看在C語言中如何嵌入彙編語言代碼。