第七章 連接數據結構
姓名:王瑋怡 學號:20135116函數
1、關於連接工具
一、含義spa
連接是將各類代碼和數據部分收集起來並組合成爲一個單一文件的過程,這個文件可被加載(或被拷貝)到存儲器並執行。連接是由連接器程序自動執行的。操作系統
二、執行時間命令行
2、編譯器驅動程序翻譯
驅動編譯器:表明用戶在須要時調用語言預處理器、編譯器、彙編器和連接器。debug
3、靜態連接3d
一、靜態連接器指針
Unix的靜態連接器(static linker)ld,以一組可重位目標文件和命令行參數做爲輸入,生成一個徹底連接的能夠加載和運行的可執行目標文件做爲輸出。輸入的可重定位目標文件由各類不一樣的代碼和數據節(section)組成。指令在一個節中,初始化的全局變量在另外一個節中,而未初始化的變量又在另一個節中。
二、連接器的兩個任務
4、目標文件
目標文件的三種形式
5、可重定位目標文件
.strtab:一個字符串表,其內容包括:.symtab和.debug節中的符號表,以及節頭部中的節名字。字符串表就是以null結尾的字符串序列。
6、符號和符號表
一、連接器的上下文中,有三種不一樣的符號:
二、符號表
7、符號解析
一、連接器如何解析多重定義的全局符號
(1)強符號:函數和已初始化的全局變量
(2)弱符號:未初始化的全局變量
(3)處理規則:
二、與靜態庫連接
全部的編譯系統都提供一種機制,將全部相關的目標模塊打包成爲一個單獨的文件,稱爲靜態庫,能夠用作連接器的輸入。其中,在Linux下是存檔文件,Windows下是lib。
在符號解析的階段,連接器從左到右按照它們在編譯器驅動程序命令行上出現的相同順序來掃描可重定位目標文件和存檔文件。(驅動程序自動將命令行中全部的.c文件翻譯成.o文件),在此次掃描中,連接器維持一個可重定位目標文件的集合E(這個集合中的文件會被合併起來造成可執行文件),一個未解析的符號(即引用了可是還沒有定義的符號)集合U,以及一個在前面輸入文件中已定義的符號集D,初始時,E、U和D都是空的。
7、重定位
一、重定位的兩個步驟
(1)重定位節和符號定義
(2)重定義節中的符號引用
二、重定位條目
(1)不管什麼時候彙編器遇到對最終位置位置的目標引用,它就會生成一個重定位條目,告訴連接器在將目標文件合併成可執行文件時如何修改這個引用。
(2)代碼的重定位條目放在.rel.text中。
(3)已初始化的數據的重定位條目放在.rel.data中。
(4)ELF定義了11種不一樣的重定位類型。兩種最基本的重定位類型:
三、重定位符號引用
(1)相對引用
(2)絕對引用
8、可執行目標文件
9、加載可執行目標文件
加載器將可執行目標文件中的執行代碼和數據從磁盤拷貝到存儲器中,而後經過跳轉到程序的第一條指令或入口點來運行該程序。這個將程序拷貝到存儲器並運行的過程叫作加載。
10、動態連接共享庫
一、靜態庫的缺點:
二、共享庫
11、從應用程序中加載和連接共享庫
-fPIC
選項指示GNU生成PIC代碼
十3、處理目標文件的工具
十4、總結
連接能夠在編譯時由靜態編譯器來完成,也能夠在加載時和運行時由動態連接器來完成。連接器處理成爲目標文件的二進制文件,它有三種不一樣的形式:可重定位的、可執行的和共享的。可重定位的目標文件由靜態連接器合併成爲一個可執行的目標文件,它能夠加載到存儲器中並執行。共享目標文件(共享庫)是在運行時由動態連接器連接和加載的,或者隱含地在調用程序被加載和開始執行時,或者根據須要在程序調用dlopen庫的函數時。