IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育


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

分享到:
           

    作為自由軟件的旗艦項目,Richard Stallman在十多年前剛開始寫作GCC的時候,還只是僅僅把它當作一個C程序語言的編譯器,GCC的意思也只是GNU C Compiler而已。

    經過了這么多年的發展,嵌入式Linux編譯器GCC已經不僅僅能支持C語言,它現在還支持Ada語言、C++語言、Java語言、Objective C語言、PASCAL語言、COBOL語言,并支持函數式編程和邏輯編程的Mercury語言等。而GCC也不再單指GNU C語言編譯器的意思了,而是變成了GNU編譯器家族了。

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

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

    編譯器通過程序的擴展名可分辨編寫原始程序碼所用的語言,由于不同的程序所需要執行編譯的步驟是不同的,因此GCC根據不同的后綴名對它們進行分別處理,表1.1指出了不同后綴名的處理方式。

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

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

    這里的option是GCC使用時的一些選項,通過指定不同的選項GCC可以實現其強大的功能。這里的filename則是GCC要編譯的文件,GCC會根據用戶所指定的編譯選項以及所識別的文件后綴名來對編譯文件進行相應的處理。

    本節從編譯流程的角度講解GCC的常見使用方法。

    首先,這里有一段簡單的C語言程序,該程序由兩個文件組成,其中“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.預處理階段

    GCC的選項“-E”可以使編譯器在預處理結束時就停止編譯,選項“-o”是指定GCC輸出的結果,其命令格式為如下所示。
    gcc –E –o [目標文件] [編譯文件]

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

    在此處,選項“-o”是指目標文件,由表2.6可知,“.i”文件為已經過預處理的C原始程序。以下列出了hello.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);
    }

    由此可見,GCC確實進行了預處理,它把“hello.h”的內容插入到hello.i文件中了。

    2.編譯階段

    編譯器在預處理結束之后,GCC首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,就開始把代碼翻譯成匯編語言,GCC的選項“-S”能使編譯器在進行完匯編之前就停止。由表1.1可知,“.s”是匯編語言原始程序,因此,此處的目標文件就可設為“.s”類型。
    [root@localhost gcc]# gcc –S –o hello.s hello.i

    以下列出了hello.s的內容,可見GCC已經將其轉化為匯編了,感興趣的讀者可以分析一下這一行簡單的C語言小程序用匯編代碼是如何實現的。

     .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語言的程序在匯編中已經復雜很多了,這也是C語言作為中級語言的優勢所在。

    3.匯編階段

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

    4.鏈接階段

    在成功編譯之后,就進入了鏈接階段。在這里涉及一個重要的概念——函數庫。

    在這個程序中并沒有定義“printf”的函數實現,在預編譯中包含進的“stdio.h”中也只有該函數的聲明,而沒有定義函數的實現,那么,是在哪里實現“printf”函數的呢?

    后的答案是:系統把這些函數實現都已經被放入名為libc.so.6的庫文件中去了,在沒有特別指定時,GCC會到系統默認的搜索路徑“/usr/lib”下進行查找,也就是鏈接到libc.so.6庫函數中去,這樣就能實現函數“printf”了,而這也就是鏈接的作用。

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

    運行該可執行文件,出現正確的結果。
    [root@localhost gcc]# ./hello
    hello, embedded world 5


   熱點鏈接:

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

更多新聞>> 

主站蜘蛛池模板: 液态硅胶制品厂家_液态硅胶包胶加工_LSR液态硅胶模具厂_液体硅胶注射成型_广东盈泰 | 液压升降货梯_导轨式升降机_往复式提升机_济南宇轩机械厂家 | 亚澳农机-亚澳南阳农机股份公司,旋耕机,旋播机,旋播施肥机,免耕播种机,旋耕播草多用机,果园机械-首页 | 津南人才网_津南招聘网_求职找工作平台 | 智能化会议系统|多媒体会议系统|无纸化会议系统|会议音箱|高清视频会议终端|智能化会议室|会议系统|视频会议系统-深圳市航视达科技有限公司 | 衢州网站建设_网络公司_做网站_网站制作_网页设计-优骆网络 | 吸管包装机_塑料杯包装机_纸杯包装机_吸管挤出机_温州恩博机械有限公司 | 上饶环亚电脑会计培训学校--电脑学校|上饶电脑学校|上饶电脑培训|会计培训|上饶会计培训|上饶县会计培训|广丰会计培训|玉山会计培训|横峰会计培训|上饶网店培训 上进电缆(嘉兴)股份有限公司官网 - 光伏电缆|防火电缆|电力电缆|铝合金电缆专业生产厂家 | 全自动热敷贴(袋)温度特性检测仪-武汉伊特仪器有限公司 | 河北湛存边坡防护工程有限公司-边坡防护网_边坡绿化修复_喷浆挂网 | 新闻营销媒体发稿-新闻发布-文芳阁网络媒体发稿公司 | 厦门,泉州自助餐上门|生日自助餐|婚礼自助餐|公司聚会自助餐|户外烧烤|冷餐|茶歇外卖配送-福建非选餐饮公司 | 上虞大金湖官网|数控外圆磨床|数控内圆磨床|数控无心磨床 | 移动石料破碎机-颚式锤式反击式破碎机设备厂家_山东.青州富康机械 | 全自动贴标机厂家-深圳市优斯迪自动贴标机官网 | 首页 - 北京明朝万达科技股份有限公司 | 起名字典|宝宝新生儿男孩女孩起名免费网-诗经周易生辰八字取名字大全 | 铁三角话筒-思美音频处理器-艾伦赫赛数字调音台-北京盛世音盟电子科技有限公司 | 盘扣租赁|盘扣架租赁|盘扣脚手架|盘扣脚手架租赁|盘扣式脚手架|盘扣式脚手架租赁-北京亚欧盟盘扣租赁有限公司 | 兰州沙盘模型公司_兰州模型公司_兰州沙盘模型厂家_地形沙盘制作_兰州沙盘模型制作公司 | 威海保温板,威海泡沫,威海EPS,威海EPP-威海东兴泡塑科技有限公司 | 荧光显微镜,倒置显微镜,显微镜相机,荧光光源——广州市明美光电技术有限公司 | 潍坊亿宏重工机械有限公司,破碎机,高性能立磨机,颚式破碎机,锤式破碎机反击式破碎机,重锤式破碎机,高性能反击式破碎机,圆锥式破碎机,给料机系列,链板给料机系列,简易给料机系列,振动给料机 | 济宁市兴大工程机械有限公司 | 燃气锅炉-供暖锅炉-热水锅炉-电锅炉-北京锅炉安装公司-北京亦辰科技有限公司 | 陕西柱塞泵厂家_智能张拉设备_桥梁施工设备_千斤顶_液压分裂棒_液压分裂枪|陕西中拓矿山设备有限公司 | 郑州办公家具厂_河南办公家具厂_河南办公家具-河南华诺家具 | 河南省恒达锅炉制造有限公司| 襄阳亚舟重型工程机械有限公司| 深圳市碧源达科技有限公司 | 深圳心理咨询-专业心理咨询服务平台「专家免费在线」-深圳从心开始心理O2O | 天津印刷_天津印刷厂_天津印刷公司_天津包装盒厂家_天津包装盒印刷厂_七层共挤膜厂家_彩色印刷_画册印刷_礼品盒定做 _七层共挤膜_食品真空袋-欢迎访问嘉联包装官网! | 鸿茗商务-杭州鸿茗商务咨询有限公司 | 中标通国际认证(深圳)有限公司-知识产权管理体系认证-湖北知识产权贯标 | 塑料胶水|PVC胶水|PP胶水|橡胶胶水|强力胶水|透明胶水|胶粘剂|粘合剂|UV胶-聚力胶水厂家 | 伸缩接头,限位伸缩接头,传力接头,可拆卸接头,橡胶接头,衬四氟橡胶接头,橡胶软连接,橡胶补偿器,防水套管- 巩义市隆盛管道设备有限公司 | 无锡艾迅自动化科技ASCO电磁阀-dwyer/topworx代理-上泰仪表代理商 | 天津高压泵-高压清洗机-高压柱塞泵-厂家-价格-天津高压泵格瑞德 天津翻译公司盖章|022-58385822| 翰文博译(天津)商务咨询有限公司 | 铝合金线棒生产厂家-提供第三代精益管,防静电工作台定制与批发-宁波杰艾逖仓储设备有限公司 | 医药冷库设计建造-食品保鲜冷库安装-物流冷库工程造价-开冉制冷 医盟网-全国首家医疗信息化行业门户网站 | 山东飞斯特汽车科技有限公司 |