亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C編譯器、鏈接器、加載器詳解

2019-11-10 18:04:44
字體:
來源:轉載
供稿:網友

一、概述

C語言的編譯鏈接過程要把我們編寫的一個c程序(源代碼)轉換成可以在硬件上運行的程序(可執行代碼),需要進行編譯和鏈接。編譯就是把文本形式源代碼翻譯為機器語言形式的目標文件的過程。鏈接是把目標文件、操作系統的啟動代碼和用到的庫文件進行組織形成最終生成可加載、可執行代碼的過程。

過程圖解如下: 

預處理器:將.c 文件轉化成 .i文件,使用的gcc命令是:gcc –E,對應于預處理命令cpp;編譯器:將.c/.h文件轉換成.s文件,使用的gcc命令是:gcc –S,對應于編譯命令 cc –S;匯編器:將.s 文件轉化成 .o文件,使用的gcc 命令是:gcc –c,對應于匯編命令是 as;鏈接器:將.o文件轉化成可執行程序,使用的gcc 命令是: gcc,對應于鏈接命令是 ld;加載器:將可執行程序加載到內存并進行執行,loader和ld-linux.so。

 

二、編譯過程

編譯過程又可以分成兩個階段:編譯和匯編。

2.1編譯

編譯是指編譯器讀取源程序(字符流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼。

源文件的編譯過程包含兩個主要階段:

第一個階段是預處理階段,在正式的編譯階段之前進行。預處理階段將根據已放置在文件中的預處理指令來修改源文件的內容。

主要是以下幾方面的處理:

宏定義指令,如 #define a b 對于這種偽指令,預編譯所要做的是將程序中的所有a用b替換,但作為字符串常量的 a則不被替換。還有 #undef,則將取消對某個宏的定義,使以后該串的出現不再被替換。條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif等。 這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉頭文件包含指令,如#include "FileName"或者#include 等。 該指令將頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。特殊符號,預編譯程序可以識別一些特殊的符號。 例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對于在源程序中出現的這些串將用合適的值進行替換。

頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用,這涉及到頭文件的定位即搜索路徑問題。頭文件搜索規則如下:

所有header file的搜尋會從-I開始然后找環境變量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH指定的路徑再找默認目錄(/usr/include、/usr/local/include、/usr/lib/gcc-lib/i386-linux/2.95.2/include......)

 

第二個階段編譯、優化階段,編譯程序所要作得工作就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之后,將其翻譯成等價的中間代碼表示或匯編代碼。 

 

2.2匯編

匯編實際上指匯編器(as)把匯編語言代碼翻譯成目標機器指令的過程。目標文件中所存放的也就是與源程序等效的目標的機器語言代碼。目標文件由段組成。通常一個目標文件中至少有兩個段:

代碼段:該段中所包含的主要是程序的指令。該段一般是可讀和可執行的,但一般卻不可寫。數據段:主要存放程序中要用到的各種全局變量或靜態的數據。一般數據段都是可讀,可寫,可執行的。

 

2.3目標文件(Executable and Linkable Format)

可重定位(Relocatable)文件:由編譯器和匯編器生成,可以與其他可重定位目標文件合并創建一個可執行或共享的目標文件;共享(Shared)目標文件:一類特殊的可重定位目標文件,可以在鏈接(靜態共享庫)時加入目標文件或加載時或運行時(動態共享庫)被動態的加載到內存并執行;可執行(Executable)文件:由鏈接器生成,可以直接通過加載器加載到內存中充當進程執行的文件。

 

2.4 靜態庫與動態庫

靜態庫(static library)就是將相關的目標模塊打包形成的單獨的文件。使用ar命令。

靜態庫的優點在于:

程序員不需要顯式的指定所有需要鏈接的目標模塊,因為指定是一個耗時且容易出錯的過程;鏈接時,連接程序只從靜態庫中拷貝被程序引用的目標模塊,這樣就減小了可執行文件在磁盤和內存中的大小。

動態庫(dynamic library)是一種特殊的目標模塊,它可以在運行時被加載到任意的內存地址,或者是與任意的程序進行鏈接。

動態庫的優點在于:

更新動態庫,無需重新鏈接;對于大系統,重新鏈接是一個非常耗時的過程;運行中可供多個程序使用,內存中只需要有一份,節省內存。

 

三、鏈接過程

鏈接器主要是將有關的目標文件彼此相連接生成可加載、可執行的目標文件。鏈接器的核心工作就是符號表解析和重定位。

3.1 鏈接的時機:

編譯時,就是源代碼被編譯成機器代碼時(靜態鏈接器負責);加載時,也就是程序被加載到內存時(加載器負責);運行時,由應用程序來實施(動態鏈接器負責)。

3.2 鏈接的作用(軟件復用):

使得分離編譯成為可能;動態綁定(binding):使定義、實現、使用分離

3.3 靜態庫搜索路徑(由靜態鏈接器負責)

gcc先從-L尋找;再找環境變量LIBRARY_PATH指定的搜索路徑;再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程序內的。

3.4 動態庫搜索路徑(由動態鏈接器負責)

編譯目標代碼時指定的動態庫搜索路徑-L;環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;默認的動態庫搜索路徑/lib /usr/lib/ /usr/local/lib

3.5 靜態鏈接(編譯時)

鏈接器將函數的代碼從其所在地(目標文件或靜態鏈接庫中)拷貝到最終的可執行程序中。這樣該程序在被執行時這些代碼將被裝入到該進程的虛擬地址空間中。靜態鏈接庫實際上是一個目標文件的集合,其中的每個文件含有庫中的一個或者一組相關函數的代碼。

為創建可執行文件,鏈接器必須要完成的主要任務:

符號解析:把目標文件中符號的定義和引用聯系起來;重定位:把符號定義和內存地址對應起來,然后修改所有對符號的引用。

關于符號表和符號解析以及重定位的分析后續學習。

3.6 動態鏈接(加載、運行時)

在此種方式下,函數的定義在動態鏈接庫或共享對象的目標文件中。在編譯的鏈接階段,動態鏈接庫只提供符號表和其他少量信息用于保證所有符號引用都有定義,保證編譯順利通過。動態鏈接器(ld-linux.so)鏈接程序在運行過程中根據記錄的共享對象的符號定義來動態加載共享庫,然后完成重定位。在此可執行文件被執行時,動態鏈接庫的全部內容將被映射到運行時相應進程的虛地址空間。動態鏈接程序將根據可執行程序中記錄的信息找到相應的函數代碼。  

四、加載過程

加載器把可執行文件從外存加載到內存并進行執行。 Linux中進程運行時的內存映像如下:

 

 加載過程如下:

加載器首先創建如上圖所示的內存映像,然后根據段頭部表,把目標文件拷貝到內存的數據和代碼段中。然后,加載器跳轉到程序入口點(即符號_start 的地址),執行啟動代碼(startup code),啟動代碼的調用順序如所示:

 

五、處理目標的常用工具

UNIX系統提供了一系列工具幫助理解和處理目標文件。GNUbinutils 包也提供了很多幫助。這些工具包括:

AR :創建靜態庫,插入、刪除、列出和提取成員;STRINGS :列出目標文件中所有可以打印的字符串;STRip :從目標文件中刪除符號表信息;NM :列出目標文件符號表中定義的符號;SIZE :列出目標文件中節的名字和大小;READELF :顯示一個目標文件的完整結構,包括ELF 頭中編碼的所有信息。OBJDUMP :顯示目標文件的所有信息,最有用的功能是反匯編.text節中的二進制指令。LDD :列出可執行文件在運行時需要的共享庫。
上一篇:異常捕獲

下一篇:LEETCODE--Add Strings

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品99久久久香蕉| 色诱女教师一区二区三区| 中文字幕在线国产精品| 一区二区欧美在线| 成人美女免费网站视频| 黄色成人av在线| 欧美成人中文字幕在线| 中文字幕国产精品| 欧美电影《睫毛膏》| 91精品国产综合久久久久久久久| 亚洲日韩中文字幕在线播放| 日韩美女激情视频| 国产a∨精品一区二区三区不卡| 欧美体内谢she精2性欧美| 麻豆国产va免费精品高清在线| 91在线视频九色| 亚洲欧美国产制服动漫| 91精品国产综合久久香蕉| 中文字幕欧美日韩va免费视频| 欧美日韩国产中文精品字幕自在自线| 亚洲国产精品成人av| www.欧美精品一二三区| 91免费综合在线| 亚洲午夜激情免费视频| 青青精品视频播放| 国产在线拍偷自揄拍精品| 日本精品在线视频| 欧美激情一二三| 中文字幕日韩欧美| 国产精品久久久久久久美男| 97精品国产aⅴ7777| 精品视频偷偷看在线观看| 日韩av在线看| 日本在线精品视频| 国产在线精品成人一区二区三区| 国产69久久精品成人看| 日本精品视频在线播放| 亚洲精品一二区| 97视频在线观看免费| 亚洲一区二区三区四区在线播放| 欧美性jizz18性欧美| 91日本视频在线| 91精品免费视频| 国产成人综合精品在线| 日韩乱码在线视频| 精品欧美国产一区二区三区| 不卡在线观看电视剧完整版| 日本高清视频一区| 成人国产精品久久久| 丝袜美腿精品国产二区| 亚洲精品一区二三区不卡| 一区二区三区视频免费在线观看| 久久久成人的性感天堂| 日韩免费不卡av| 国产91精品久久久久久久| 国产精品久久久久久网站| 日韩av第一页| 中文字幕一区电影| 精品女厕一区二区三区| 91在线观看免费高清| 日韩亚洲综合在线| 中文字幕一精品亚洲无线一区| 日韩美女主播视频| 久久久久在线观看| 久久久久久91| 欧洲中文字幕国产精品| 91精品国产综合久久香蕉922| 性金发美女69hd大尺寸| 国产成+人+综合+亚洲欧洲| 欧美电影在线观看完整版| 国产日韩欧美日韩大片| 最近2019好看的中文字幕免费| 91免费福利视频| 色777狠狠综合秋免鲁丝| 中文字幕精品av| 在线免费看av不卡| 亚洲一级免费视频| 日韩欧美在线观看| 国产福利成人在线| 国产精品视频导航| 欧美做受高潮电影o| 欧美精品久久久久久久久久| 亚洲成人在线视频播放| 欧美一级大片在线免费观看| 亚洲一区中文字幕在线观看| 国产精品欧美激情在线播放| 精品中文视频在线| 欧美又大又硬又粗bbbbb| 精品一区二区亚洲| 国产精品入口免费视频一| 国产精品高潮粉嫩av| 国产精品无码专区在线观看| 日本精品一区二区三区在线播放视频| 久久久999成人| 久热精品在线视频| 国产综合久久久久久| 日韩国产高清污视频在线观看| 91精品久久久久久久久久久久久| 久久久久久12| 国产日韩在线视频| 97视频免费在线看| 日韩免费av在线| 欧美性生交大片免费| 亚洲欧美日韩直播| 日韩成人网免费视频| 欧美亚洲国产另类| 亚洲最大福利视频网| 91久久嫩草影院一区二区| 91影院在线免费观看视频| 亚洲色图35p| 亚洲一区二区三区777| 中文字幕亚洲精品| xvideos成人免费中文版| 俺去了亚洲欧美日韩| 亚洲欧美日韩图片| 亚洲精品影视在线观看| 777777777亚洲妇女| 8090成年在线看片午夜| 亚洲色在线视频| 国产成+人+综合+亚洲欧美丁香花| 国产精品午夜一区二区欲梦| 日韩精品极品在线观看播放免费视频| 91国产精品电影| 久久综合电影一区| 狠狠操狠狠色综合网| 久久99亚洲热视| 美女啪啪无遮挡免费久久网站| 日韩欧美第一页| 日韩动漫免费观看电视剧高清| 日韩高清电影免费观看完整| 欧美精品激情在线观看| 91国在线精品国内播放| 亚洲精品xxx| 欧美日韩亚洲网| 亚洲国产精品va在看黑人| 久久久久亚洲精品国产| 欧美日韩国产在线播放| 亚洲欧美日本精品| 国产精品高清在线| 亚洲大胆美女视频| 亚洲一区免费网站| 欧美一级片在线播放| 亚洲精品电影在线观看| 91社影院在线观看| 在线精品高清中文字幕| 国产精品aaaa| 欧美日韩成人黄色| 欧美区二区三区| 国产精品一区二区电影| 亚洲自拍偷拍一区| 欧美在线视频播放| 国产精品久久久久久久久影视| 国产日韩专区在线| 欧美精品九九久久| 色天天综合狠狠色| 精品一区二区三区四区| 青青久久aⅴ北条麻妃| 欧美一区二区三区……| 国产精品美女午夜av| 国产免费成人av| 川上优av一区二区线观看| 精品国产乱码久久久久久虫虫漫画| 国产精品人成电影| 久久久久久九九九|