2011年1月24日 星期一

【C/C++】"GNU 程式設計" 讀書整理(part 2)

【ch2. UNIX 作業系統簡介】
本章簡單介紹一些 UNIX 上的基本操作。
CTRL+U (於命令列刪除整列)
ls -F (顯示目錄加上 / )
at 1pm (之後再執行)
at now + 2 hours
at {time} {filename}
cmp (類似 diff,但可用於二進位檔,它會回報兩個程式第1個不同的位置)
spell (讀取檔案,並找出拼字錯誤的列表)
strip (從執行檔或物件檔移除符號資訊,使檔案變小)


【ch4. 用 gcc 編譯及連結】
本章介紹 FSF (Free Software Fundation) 的編譯器 gcc,根據預設 gcc 將編譯原始碼,
使用組譯災字器產生組合語言,並啟動連結器 ld 來產生執行檔。
C語言的編譯
gcc基本用法:
gcc  test.c -o test
gcc -E (前端處理後及停止,cpp)
gcc -S (編譯,使用 gas 或 as來編譯,產生的組合語言副檔名為 .s)
gcc -c (編譯但不連結,用於各別編譯和除錯)
-D (定義常數,功能同程式裡的 #define)
gcc -DOC_FILE=\"info\" -DUSER_POLL (第1個 D 給予初值。第2個 D 則不給值,預設值為 1,通常用於 #ifdef 來判斷是否設定此符號)
-I (INCLUDE 標頭檔)
-l (link 函式庫)
-L (link 非標準路徑的函式庫)
gcc -L/usr/local/lib -lm
-Wall (產生警告)

前端處理器選項(cpp):
-M (找出引入的標頭檔,替 make 列出他們的依存關係,每一個原始碼會有一個依存關係,會產生於標準輸出上,編譯器就不會處理已完成動作,可簡化 makefle 的動作。-M 會隱含 -E )
-C (前端處理器一般會刪除註解,選了 -C 則不會刪除,必須搭配 -E 使用)

指定函式庫的選項:
-nostdlib (不使用系統的標準函式庫,跨平台時或embedded處理器上時編譯時特別有用,可使用自己的起始檔)
-static (只連結靜態函式庫,檔案較大)
-shared (預設使用,優先連結動態函式庫,檔案較小)

除錯及統計(profiling):
此選項要求編譯器產生額外的程式碼及擴充符號表,以供除錯(dbx, prof, gprof)及統計使用上的資料。prof統計器可以讀取這個檔案,病產生一份表格描述整個程式的執行狀態。
-p (與 prof 統計連結,會產生一個 mon.out 檔案,其中包含了執行的統計資訊,prof可以讀取此檔,並產生表格)
-pg (與 gprof 統計連結)
-g (為除錯的目的建立擴充的符號表,使用 GNU 的除錯器 gdb 進行除錯)

最佳化:
-O (同 -O1)
-O0 (預設值,不做最佳化)
-O1 (降低程式大小和執行時間)
-O2 (比 -O1 更細最佳化)

跨平台編譯器:
-b TARGET

傳送選項給組譯器和連結器:
-Wa,option-list (組譯器)
-Wl,option-list (連結器)
gcc -c -g -wa,-alh,-L source.c

C語言的組譯
GNU的組譯器是由許多組譯器組成,也可以使用 gcc 的 -Wa 選項來傳送選項給組譯器
as list-options list-of-source-files
-ah (只產生高階語言檔,只有當目的檔是以 gcc -g 選項編譯時才可能)
-al (只產生組合語言程式碼)
-as (只產生符號表)

as產生的目的檔可分為好幾段 (program segments):
* text: 機器碼指令,通常是唯讀的。一個唯讀的 text 可以讓多個程序執行讀取並執行,再共用執行時保留記憶體的同一個 text 片段,稱為共享 text。
* data: 靜態及初始化的資料。
* bss: 未初始話的資料。bss片段會告訴系統再執行時該保留多少空間給未初始化的資料使用。

連結器
ld 連結器連結目的檔及函式庫到單一個執行檔裡。
它解析參考的外部參數,外部程序及函式檔,來建立一個完整的單一執行檔。
gcc 預設便會使用到ld,若單獨使用 ld ,就必須明確的指令所用到的函式庫。
ld  list-options list-of-files-and-libraries
ld prog1.o -lm prog2.o
ld prog1.o -lar -lfo
-lname (link 函式庫 libname.a。會到 /lib 及 /usr/lib 尋找)
-Ldir (先到 dir 路徑下尋找,然後才到標準資料庫所在的 /lib 和 /usr/lib)
-s (移除符號表,使執行檔變小,但相對無法用除錯器除錯)

連結器的 script,(1)取得輸出格式的完全控制,(2)支援ld所不提供的目的檔格式

建立函式庫
ar 命令建立目的模組的函式庫
ar rus lib-name list-of-files (更新函式庫,會比較日期,取代舊檔案)
ar ds  lib-name list-of-files (刪除)
ar x lib-name list-of-files (從函式庫展開)

沒有留言:

張貼留言