C語言編譯、鏈接


C語言編譯、鏈接

C語言編寫的系統項目,往往按照功能將系統的各個實現模塊切分到不到的C源文件中,甚至將相關功能的一組文件收集到同一個文件夾中。要想在C程序編譯成最終的一個可執行01文件,就要將這些C文件組合到一起,這個組合的過程叫做鏈接。

鏈接的基本元素是符號對接,即在a.c文件中用到了符號name_a。但只是聲明了一個name_a的符號,並不給出定義。根據上面對類型關鍵詞的論述,這些符號關聯的內存實體還沒有被指定。也就是說,如果真正運行a.c生成的01文件,將導致name_a沒有有效的內存實體。假如在b.c中定義了符號,也就是b.c申請了內存實體,那么把這塊實體的值告訴a.c的過程就叫做鏈接。

由上論述,所謂鏈接,就是將各個實體文件基於符號對接。



1. 頭文件   導入符號聲明,所以要保證只導入一次

聲明符號,通常將提供給外部定義的符號收集到一系列的文件中聲明。這樣當其它文件想使用這些符號時,只要借用宏特性#include就可以自動聲明這些符號。

2. 靜態鏈接   直接重定位代碼,基於符號表賦值——傳值

符號對接,通常用於工程內部的對接。各文件符號將所有文件生成的01累積成一個大的01文件,重名時報告沖突。

3. 動態鏈接   間接定位代碼,基於符號表賦址——跳轉

只是為符號的關聯值賦給一個跳轉表PLT的地址,之后通過動態庫控制程序轉接到符號對應的內存實體。生成的01執行文件,並不真正包括這些符號的定義實體,通常用於鏈接外部了程序庫。當出現同名符號時,先鏈接的庫覆蓋后面的符號。

4. 控制暴露給其它文件的符號

1.  static

2.  鏈接表

gcc -fPIC -shared -Wl,--version-script SYMBOL -o aaa.so;

  


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com