1. 程式人生 > >Linux下淺析程式的執行過程

Linux下淺析程式的執行過程

本文的主要內容:
1>程式執行的4個階段。
2>淺析靜態庫和動態庫。
3>淺析Linux下的主要目錄的作用。

1、程式執行的4個階段:
在前邊的文章http://blog.csdn.net/peiyao456/article/details/51524533
已經對程式執行的4個階段進行了分析,這裡將在Linux下再次剖析。
第一階段:預處理(巨集替換 去註釋 標頭檔案展開 條件編譯)
gcc -E test.c -o test.i(將-o左邊的檔案通過預處理寫進右邊的檔案)
-E表示只做預處理工作
執行之後生成的 test.i 中的內容還是c語言,下邊展示。
這裡寫圖片描述


下邊我們來看一下執行之後的檔案和之前的c檔案的區別:
這裡寫圖片描述
第二階段:編譯 (c語言變成彙編)
gcc -S test.i -o test.s
這裡寫圖片描述
第三階段:彙編 ( 彙編程式變成二進位制檔案)
gcc -c test.s -o test.o
這裡寫圖片描述
第四階段:連結 (靜態連結 動態連結)
gcc test.o -o test
這裡寫圖片描述
從以上的圖片我們可以看出:Linux下的gcc編譯過程中,預設的是動態連線的方式。
總結:
程式的執行就是從C檔案->彙編檔案->二進位制檔案->可執行檔案的一個過程。
說到這裡,不得不說一下動態連線和靜態連線的區別。

2、靜態庫和動態庫
靜態庫:就是在連結的過程中將彙編生成的目標檔案與引用到的庫一起連結打包到可執行檔案 中。
特點:靜態庫對函式庫的連線是在編譯時期完成的;
程式在執行時,就與庫再沒有任何關係(只要平臺允許,程式在哪裡都可以執 行);
但是會使得程式的體積變大。
圖示解釋靜態庫:
這裡寫圖片描述
動態庫:
程式在執行時,才把庫函式的連結載入記憶體;
可以實現程序之間的資源共享;
程式的體積小(避免了空間的浪費)。
圖解動態庫:
這裡寫圖片描述

3、Linux下的主要目錄的作用
/proc下儲存系統中執行的程序的虛擬映象。
/lib 下儲存的是標準程式設計庫。像上邊執行的libc.so.6就在此目錄下。
/bin下儲存的是使用者常用的基本程式,如login檔案等。
這裡寫圖片描述


/root儲存系統管理員的主目錄。
這裡寫圖片描述
/etc儲存整個系統的配置檔案。如passwd檔案。
/sbin 儲存基本的系統和系統的維護程式,並且只能root來執行(和/bin的區別)。
/boot 存放和系統啟動有關的檔案。
/dev 存放外部裝置的映象檔案。
/usr存放與系統的使用者直接相關的程式和檔案。
這裡寫圖片描述