亚洲精品一二区_国产黄色片网站_99久久久成人国产精品_蜜臀网_国产精品一区二区三区免费_成人av中文字幕_91精品国产欧美一区二区成人


嵌入式Linux編譯器GCC編譯流程

分享到:
           

    作為自由軟件的旗艦項(xiàng)目,Richard Stallman在十多年前剛開(kāi)始寫(xiě)作GCC的時(shí)候,還只是僅僅把它當(dāng)作一個(gè)C程序語(yǔ)言的編譯器,GCC的意思也只是GNU C Compiler而已。

    經(jīng)過(guò)了這么多年的發(fā)展,嵌入式Linux編譯器GCC已經(jīng)不僅僅能支持C語(yǔ)言,它現(xiàn)在還支持Ada語(yǔ)言、C++語(yǔ)言、Java語(yǔ)言、Objective C語(yǔ)言、PASCAL語(yǔ)言、COBOL語(yǔ)言,并支持函數(shù)式編程和邏輯編程的Mercury語(yǔ)言等。而GCC也不再單指GNU C語(yǔ)言編譯器的意思了,而是變成了GNU編譯器家族了。

    GCC的編譯流程分為了4個(gè)步驟,分別如下。

    ·預(yù)處理(Pre-Processing)。
    ·編譯(Compiling)。
    ·匯編(Assembling)。
    ·鏈接(Linking)。

    編譯器通過(guò)程序的擴(kuò)展名可分辨編寫(xiě)原始程序碼所用的語(yǔ)言,由于不同的程序所需要執(zhí)行編譯的步驟是不同的,因此GCC根據(jù)不同的后綴名對(duì)它們進(jìn)行分別處理,表1.1指出了不同后綴名的處理方式。

GCC所支持后綴名解釋
表1.1
表1.1

    GCC使用的基本語(yǔ)法為:
    gcc [option | filename]

    這里的option是GCC使用時(shí)的一些選項(xiàng),通過(guò)指定不同的選項(xiàng)GCC可以實(shí)現(xiàn)其強(qiáng)大的功能。這里的filename則是GCC要編譯的文件,GCC會(huì)根據(jù)用戶所指定的編譯選項(xiàng)以及所識(shí)別的文件后綴名來(lái)對(duì)編譯文件進(jìn)行相應(yīng)的處理。

    本節(jié)從編譯流程的角度講解GCC的常見(jiàn)使用方法。

    首先,這里有一段簡(jiǎn)單的C語(yǔ)言程序,該程序由兩個(gè)文件組成,其中“hello.h”為頭文件,在“hello.c”中包含了“hello.h”,其源文件如下所示。

    /*hello.h*/
    #ifndef _HELLO_H_
    #define _HELLO_H_
    typedef unsigned long val32_t;
    #endif
    /*hello.c*/
    #include < stdio.h>
    #include < stdlib.h>
    #include "hello.h"
    int main()
    {
        val32_t i = 5;
        printf("hello, embedded world %d\n",i);
    }

    1.預(yù)處理階段

    GCC的選項(xiàng)“-E”可以使編譯器在預(yù)處理結(jié)束時(shí)就停止編譯,選項(xiàng)“-o”是指定GCC輸出的結(jié)果,其命令格式為如下所示。
    gcc –E –o [目標(biāo)文件] [編譯文件]

    表2.6指出后綴名為“.i”的文件是經(jīng)過(guò)預(yù)處理的C原始程序。要注意,“hello.h”文件是不能進(jìn)行編譯的,因此,使編譯器在預(yù)處理后停止的命令如下所示。
    [root@localhost gcc]# gcc –E –o hello.i hello.c

    在此處,選項(xiàng)“-o”是指目標(biāo)文件,由表2.6可知,“.i”文件為已經(jīng)過(guò)預(yù)處理的C原始程序。以下列出了hello.i文件的部分內(nèi)容。
    # 2 "hello.c" 2
    # 1 "hello.h" 1
    typedef unsigned long val32_t;
    # 3 "hello.c" 2
    int main()
    {
        val32_t i = 5;
        printf("hello, embedded world %d\n",i);
    }

    由此可見(jiàn),GCC確實(shí)進(jìn)行了預(yù)處理,它把“hello.h”的內(nèi)容插入到hello.i文件中了。

    2.編譯階段

    編譯器在預(yù)處理結(jié)束之后,GCC首先要檢查代碼的規(guī)范性、是否有語(yǔ)法錯(cuò)誤等,以確定代碼的實(shí)際要做的工作,在檢查無(wú)誤后,就開(kāi)始把代碼翻譯成匯編語(yǔ)言,GCC的選項(xiàng)“-S”能使編譯器在進(jìn)行完匯編之前就停止。由表1.1可知,“.s”是匯編語(yǔ)言原始程序,因此,此處的目標(biāo)文件就可設(shè)為“.s”類(lèi)型。
    [root@localhost gcc]# gcc –S –o hello.s hello.i

    以下列出了hello.s的內(nèi)容,可見(jiàn)GCC已經(jīng)將其轉(zhuǎn)化為匯編了,感興趣的讀者可以分析一下這一行簡(jiǎn)單的C語(yǔ)言小程序用匯編代碼是如何實(shí)現(xiàn)的。

     .file "hello.c"
    .section .rodata
    .LC0:
    .string "hello, embedded world %d\n"
    .text
    .globl main
    .type main, @function
    main:
        pushl    %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        addl    $15, %eax
        addl    $15, %eax
        shrl    $4, %eax
        sall    $4, %eax
        subl    %eax, %esp
        movl    $5, -4(%ebp)
        subl    $8, %esp
        pushl    -4(%ebp)
        pushl    $.LC0
        call    printf
        addl    $16, %esp
        leave
        ret
        .size main, .-main
        .section .note.GNU-stack,"",@progbits
        . .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)"

    可以看到,這一小段C語(yǔ)言的程序在匯編中已經(jīng)復(fù)雜很多了,這也是C語(yǔ)言作為中級(jí)語(yǔ)言的優(yōu)勢(shì)所在。

    3.匯編階段

    匯編階段是把編譯階段生成的“.s”文件生成目標(biāo)文件,讀者在此使用選項(xiàng)“-c”就可看到匯編代碼已轉(zhuǎn)化為“.o”的二進(jìn)制目標(biāo)代碼了,如下所示。
    [root@localhost gcc]# gcc –c hello.s –o hello.o

    4.鏈接階段

    在成功編譯之后,就進(jìn)入了鏈接階段。在這里涉及一個(gè)重要的概念——函數(shù)庫(kù)。

    在這個(gè)程序中并沒(méi)有定義“printf”的函數(shù)實(shí)現(xiàn),在預(yù)編譯中包含進(jìn)的“stdio.h”中也只有該函數(shù)的聲明,而沒(méi)有定義函數(shù)的實(shí)現(xiàn),那么,是在哪里實(shí)現(xiàn)“printf”函數(shù)的呢?

    后的答案是:系統(tǒng)把這些函數(shù)實(shí)現(xiàn)都已經(jīng)被放入名為libc.so.6的庫(kù)文件中去了,在沒(méi)有特別指定時(shí),GCC會(huì)到系統(tǒng)默認(rèn)的搜索路徑“/usr/lib”下進(jìn)行查找,也就是鏈接到libc.so.6庫(kù)函數(shù)中去,這樣就能實(shí)現(xiàn)函數(shù)“printf”了,而這也就是鏈接的作用。

    完成了鏈接之后,GCC就可以生成可執(zhí)行文件,其命令如下所示。
    [root@localhost gcc]# gcc hello.o –o hello

    運(yùn)行該可執(zhí)行文件,出現(xiàn)正確的結(jié)果。
    [root@localhost gcc]# ./hello
    hello, embedded world 5


   熱點(diǎn)鏈接:

   1、WindowsAndroid:在PC上運(yùn)行Android
   2、ARM處理器是什么
   3、FPGA從事的工作是什么
   4、北京嵌入式培訓(xùn)哪好
   5、嵌入式培訓(xùn)資料:搭建交叉編譯環(huán)境

更多新聞>> 

主站蜘蛛池模板: 日本亚洲国产 | 高清免费a级在线观看国产 高清欧美不卡一区二区三区 | 久久伊人精品一区二区三区 | 免费爱爱视频 | 国产人妖在线 | 久久老司机波多野结衣 | 国产三级在线 | 中文字幕日本一本二本三区 | 99国产精品免费观看视频 | 99视频精品全部在线播放 | 中国日韩欧美中文日韩欧美色 | 日本在线观看中文字幕 | 两个人看的www高清免费视频 | 免费a级 | 日本免费v片一二三区 | 激情视频在线 | 999久久免费高清热精品 | 国内精品福利丝袜视频_速 国内精品福利在线视频 | 精品一区二区三区影片 | 国产伦精品一区二区三区免费迷 | 国产资源网 | 欧美日韩三级在线 | 国产成人精品日本亚洲语言 | 在线观看亚洲成人 | 99久久综合给久久精品 | 中文字幕aⅴ在线视频 | 日本人视频69式 jzzij | 日本3p视频在线看高清 | 另类视频在线观看 | 国产成人免费片在线观看 | 玖玖色| 国产午夜免费福利红片 | 久视频免费精品6 | 国产欧美日韩网站 | 97人人模人人爽视频一区二区 | 9999毛片免费看 | a毛片免费全部播放完整成 a毛片免费全部在线播放毛 | 香蕉视频日本 | 久久久久久久久久免观看 | 久久精品99 | 九九热视频免费在线观看 |