GCC編譯選項及其功能
-L
定義連接庫文件的目錄
-I
定義 C源碼的頭文件的目錄
-o
后面跟的參數為要生成的執行文件的名
-O
進行編譯優化,可以指定使用不同的優化級別,從 O2到O6,每個不同的級別使用的優化設置不同。
相關的選項還有定義生成的指令碼類型的參數,如 -m486生成486指令,缺省的gcc版本(2.7.2)不支持Pentium代碼。
-g
加入調試代碼,可以在完成后使用 strip命令刪除用于調試的信息
-c
僅僅進行編譯而不進行連接,生成目標文件
-fPic
生成相對地址的代碼,可用于最后生成動態連接庫
-static
強制生成靜態連接的程序
-aout
生成 a.out格式的執行文件、目標代碼等,缺省使用ELF格式
-elf
3.0之后為缺省設置,生成ELF格式的目標和執行代碼
-ansi
只支持 ANSI 標準的 C 語法。這一選項將禁止 GNU C 的某些特色,例如 asm 或 typeof 關鍵詞。
-DMACRO
以字符串“1”定義 MACRO 宏。
-DMACRO=DEFN
以字符串“DEFN”定義 MACRO 宏。
-E
只運行 C 預編譯器。
-IDIRECTORY
指定額外的頭文件搜索路徑DIRECTORY。
-LDIRECTORY
指定額外的函數庫搜索路徑DIRECTORY。
-lLIBRARY
連接時搜索指定的函數庫LIBRARY。
-shared
生成共享目標文件。通常用在建立共享庫時。
-UMACRO
取消對 MACRO 宏的定義。
-w
不生成任何警告信息。
-Wall
生成所有警告信息。
GDB的使用
cat >tst.c
#include<stdio.h>
int func(int n)
{
int sum=0,i;
for(i=0;i<100;i++)
{
sum+=i;
}
return sum;
}
main()
{
int i;
long result =0;
for(i=1;i<=100;i++)
{
result+=i;
}
printf("result[1-100]=%d\n",result);
printf("result[1-250]=%d\n",func(250));
}
編譯生成執行文件:(Linux下)
hchen/test> cc -g tst.c -o tst
使用GDB調試:
hchen/test> gdb tst <---------- 啟動GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-suse-linux"...
(gdb) l <-------------------- l命令相當于list,從第一行開始例出原碼。
#include<stdio.h>
int func(int n)
{
int sum=0,i;
for(i=0;i<100;i++)
{
sum+=i;
}
return sum;
}
main()
{
int i;
long result =0;
for(i=1;i<=100;i++)
{
result+=i;
}
printf("result[1-100]=%d\n",result);
printf("result[1-250]=%d\n",func(250));
}
Breakpoint 1, main () at tst.c:17 <---------- 在斷點處停住。
17 long result = 0;
(gdb) n <--------------------- 單條語句執行,next命令簡寫。
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) n
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) c <--------------------- 繼續運行程序,continue命令簡寫。
Continuing.
result[1-100] = 5050 <----------程序輸出。
Breakpoint 2, func (n=250) at tst.c:5
5 int sum=0,i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p i <--------------------- 打印變量i的值,print命令簡寫。
$1 = 134513808
(gdb) n
8 sum+=i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8 sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt <--------------------- 查看函數堆棧。
#0 func (n=250) at tst.c:5
#1 0x080484e4 in main () at tst.c:24
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish <--------------------- 退出函數。
Run till exit from #0 func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24 printf("result[1-250] = %d \n", func(250) );
Value returned is $6 = 31375
(gdb) c <--------------------- 繼續運行。
Continuing.
result[1-250] = 31375 <----------程序輸出。
Program exited with code 027. <--------程序退出,調試結束。
(gdb) q <--------------------- 退出gdb。
hchen/test>
#資料收集自永遠的Linux
GDB常用命令
命令 解釋
break NUM 在指定的行上設置斷點。
bt 顯示所有的調用棧幀。該命令可用來顯示函數的調用順序。
clear 刪除設置在特定源文件、特定行上的斷點。其用法為:clear FILENAME:NUM。
continue 繼續執行正在調試的程序。該命令用在程序由于處理信號或斷點而
導致停止運行時。
display EXPR 每次程序停止后顯示表達式的值。表達式由程序定義的變量組成。
file FILE 裝載指定的可執行文件進行調試。
help NAME 顯示指定命令的幫助信息。
info break 顯示當前斷點清單,包括到達斷點處的次數等。
info files 顯示被調試文件的詳細信息。
info func 顯示所有的函數名稱。
info local 顯示當函數中的局部變量信息。
info prog 顯示被調試程序的執行狀態。
info var 顯示所有的全局和靜態變量名稱。
kill 終止正被調試的程序。
list 顯示源代碼段。
make 在不退出 gdb 的情況下運行 make 工具。
next 在不單步執行進入其他函數的情況下,向前執行一行源代碼。
print EXPR 顯示表達式 EXPR 的值。
#joyfire
更詳細的說明請查看:http://joyfire.net/jln/system/8.html