GCC編譯器


GCC編譯器

GCC(GNU Compiler Collection,GNU編譯器套裝),一套由GNU開發的編程語言編譯器。一套GNU編譯器套裝以GPL及LGPL許可證所發行的自由軟件,也是GNU計划的關鍵部分,亦是自由的類Unix及蘋果電腦Mac OS X操作系統的標准編譯器。GCC原名為GNU C語言編譯器,原本只能處理C語言。GCC很快地擴展,變得可處理C++。之后也變得可處理Fortran、Pascal、Objective-C、Java以及Ada與其它語言。GCC4.4開始默認支持2F架構,GCC4.6開始默認支持3A架構。
  調優目標是SPEC CPU2000、coremark和Linux內核等,主要手段是通過調整編譯器后端的目標指令集,綜合使用窺孔、指令拆分、寄存器分配約束、指令調度等優化來生成處理器上性能更好的指令序列。主要的優化方法包含:

  1. Fedora/CentOS系統中安裝的gcc默認在O32下使用mips1指令集,在N64下使用mips3指令集,使用具有更優性能的mips64選項編譯上述兩個系統,已經通過測試,新的CentOS已經發布;
  2. 在N32、N64 ABI下,對函數序跋中的成對64位訪存指令,在其地址滿足16字節對齊的約束下,進行窺孔優化,使用處理器核提供的128位訪存指令來完成相同功能;
  3. 對程序中出現的64位數組指針計算,采用特殊的指令拆分,使用處理器核提供的64位三操作數乘法,從而消除hi/lo相關操作以及移位拼接;
  4. 修改gcc的寄存器分配覆蓋集描述,從覆蓋集中去掉hi/lo寄存器,避免程序寄存器壓力過大時,分配hi/lo作為通用寄存器的暫存寄存器而引發的流水線停頓;
  5. 優化-march=loongson3a的流水線描述,使得長延遲操作如load/mult/div/mod等盡量提早發射,減少流水線因數據相關造成的停頓;
  6. 修正gcc編譯器在loongson3a/b o32 abi 下不使用浮點奇數號寄存器;

GCC FAQ:

1、如何查看gcc編譯器版本?

    gcc -v

2、如何指定編譯出來的程序是32位或64位?

    可以通過編譯選項-mabi=xx指定。

    gcc -mabi=32  #32 位程序(fedora13默認是32位,centos6.4、fedora21需要安裝多庫版本。)

    gcc -mabi=64  #64 位程序 (fedora13是32位系統,無法編譯出64位程序,centos6.4、fedora21默認是64位。)

    gcc -mabi=n32  #n32 程序 (fedora13是32位系統,無法編譯出n32程序,centos6.4、fedora21需要安裝多庫版本。)

3、如何查看一個二進制程序是32位還是64位的?

    linux下可以通過命令file查看。

    $file a.out

      ELF 32-bit LSB executable, MIPS, MIPS64 version 1 (SYSV),  #32 位程序

    $file a.out

      ELF 64-bit LSB executable, MIPS, MIPS64 version 1 (SYSV),  #64 位程序

    $file a.out

      ELF 32-bit LSB executable, MIPS, N32 MIPS64 version 1 (SYSV),  #n32 程序

4、什么是多庫版本,如何查看系統是否為多庫版本?

    多庫版本是64位操作系統中有32位和n32的glibc庫版本。

    $rpm -qa | grep glibc

     glibc-32-xxx  #32表示32位庫,xxx為版本號。

     glibc-n32-xxx #n32表示n32庫,xxx為版本號。

 

調試bug

如何准確、快速的提交一個關於GCC的bug,以便盡快解決。

 

在提交一個bug之前,首先檢查代碼本身的正確性,用編譯選項 gcc -Wall -Wextra 查看輸出出錯信息,確保代碼的正確性。

 

提交一個bug,需要以下信息:

 

步驟

1、GCC的版本(通過gcc -v 命令查看):

    gcc -v

2、系統類型、版本:

    cat /etc/issue

    cat /proc/cpuinfo

3、產生bug時的編譯選項:

    gcc you_options

    如果為一個工程,包含多個源文件,將編譯的輸出log提交(如涉及保密及知識產權,將導致出錯的單個命令行,輸出做敏感處理后提供)

4、編譯預處理文件(添加編譯選項 -v -save-temps,將產生的輸出信息重定向到一個文件,並將產生的*.i文件和輸出信息重定向文件):

    gcc -v -save-temps your_options your_filename.c 2>&1 | tee compile_output.txt

源文件無法編譯、復現問題,將編譯時加 -v -save-temps時的輸出信息和產生的*.i 文件。

 

維護三個主要版本的gcc,分別為gcc-4.4(配套的操作系統為centos 6.4、 fedora 13)、gcc-4.9(配套的操作系統為loongnix1.0)和gcc-7(在loongnix1.0中通過devtoolset集成)。

 

不同版本之間的優化性能差別,不同版本之間比較時,用-O2選項或同級別的優化選項。

 

工具鏈

1. 優化版本gcc編譯器

2. 64位是指編譯生成的二進制文件是mips 64位的,32位同理

4. gs464核linux交叉編譯器(gcc-7.3.1)

工具鏈支持情況

 

 

 表格中畫対號的是支持的庫類型

 

如果不添加編譯參數,則默認編譯的目標文件為"mips32r2 mabi=32 glibc"

 

如果想要編譯其它類型目標文件需要添加參數.

 

例如,如果需要編譯mips64r2 n64的目標文件:

 

 

 添加參數"-mips64r2 -mabi=64".

 

工具鏈信息

 

 

 其中,single float是只存在當精度浮點指令.如果代碼中出現了雙精度浮點運算,則使用軟浮點實現.

  • 工具鏈中工具/庫版本信息

 

  • 其中指令集和架構支持同mips-201901-loongson-linux

7. gs464核sde elf交叉編譯器(gcc-8.3.0)說明

  • 工具鏈支持情況

此工具鏈為裸板工具鏈,支持 "mips32r2 o32" 、 "mips32 o32" 與 "mips16 o32"

 

其中,single float是只存在當精度浮點指令.如果代碼中出現了雙精度浮點運算,則使用軟浮點實現.

  • 工具鏈中工具/庫版本信息

 

 

 其中指令集和架構支持同mips-201901-loongson-linux

8. gs464核linux交叉編譯器(gcc-8.3.0)說明

工具鏈支持情況

ABI: o32 n32 n64

庫: glibc

浮點類型: hard float

如果不添加編譯參數,則默認編譯的目標文件為"mips32r2 mabi=32 glibc"

 

如果想要編譯其它類型目標文件需要添加參數.

 

例如,如果需要編譯mips64r2 n64的目標文件:

 

添加參數"-mips64r2 -mabi=64".

其它類推

 

另外,從rc1.1開始支持gdb和gdbserver

 

* mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc/usr/lib64/bin/gdbserver

* mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc/usr/lib/bin/gdbserver

* mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc/usr/lib32/bin/gdbserver

根據自己目標系統的ABI選擇使用哪個gdbserver

 

 

 注意事項:

所有的gs464核交叉編譯器均運行在x86_64位系統上,32位x86系統暫不支持,

ls232核交叉編譯器運行在x86 32位系統上,在64位系統上運行請安裝32位庫。

運行交叉編譯的操作系統為RHEL/centos-6系列,ubuntu-13/14/15等,某些linux發行版無法運行,自行切換操作系統。

修改內容:

在o32 ABI下不使用奇數號浮點寄存器。

在ll與sc之間的跳轉指令的目標地址前加sync指令。

 

參考鏈接:

http://www.loongnix.org/index.php/Cross-compile


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM