日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

GCC編譯器原理(一)------交叉編譯器制作和GCC組件及命令

發(fā)布者:幸福微風(fēng)最新更新時(shí)間:2024-08-26 來源: cnblogs關(guān)鍵字:GCC編譯器  命令 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

1.1 交叉編譯器制作

默認(rèn)安裝的 GCC 編譯系統(tǒng)所產(chǎn)生的代碼適用于本機(jī),即運(yùn)行 GCC 的機(jī)器,但也可將 GCC 安裝成能夠生成其他的機(jī)器代碼。安裝一些必須的模塊,就可產(chǎn)生多種目標(biāo)機(jī)器代碼,而且可通過命令行選擇一種希望使用的代碼。

1.1.1 目標(biāo)機(jī)

從網(wǎng)站 http://gcc.gnu.org/install/specific.html 可以得到有可能的最新目標(biāo)機(jī)列表。在此站點(diǎn)中可找到更新過的目標(biāo)機(jī)列表,以及向各種目標(biāo)機(jī)進(jìn)行移植的最新信息。關(guān)于每種可能的目標(biāo)機(jī)都有一個(gè)簡短介紹,可以查找說明得到有關(guān)移植的一些特殊需求。已知目標(biāo)的列表非常長,而且也總在加入一些新端口。

1.1.2 創(chuàng)建交叉編譯器---crosstool-ng

當(dāng)前已經(jīng)不需要我們從源碼上進(jìn)行編譯安裝一個(gè)交叉編譯器了,我們可以通過工具crosstool-ng 或是 buildroot 工具來進(jìn)行交叉編譯器的制作

(1)下載

可以在官網(wǎng)上面直接下載

官網(wǎng):http://crosstool-ng.github.io/

也可以通過git命令直接進(jìn)行clone下載:

git clone https://github.com/crosstool-ng/crosstool-ng

直接執(zhí)行g(shù)it clone命令會(huì)在你的工作目錄中建立一個(gè)crosstool-ng目錄,里面存放的是源碼。

(2)安裝

可以進(jìn)入如下網(wǎng)站查看具體的安裝幫助信息:http://crosstool-ng.github.io/docs/

  • 進(jìn)入crosstool-ng的源碼目錄,執(zhí)行如下命令進(jìn)行配置:./configure --prefix=/some/place

    • /some/place是自己的主機(jī)上的路徑。

    • ./configure命令會(huì)檢查出自己的主機(jī)上缺少哪些軟件環(huán)境,檢查出來了逐一安裝即可。

  • 執(zhí)行make命令

  • 執(zhí)行make install命令

    • 注意以上兩個(gè)命令可能會(huì)報(bào)權(quán)限不足,在命令前面加sudo解決

  • 將編譯出來的bin文件加入到臨時(shí)環(huán)境變量:export PATH='${PATH}:/some/place/bin'

    • 可以通過echo命令將其寫入 .bashrc中,如下所示:

    • 或者執(zhí)行軟鏈接也可以:sudo ln -s /some/place/bin/ct-ng /usr/local/bin/ct-ng

    • export PATH=/some/place/bin:$PATH

    • 使之生效:source /etc/bash.bashrc

    • 此環(huán)境變量只在當(dāng)前終端中有效,關(guān)閉或者切換終端后立即失效。

    • 若要在主機(jī)的任何地方任何終端上使用,必須將環(huán)境變量寫入 .bashrc中去:

(3)測試

安裝成功后,執(zhí)行 ct-ng 命令會(huì)打印如下信息:

(4)建立S3C2440交叉編譯工具鏈

【1】建立文件夾

建立工作文件夾:

rk3399@rk3399:~/work/tools/toolchain$ mkdir S3C2440_work src S3C2440

  • S3C2440_work:為S3C2440交叉編譯工具鏈的工作目錄

  • Src:存放下載下來的工具軟件源碼包

  • S3C2440:存放交叉編譯工具鏈

【2】查看支持的交叉編譯工具鏈類型

執(zhí)行命令:ct-ng list-samples

里面會(huì)列出很多的交叉編譯工具樣本。介紹ARM的幾種:

  • arm-unknown-eabi:基于裸板的,即無操作系統(tǒng)

  • arm-unknown-linux-gnueabi 是基于linux的

  • arm-unknown-linux-uclibcgnueabi是為uclinux用的。

  • arm-cortex_a8-linux-gnueabi為cortex-a8用的。

  • arm-cortexa9_neon-linux-gnueabihf:為cortex-a9帶neon用的,exynos4412就可以用此種

S3C2440選擇arm-unknown-linux-gnueabi 此種編譯器。

所有的支持的編譯器存放在rk3399@rk3399:~/work/tools/crosstool-ng/samples 此目錄下。將其arm-unknown-linux-gnueabi 中的文件拷貝到我們建立的S3C2440_work目錄下。

【3】工程配置

進(jìn)入S3C2440_work目錄中,將crosstool.config 文件改名為 .config,然后執(zhí)行 ct-ng menuconfig命令進(jìn)行配置

  • Paths and misc options:

    • Local tarballs directory:源碼包存放位置,修改為 /home/rk3399/work/tools/toolchain/src

    • Prefix directory :交叉編譯工具鏈存放位置,home/rk3399/work/tools/toolchain/S3C2440

    • Number of parallel jobs:工作線程,根據(jù)自己的CPU是多少核來選。

  • Target options:

    • Target Architecture:默認(rèn)是ARM

    • Default instruction set mode:指令集模式,默認(rèn)為ARM

    • Architecture level:架構(gòu)指令集,S3C2440為armv4t

    • Emit assembly for CPU:指定目標(biāo)處理器的名稱,GCC通過這個(gè)名字來決定通過匯編代碼來生成哪種指令。填入 arm9tdmi

    • Tune for CPU:新版本中填入上面兩個(gè)選項(xiàng)就沒有這個(gè)選項(xiàng)了,就管了。

    • Floating point:浮點(diǎn)類型,可以看芯片手冊(cè)的方框圖,看找不找不到對(duì)應(yīng)的浮點(diǎn)數(shù)類型,S3C2440沒有硬件浮點(diǎn),選擇軟件浮點(diǎn)。softfp (FPU)

  • Toolchain options:

    • Tuple's vendor string:編譯器前綴,設(shè)為s3c2440,編譯之后就為arm-s3c2440-linux-gnueabi-

    • Tuple's alias:給產(chǎn)生的交叉編譯工具起個(gè)別名,設(shè)置別名,這樣會(huì)給每個(gè)工具創(chuàng)建一個(gè)軟鏈接,比如arm-linux-gcc鏈接到到 arm-unknown-linux-gnueabi-gcc,可以省去自己建立軟鏈接的功夫。設(shè)置為

  • Operating System:

    • Source of linux:linux源碼,這里沒有自己需要的源碼包,可以在 .config中修改配置,系統(tǒng)會(huì)自動(dòng)去下載。

  • 剩余的其他選項(xiàng)保持默認(rèn)即可。

架構(gòu)和處理器名稱,可以在芯片手冊(cè)的方框圖中找到,如下:

【4】編譯

執(zhí)行命令 ct-ng build 即可開始編譯。

制作完成會(huì)打印出下面的語句:

(5)制作 exynos 4412 編譯器

基本步驟與上面類似,不同的是在crosstool-ng中編譯器的選擇方面和工程配置上面。

Exynos 4412 選擇的是 arm-cortexa9_neon-linux-gnueabihf 編譯器,exynos 4412本身就是帶neon的,處理器本身就是屬于cortexa9系列。

配置上只是更改下Target options 中的內(nèi)容:

  • Target options:

    • Architecture level:架構(gòu)指令集為armv7a

    • Emit assembly for CPU:指定目標(biāo)處理器的名稱為cortex-a9

    • Floating point:與2440不同的是,a9系列帶應(yīng)浮點(diǎn),也就是neon,這里要選擇硬件浮點(diǎn)

    • Use specific FPU:這里要填上 neon

之后就是保存編譯了。

1.1.3 編譯程序的功能

編譯程序是一個(gè)翻譯器。它讀入一種語言格式的指令(通常是文本形式的編程語言),并將它們翻譯成可在計(jì)算機(jī)上運(yùn)行的指令集合(通常是二進(jìn)制硬件指令的集合)。

  • 編譯程序可以分為兩部分:前端和后端。

    • 詞法分析是編譯程序前端的最開始部分。它從輸入中讀出字符,確定哪些是在一起的,形成符號(hào)、數(shù)字和標(biāo)點(diǎn)符號(hào)。

    • 語法分析處理會(huì)讀入來自詞法瀏覽器的符號(hào)流,以及后面跟著的一個(gè)規(guī)則集合,確定它們之間的關(guān)系。 語法分析器的輸出結(jié)果是樹結(jié)構(gòu), 會(huì)被傳遞給編譯程序的后端。

    • 語法分析樹結(jié)構(gòu)會(huì)被翻譯成偽匯編語言(psuedo-assembly language) ,叫做寄存器傳送語言(Register Transfer Language,RTL)。

    • 編譯程序的后端由分析 RTL 代碼開始,然后執(zhí)行一些優(yōu)化操作。代碼中冗余和未被使用的部分會(huì)被去掉。樹中有些部分會(huì)被移動(dòng)到其他位置以防止語句被不必要地多次執(zhí)行。總的說來,有十個(gè)以上的優(yōu)化操作,而且有些優(yōu)化操作會(huì)多次瀏覽代碼。

    • RTL 被翻譯成目標(biāo)機(jī)器上的匯編語言。

    • 激活匯編器去將匯編語言翻譯成目標(biāo)文件。該文件不是可執(zhí)行格式——它包括可執(zhí)行的目標(biāo)代碼,但并不是最終運(yùn)行的形式。另外,它更可能包括未解析的到其他模塊例程和數(shù)據(jù)的引用。

    • 連接程序?qū)碜詤R編器的目標(biāo)文件(其中有些可能保存在包含目標(biāo)文件的庫中)組合成可執(zhí)行程序。

    • 前端讀出程序的源代碼,將找到的內(nèi)容以樹的形式轉(zhuǎn)換到內(nèi)存駐留表(memory-resident table)中。一旦構(gòu)造了該樹,編譯程序的后端就會(huì)讀出樹中保存的信息,并將它們轉(zhuǎn)換成目標(biāo)機(jī)器上的匯編語言。

    • 將源文件翻譯成可執(zhí)行程序的大致步驟:

  • 所有的命令行選項(xiàng)大致可分為三類:

    • 指定語言 GCC 編譯程序有能力編譯多種語言,有些選項(xiàng)只可用于其中的一兩種。例如,-C89 選項(xiàng)只應(yīng)用于 C 語言,指定適用于 1989 年的標(biāo)準(zhǔn)。

    • 指定平臺(tái) GCC 編譯程序可以為多種平臺(tái)生成目標(biāo)代碼,而有些選項(xiàng)只能應(yīng)用于為某個(gè)指定平臺(tái)生成代碼。例如,如果輸出平臺(tái)是 Intel 386,那么-fp-ret-in-387 選項(xiàng)可用來指出要將函數(shù)調(diào)用返回的浮點(diǎn)數(shù)保存在硬件的浮點(diǎn)寄存器中。

    • 普適 很多選項(xiàng)對(duì)所有語言和平臺(tái)都適用。例如,-O 選項(xiàng)指示編譯程序要優(yōu)化輸出代碼。

例子:gcc -ansi -c muxit.c -o muxit.o

  • -ansi 即是指定語言

1.2 GCC組件及命令

1.2.1 GCC組件

GCC 是由許多組件組成的,但它們也并不總是出現(xiàn)的。有些部分是和語言相關(guān)的,所以如果沒有安裝某種特定語言,系統(tǒng)中就不會(huì)出現(xiàn)相關(guān)的文件。

組件

描述

c++

gcc 的一個(gè)版本,默認(rèn)語言設(shè)置為 C++,而且在連接的時(shí)候自動(dòng)包含標(biāo)準(zhǔn) C++庫。這和g++一樣

cc1

實(shí)際的 C 編譯程序

cc1plus

實(shí)際的 C++編譯程序

collect2

在不使用 GNU 連接程序的系統(tǒng)上, 有必要運(yùn)行 collect2 來產(chǎn)生特定的全局初始化代碼 (例如 C++的構(gòu)造函數(shù)和析構(gòu)函數(shù))

configure

GCC 源代碼樹根目錄中的一個(gè)腳本。用于設(shè)置配置值和創(chuàng)建 GCC 編譯程序必需的 make程序的描述文件

crt0.o

這個(gè)初始化和結(jié)束代碼是為每個(gè)系統(tǒng)定制的,而且也被編譯進(jìn)該文件,該文件然后會(huì)被連接到每個(gè)可執(zhí)行文件中來執(zhí)行必要的啟動(dòng)和終止程序

cygwin1.dll

Windows 的共享庫提供的 API,模擬 UNIX 系統(tǒng)調(diào)用

f77

該驅(qū)動(dòng)程序可用于編譯 Fortran

f771

實(shí)際的 Fortran 編譯程序

g++

gcc 的一個(gè)版本,默認(rèn)語言設(shè)置為 C++,而且在鏈接的時(shí)候自動(dòng)包含標(biāo)準(zhǔn) C++庫。這和 c++ 是一樣的

gcc

該驅(qū)動(dòng)程序用于執(zhí)行編譯程序和連接程序以產(chǎn)生需要的輸出

gcj

該驅(qū)動(dòng)程序用于編譯 Java

gnat1

實(shí)際的 Ada 編譯程序

gnatbind

一種工具,用于執(zhí)行 Ada 語言綁定

gnatlink

一種工具,用于執(zhí)行 Ada 語言連接

jc1

實(shí)際的 Java 編譯程序

libgcc

該庫包含的例程被作為編譯程序的一部分,是因?yàn)樗鼈兛杀贿B接到實(shí)際的可執(zhí)行程序中。它們是特殊的例程,連接到可執(zhí)行程序,來執(zhí)行基本的任務(wù),例如浮點(diǎn)運(yùn)算。這些庫中的例程通常都是平臺(tái)相關(guān)的

libgcj

運(yùn)行時(shí)庫包含所有的核心 Java 類

libobjc

對(duì)所有 Objective-C 程序都必須的運(yùn)行時(shí)庫

libstdc++

運(yùn)行時(shí)庫,包括定義為標(biāo)準(zhǔn)語言一部分的所有的 C++類和函數(shù)

 

1.2.2 GCC 編譯器命令

GCC的命令很多,常用的選項(xiàng)如下:

選項(xiàng)

描述

-c

只編譯不鏈接。

會(huì)明確指示 GCC 去編譯源代碼,在硬盤上留下目標(biāo)文件,且跳過將目標(biāo)文件連接到可執(zhí)行程序這一步。

缺省情況下, GCC通過用`.o'替換源文件名后綴`.c', `.i', `.s',等產(chǎn)生目標(biāo)文件名.可以使用-o選項(xiàng)選擇其他名字.

GCC忽略-c選項(xiàng)后面任何無法識(shí)別的輸入文件(他們不需要編譯或匯編).

如:gcc -c hello.c

-o file

指定輸出的文件名

如果沒有使用 `-o' 選項(xiàng),默認(rèn)的輸出結(jié)果是:可執(zhí)行文件為`a.out'。如gcc -c hello.c -o hello.o

-x language

明確指出后面輸入文件的語言為language (而不是從文件名后綴得到的默認(rèn)選擇).這個(gè)選項(xiàng)應(yīng)用于后面 所有的輸入文件,直到遇著下一個(gè)`-x'選項(xiàng). language的可選值有`c', `objective-c', `c-header', `c++', `cpp-output', `assembler',和`assembler-with-cpp'.

-x none

關(guān)閉任何對(duì)語種的明確說明,因此依據(jù)文件名后綴處理后面的文件(就象是從未使用過`-x'選項(xiàng)).

如果只操作四個(gè)階段(預(yù)處理,編譯,匯編,連接)中的一部分,可以使用`-x'選項(xiàng)(或文件名后綴)告訴 gcc從哪里開始,用`-c', `-S',或`-E'選項(xiàng)告訴gcc到 哪里結(jié)束.注意,某些選項(xiàng)組合(例如, `-x cpp-output -E')使gcc不作任何事情.

-S

指示編譯程序生成匯編語言代碼,然后停止。

缺省情況下, GCC通過用 `.o' 替換源文件名后綴 `.c'、`.i' 等等,產(chǎn)生 目標(biāo)文件名??梢允褂?o選項(xiàng)選擇其他名字。

匯編語言的形式依賴于編譯程序的目標(biāo)平臺(tái)。如果編譯多個(gè)源文件,會(huì)為每個(gè)源文件都生成一個(gè)匯編語言模塊。

GCC忽略任何不需要編譯的輸入文件。

gcc -S helloworld.c

-E

預(yù)處理后即停止,不進(jìn)行編譯。預(yù)處理后的代碼送往標(biāo)準(zhǔn)輸出

GCC忽略任何不需要預(yù)處理的輸入文件.

gcc -E helloworld.c

gcc -E helloworld.c -o helloworld.i

-C

告訴預(yù)處理器不要丟棄注釋,配合 `-E' 選項(xiàng)使用。

-P

告訴預(yù)處理器不要產(chǎn)生 `#line' 命令,配合 `-E' 選項(xiàng)使用

-v

(在標(biāo)準(zhǔn)錯(cuò)誤)顯示執(zhí)行編譯階段的命令.同時(shí)顯示編譯器驅(qū)動(dòng)程序,預(yù)處理器,編譯器的版本號(hào).

-pipe

在編譯過程的不同階段間使用管道而非臨時(shí)文件進(jìn)行通信.這個(gè)選項(xiàng)在某些系統(tǒng)上無法工作,因?yàn)槟切┫到y(tǒng)的 匯編器不能從管道讀取數(shù)據(jù). GNU的匯編器沒有這個(gè)問題.

-ldl

表示生成的對(duì)象模塊需要用到共享庫:$ gcc say.c -ldl -o say

主要是用到了 dlopen 等函數(shù)需要用到此選項(xiàng)

-I

指定頭文件路徑

-e name

指定 name 為程序的入口地址

-ffreestanding

編譯獨(dú)立的程序,不會(huì)自動(dòng)鏈接 C 運(yùn)行庫、啟動(dòng)文件等;他隱含聲明了 `-fno-builtin' 選項(xiàng),而且對(duì)main函數(shù)沒有特別要求。

-finline-functions

-fno-inline-funcitons

啟用內(nèi)聯(lián)函數(shù)

關(guān)閉內(nèi)聯(lián)函數(shù)

-g

以操作系統(tǒng)的本地格式(stabs,COFF,XCOFF 或 DWARF)產(chǎn)生調(diào)試信息,GDB能夠使用這些調(diào)試信息。

-ggdb

以本地格式(如果支持)輸出調(diào)試信息,盡可能包括GDB擴(kuò)展。

-L

指定鏈接時(shí)查找路徑,多個(gè)路徑之間用冒號(hào)隔開

-nostartfiles

不鏈接系統(tǒng)標(biāo)準(zhǔn)啟動(dòng)文件,比如crtbegin.o、crtend.o,而標(biāo)準(zhǔn)庫文件仍然正常使用。

-nostdlib

不鏈接系統(tǒng)標(biāo)準(zhǔn)啟動(dòng)文件和標(biāo)準(zhǔn)庫文件,只把指定的文件傳遞給連接器。

-static

在支持動(dòng)態(tài)連接(dynamic linking)的系統(tǒng)上阻止連接共享庫。即只能使用靜態(tài)鏈接。

-shared

生成一個(gè)共享目標(biāo)文件,他可以和其他目標(biāo)文件鏈接產(chǎn)生可執(zhí)行文件。

-O
-O1

優(yōu)化。對(duì)于大函數(shù),優(yōu)化編譯占用稍微多的時(shí)間和相當(dāng)大的內(nèi)存。

不使用 `-O' 選項(xiàng)時(shí),編譯器的目標(biāo)是減少編譯的開銷,使編譯結(jié)果能夠調(diào)試。

語句是獨(dú)立的:如果在兩條語句之間用斷點(diǎn)中止程序,可以對(duì)任何變量重新賦值,或者在函數(shù)體內(nèi)把程序計(jì)數(shù)器指到其他語句,以及從源程序中精確地獲取你期待的結(jié)果。

不使用 `-O' 選項(xiàng)時(shí),只有聲明了register的變量才分配使用寄存器。編譯結(jié)果比不用 `-O' 選項(xiàng)的GCC要略遜一籌.

使用了 `-O' 選項(xiàng),編譯器會(huì)試圖減少目標(biāo)碼的大小和執(zhí)行時(shí)間。

如果指定了`-O'選項(xiàng),,`-fthread-jumps' 和 `-fdefer-pop' 選項(xiàng)將被打開。

-O2

多優(yōu)化一些。

除了涉及空間和速度交換的優(yōu)化選項(xiàng),執(zhí)行幾乎所有的優(yōu)化工作。例如不進(jìn)行循環(huán)展開(loop unrolling)和函數(shù)內(nèi)嵌(inlining)。

和 -O 選項(xiàng)比較,這個(gè)選項(xiàng)既增加了編譯時(shí)間,也提高了生成代碼的運(yùn)行效果。

-O3

優(yōu)化的更多。除了打開 -O2所做的一切,它還打開了-finline-functions選項(xiàng)。

-O0

不優(yōu)化。如果指定了多個(gè) -O選項(xiàng),不管帶不帶數(shù)字,最后一個(gè)選項(xiàng)才是生效的選項(xiàng)。

-Wall

對(duì)源代碼中的多數(shù)編譯警告進(jìn)行啟用

-fpic

如果支持這種目標(biāo)機(jī),編譯器就生成位置無關(guān)目標(biāo)碼。適用于共享庫(shared library)。

-fPIC

如果支持這種目標(biāo)機(jī),編譯器就輸出位置無關(guān)目標(biāo)碼。適用于動(dòng)態(tài)連接(dynamic linking),即使分支需要大范圍轉(zhuǎn)移。

-fPIE

使用地址無關(guān)代碼模式編譯可執(zhí)行文件

-Xlinker option

把選項(xiàng)option傳遞給連接器,可以用他傳遞系統(tǒng)特定的連接選項(xiàng), GNU CC無法識(shí)別這些選項(xiàng)。

如果需要傳遞攜帶參數(shù)的選項(xiàng),必須使用兩次 `-Xlinker',一次傳遞選項(xiàng),另一次傳遞他的參數(shù)。

例如,如果傳遞 `-assert definitions',必須寫成 `-Xlinker -assert -Xlinker definitions',而不能寫成 `-Xlinker '-assert definitions'',因?yàn)檫@樣會(huì)把整個(gè)字符串當(dāng)做一個(gè)參數(shù)傳遞,顯然這不是連接器期待的。

-Wl option

把選項(xiàng)option傳遞給連接器。如果option中含有逗號(hào),就在逗號(hào)處分割成多個(gè)選項(xiàng)。

-fomit-frame-pointer

禁止使用 EBP 作為函數(shù)幀指針

-fno-builtin

禁止 GCC 編譯器內(nèi)置函數(shù)

-ffunction-sections

將每個(gè)函數(shù)編譯到獨(dú)立的代碼段

-fdata-sections

將全局/靜態(tài)變量編譯到獨(dú)立的數(shù)據(jù)段


關(guān)鍵字:GCC編譯器  命令 引用地址:GCC編譯器原理(一)------交叉編譯器制作和GCC組件及命令

上一篇:GCC編譯器原理(一)------GCC 工具:addr2line、ar、as、c++filt和elfedit
下一篇:三、編寫 s3c24x0 的 bootloader——重定位(一)

小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved