程式執行過程
不同作業系統可執行檔案的格式不同
linux:elf (execuatable and linkable file format)
windows:pe (portable executable format)
這也是為什麼乙個程式無法同時在linux和windows下執行
這裡舉例elf檔案格式
elf檔案格式把各種資訊,分成乙個乙個的section儲存起來。elf有乙個基本的檔案頭(file header),用來表示這個檔案的基本屬性,比如是否是可執行檔案,對應的cpu、作業系統等等。除了這些基本屬性之外,大部分程式還有這麼一些section:
首先是.text section,也叫作**段或者指令段(code section),用來儲存程式的**和指令;
接著是.data section,也叫作資料段(data section),用來儲存程式裡面設定好的初始化資料資訊;
然後就是.rel.text secion,叫作重定位表(relocation table)。重定位表裡,保留的是當前的檔案裡面,哪些跳轉位址其實是我們不知道的。比如上面的 link_example.o 裡面,我們在main函式裡面呼叫了 add 和 printf 這兩個函式,但是在鏈結發生之前,我們並不知道該跳轉到**,這些資訊就會儲存在重定位表裡;
最後是.symtab section,叫作符號表(symbol table)。符號表保留了我們所說的當前檔案裡面定義的函式名稱和對應位址的位址簿。
鏈結器會掃瞄所有輸入的目標檔案,然後把所有符號表裡的資訊收集起來,構成乙個全域性的符號表。然後再根據重定位表,把所有不確定要跳轉位址的**,根據符號表裡面儲存的位址,進行一次修正。最後,把所有的目標檔案的對應段進行一次合併,變成了最終的可執行**。這也是為什麼,可執行檔案裡面的函式呼叫的位址都是正確的。
程式執行過程
要理解乙個程式的執行過程,首先要理解什麼是編譯器。我們用c語言寫的程式,計算機只能識別機器語言 二進位制指令 計算機並不能理解。因此,必須 將c語言轉換為機器語言。編譯器就是用來實現這一功能的。編譯器將源 檔案按照一定的對應規則映射程計算機能夠識別的二進位制指令 關於原始檔 目標檔案和可執行檔案 原...
程式執行過程
程式的執行過程大致分為以下四的步驟 1 預處理 2 編譯 3 彙編 4 鏈結 1.關於預處理 預處理階段的工作基本上是對源程式做 替代 主要有 巨集替換 條件編譯 標頭檔案展開 去除注釋 經過這番替換之後,就會生成乙個沒有巨集定義,沒有條件編譯 沒有特殊符號的輸出檔案。2.關於編譯 編譯階段的工作就...
C 程式執行過程
要理解乙個程式的執行過程,首先要理解什麼是編譯器。我們用c語言寫的程式,計算機只能識別機器語言 二進位制指令 計算機並不能理解。因此,必須將c語言轉換為機器語言。編譯器就是用來實現這一功能的。編譯器將源 檔案按照一定的對應規則映射程計算機能夠識別的二進位制指令。關於原始檔 目標檔案和可執行檔案 原始...