GCC學習筆記(二)

2021-10-07 03:14:14 字數 2035 閱讀 5784

本文主要介紹gcc編譯器的主要組成部分以及gcc編譯器的命名規則。

乙個abi定義了機器**如何訪問資料結構與運算程式,此處所定義的介面相當低端並且相依於硬體。而類似概念的api則在源**定義這些,則較為高階,並不直接相依於硬體,通常會是人類可閱讀的**。理解abi時可以參考api。

決定要不要採取既定的abi(不論是否由官方提供),通常由編譯器,作業系統或庫的開發者來決定;然而,如果撰寫乙個混和多個程式語言的應用程式,就必須直接處理abi,採用外部函式呼叫來達成此目的。主要和目標平台的架構有關。例如gcc最終編譯成功的helloworld,遵從x86的呼叫約定即是乙個abi的例子。

abi涵蓋了各種細節:

嵌入式應用二進位制介面指定了檔案格式、資料型別、暫存器使用、堆積組織優化和在乙個嵌入式軟體中的引數的標準約定。開發者使用自己的組合語言也可以使用eabi作為與相容的編譯器生成的組合語言的介面。 支援eabi的編譯器建立的目標檔案可以和使用類似編譯器產生的**相容,這樣允許開發者鏈結乙個由不同編譯器產生的庫。比如eabignueabihf

gcc 內部結構主要由 binutils、gcc-core、glibc 等軟體包組成。

gnu binutils是二進位制工具的集合。 主要的是:

當然還包含很多重要的工具

gcc-core:gcc 的核心部分,這部分包含 c 的編譯器及公共部分,而對其他語言(c++、ada 等)的支援包需要另外安裝,這也是 gcc 為何如此強大的重要原因 。gcc-core依賴於 binutils

glibc:gnu c庫(英語:gnu c library,常簡稱為glibc)是一種c函式庫,是程式執行時使用到的一些api集合,它們一般是已預先編譯好,以二進位制**形式存在linux類系統中。當然並不是所有的都依賴glibc,還有其他的c庫如: uclibc、dietlibc 、newlib。

所以很多廠家修改gcc編譯器的組成模組,使編譯器可以編譯不同架構或者不同c庫依賴的**。

谷歌了很久沒有找到相對官方的說明文件,瀏覽了很多網頁,發現了很多標準,個人覺得比較靠譜結構大體如下,當然也不是適合所有的編譯器命名,僅供參考。

arch - vendor - (os- )abi

架構 - 廠商 - 作業系統 - 二進位制應用介面

根據對作業系統的支援與否,arm gcc可分為支援和不支援作業系統,如

arm-none-eabi:這個是沒有作業系統的,自然不可能支援那些跟作業系統關係密切的函式,比如fork(2)。他使用的是newlib這個專用於嵌入式系統的c庫。

arm-none-linux-eabi:用於linux的,使用glibc

示例:arm-none-linux-gnueabi專案

value

archarm

vendorno vendor

oslinux

abignueabi abi

主要用於基於arm架構的linux系統,可用於編譯 arm 架構的 u-boot、linux核心、linux應用等。arm-none-linux-gnueabi基於gcc,使用glibc庫,經過 codesourcery 公司優化過推出的編譯器。arm-none-linux-gnueabi-*** 交叉編譯工具的浮點運算非常優秀。一般arm9、arm11、cortex-a 核心,帶有 linux 作業系統的會用到。

arm-none-eabi專案

value

archarm

vendorno vendor

osno os

abignueabi abi

gcc學習筆記

1 連線標頭檔案 gcc i usr openwim include fred.c 使用 i 標誌來包含儲存在子目錄或者非標準位置的中的標頭檔案。例如上邊語句指示編譯器不僅在標準位置,也在 usr openwim include 目錄中查詢程式 fred.c包含的標頭檔案。2 連線庫檔案 a 靜態庫...

gcc 學習筆記

gcc 編譯程式的過程 預處理 pre processing 編譯 compiling 彙編 assembling 鏈結 linking 選項名 作用 o 產生目標 i s o 可執行檔案等 c 通知gcc取消鏈結步驟,即編譯原始碼並在最後生成目標檔案 e 只執行c預編譯器 s 告訴編譯器產生組合語...

gcc學習筆記

預處理 gcc e hello.c o hello.i 輸出預處理後的檔案 編譯 gcc s hello.i o hello.s 輸出彙編結果 彙編 gcc c hello.s o hello.o 輸出二進位制檔案 鏈結 gcc hello.s o hello 輸出鏈結後的二進位制,沒有選項 wal...