gdb 鏈結 庫檔案

2021-09-07 05:48:20 字數 3122 閱讀 5780

可執行檔案分兩種: 1.預設的為 release版本,也可以叫發行版本,使用者使用

2.debug版本,也叫開發版本,開發者使用

1.編譯過程中手動加入debug資訊,生成對應 .o檔案 例如:

gcc  -c  main.c  -g

2.鏈結不會加入鏈結檔案,對上述的 .o檔案進行鏈結,例如:

gcc  -o   run  main.o

3.可由 .c檔案 直接生成debug版本的可執行檔案,例如:

gcc   -o  run  main.c  -g

下面開始說說進入gdb除錯內的一些操作:

l                   //預設顯示main函式所在檔案的源**

list  filename:num       //顯示指定檔案的指定行附近的**

b      num        //在指定行下斷點

b      funcname        //給指定函式下斷點

b      filename:linenum   //給指定檔案的指定行下斷點

b      num   if  i==5   //在指定行下條件斷點,當 i==5時斷點生效,主要是後面的 if 加斷點的方式以上幾種都可以

info  b     //顯示斷點資訊

d     bpnum     //刪除斷點,根據斷點號bpnum刪除,斷點號可由 顯示斷點資訊 後得到

disable   bpnum    //將斷點設為無效斷點

enable   bpnum    //將斷點設為有效斷點

gdb執行過程中的控制:

r     //啟動除錯

n    //執行下一步

s    //進入函式中執行,相當於vs中的 逐語句執行

finish      //退出函式繼續執行

c         //繼續執行,直到執行到下乙個斷點處

q        //退出除錯

gdb除錯過程中如何檢視執行的值,類似於vs中的監控功能(結合c語言的知識來看):

p   valname       //看變數值

p   &valname    //看變數位址

p    *ptr               //ptr為乙個指標,看指標所指位址儲存的值(指標解引用)

p   arr       //顯示陣列的所有元素

p   ptrarr     //ptrarr指向陣列arr,顯示陣列的首位址

p   ptrarr@num     //通過指向陣列的指標顯示陣列所有元素?(請自行驗證,可能描述有誤)

p    struct_val     //顯示結構體內的所有成員值

p    ptr_struct->a      //顯示結構體中 a成員的值

p   funcname(a, b)      //顯示函式的返回值,由於函式執行完才會有返回值,所以也可以用來做函式的測試執行

bt   //顯示函式的呼叫過程

鏈結分為 軟鏈結和硬鏈結(linux中看鏈結檔案和原始檔是否是同乙個inode結點來判斷,看inode的命令為:   ls   -i   )

軟鏈結(可以理解為快捷方式,並不是真的檔案所在):   

生成軟鏈結命令:           ln  -s   原始檔  鏈結檔案

原始檔和鏈結檔案是不同的 inode結點

硬鏈結(可以理解為起別名):

生成硬鏈結命令:           ln   原始檔  鏈結檔案

原始檔和鏈結檔案是同乙個 inode結點

在這裡可以了解一下    三者分別使用何種檔案管理系統,了解這個是比較重要的

作業系統中    程序管理/記憶體管理/檔案管理      是三塊大的部分!

庫檔案分為 靜態庫 是和 動態庫(共享庫):

靜態庫(linux上為 .a     window上為 .lib  )

1.是中間檔案的集合,在鏈結階段直接將庫中的內容合併到最終的可執行檔案中,就是說,鏈結完成後,生成的可執行文                           件的執行不再依賴靜態庫

2.靜態庫生成的命令:           gcc   -c   *.c  (先將.c檔案生成對應的.o檔案)

ar  crv  lib***x.a   *.o          (其中***x是生成的庫名,前面的 lib和後面的 .a必須有 ) 

3.靜態庫的使用:

第一種:          gcc  -o  run   main.c   -l(庫路徑)  -l(庫名)

例如:     gcc   -o  run  main.c   -l/home/stu/lib   -llist

第二種:          gcc  -o  run   main.c   路徑/lib***x.a

例如:    gcc  -o  run   main.c   /home/stu/lib/liblist.a

動態庫(linux上為 .so     window上為 .dll  )

1.動態庫是 不可單獨執行的可執行檔案,鏈結階段只在可執行檔案中設定使用的的庫,執行時

由作業系統載入到記憶體上                       執行,因此生成的可執行檔案在執行時要依賴動態庫的存在

2.動態庫生成的命令:

gcc  -shared  -fpic  -o  lib***x.so    *.c

3.動態庫的使用: 同靜態庫一樣

4.當鏈結完成後執行時會有問題,問題出現的原因是: 動態庫需要由作業系統載入到記憶體上,但我們自己寫的庫作業系統                       找不到,因此依賴動態庫而的程式不能直接執行,會出錯!  解決這個問題有以下兩種方案:

<1>將動態庫拷貝到 /lib 或 /usr/lib 目錄下,但是這個操作需要 root 許可權,不建議這麼做

<2>設定環境變數        export   ld_library_path=動態庫所在的絕對路徑

但是這麼做只在本bash內有效,為

了一勞永逸,做以下這個操作:

vi   /home/.bashrc        //進入到.bashrc這個配置檔案中

然後在檔案的最後加上一句    export   ld_library_path=動態庫所在的絕對路徑

5.       lddd     run    //檢視可執行檔案run中所載入的動態庫

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...