c,c++編譯過程
#預處理,編譯,匯編,鏈接

預處理gcc -E hello.cpp -o hello.i
處理#include ,宏定義
編譯gcc -S hello.i -o hello.s
實際調用ccl
生成匯編代碼
匯編gcc -c hello.s -o hello.o
生成機器指令
鏈接ld
靜態鏈接
地址和空間分配,符號決議,重定位
動態鏈接
#目標文件格式
目標文件分類
可重定位文件 .o文件
可執行文件
共享目標文件 .so文件
核心轉儲文件 coredump文件
目標文件分段
text段(程序指令)
.data段(已經初始化值的全局變量和局部靜態變量)
.bss段(未初始化的全局變量和局部靜態變量),沒有內容,不占空間,因為這些值默認都是0
文件格式查看
gcc -c hello.cpp生成hello.o
objdump -h hello.o?查看各個段的大小,起始位置
objdump -d -s hello.o?查看匯編代碼
readelf -h hello.o查看文件的基本信息
readelf -S hello.o查看文件的具體段的分布
readelf -s hello.o查看文件的變量函數
強符號和弱符號
初始化了的全局變量是強符號
弱符號的使,通過 __attribute__((weak))指定此引用為弱引用,如果外部沒有定義,可以鏈接出錯,但是引用為空,如果外部有定義,正常運行,引用不為空,自己代碼可以聲明一個外部庫的弱引用,如果為空,說明運行時沒有外部庫,可以執行自己另外的邏輯,達到一定的動態化
#靜態鏈接過程
將每個.o文件的相同的段放在一起并合并,并根據每個文件的符號定義和引用,建立一個全局符號表
對每個.o文件,
根據自己在合并之后的位置,更新自己的地址為原地址加現在在合并文件中的起始地址
讀取文件的重定位表中的每一項objdump -r a.o,在全局符號表中查找,并進行重定位
#動態鏈接過程
對于可共享的so文件,按照不同的段區分,數據段是每個個進程各自擁有一份,程序指令段需要編譯此so的時候就編譯為地址無關代碼,
so編譯的具體過程是:凡是調用了本so外部的變量函數,都通過一個GOT表指針間接訪問,而GOT表是此時未初始化的,而且GOT是放在數據段的
Program裝載這個so的時候,每個進程擁有自己的數據段和GOT,然后根據此時so的內存位置,填寫GOT,此時Program調用的so的指令部分是多個進程共享的.但是指令訪問數據函數的時候,會拿各自進程自己的GOT表,所以對數據的操作是各個進程獨立的。
C++ 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。