Linux系統程式設計鞏固 02

2021-07-23 18:36:45 字數 2762 閱讀 4741

二進位制形式目標模組的包

a.o  |

b.o  |----abc.a----庫

c.o  |

1)靜態庫:副檔名.a,庫中所封裝的二進位制**,在鏈結階段被複製到呼叫模組中

2)動態庫:副檔名.so,庫中所封裝的二進位制**,在鏈結階段並不複製到呼叫模組中,被嵌入到呼叫模組中的僅僅是被呼叫函式在共享庫的位址,根據這個位址

動態執行共享庫中的**(windows下.dll)

1)編輯源程式: .c/.h

2)編譯成目標檔案:gcc -c ***.c ----> ***.o

3)打包成靜態庫檔案ar -r lib***.a ***.o...

ar [選項] 靜態庫 目標檔案列表

-r:將目標檔案插入到靜態庫中,若已經存在則更新

-q:將目標檔案追加到靜態庫的尾部

-d:將目標檔案從靜態庫中刪除

-t:列表顯示靜態庫中目標檔案

-x:將靜態庫展開為目標檔案

nm命令:檢視目標檔案,庫檔案,可執行檔案中的符號列表

gcc main.c libmath.a(直接呼叫法)

gcc main.c -lmath -l.(引數法)

-l:要編譯的庫名

-l:庫的搜尋路徑

gcc main.c -lmath

export library_path=$library_path:.

為了使環境變數持久化

可以把export library_path=$library_path:.命令

新增到 ~/.bashrc

~/.bash_profile

1)編輯源程式 .c/.h

2)編譯成目標模組:

gcc -c -fpic ***.c---> ***.o

-fpic:小模式,**量比較小,速度快,只支援一部分平台,如linux

-fpic:大模式,**量比較大,速度慢,所有平台都支援

3)鏈結成共享庫

gcc -shared ***.o... -o lib***.so

gcc main.c libmath.so

gcc main.c -lmath -l.

export library_path = $library_path:.

gcc main.c -lmath

執行時要保證ld_library_path環境變數包含動態庫所在路徑

#include

a.載入共享庫

void *dlopen(

const char *filename,

int flag

);filename:如果你只給共享庫檔名,則通過ld_library_path環境變數搜尋共享庫。若給的是共享庫的路徑,不適用環境變數

flag:

rtld_lazy:延遲載入,什麼時候使用共享庫再實際載入

rtld_now:立即載入

成功返回動態庫的控制代碼,失敗返回null

b.獲取函式位址

void *dlsym(

void *handle,//共享庫控制代碼

const char *symbol//函式名

);成功返回函式位址,失敗返回null

c.解除安裝共享庫

int dlclose(

void *handle//共享庫的控制代碼

);成功返回0,失敗返回非0

d.獲取錯誤資訊

char *dlerror(void);

返回錯誤資訊的字串,沒有錯誤返回null

gcc 1dyso.c -ldl

nm:檢視目標檔案,庫檔案,可執行檔案的符號列表

ldd:檢視可執行程式或共享庫的動態依賴

strip:通過刪除符號表和除錯資訊,給目標檔案,可執行檔案,庫檔案**

objdump:對機器指令做反彙編

1.通過返回值表示錯誤

1)返回合法值表示成功,非法值表示失敗

2)返回有效指標表示成功,返回空指標(null/0xffffffff)表示失敗

3)返回0表示成功,返回-1表示失敗,如果有資料需要返回給呼叫者,可以通過使用指標形參向其輸出

4)如果乙個函式永遠不會失敗,也沒有資料需要提供給呼叫者,可以沒有返回值

2.通過錯誤**獲取函式失敗的原因

#include //extern int errno;

1)通過errno全域性變數獲取錯誤原因

2)將errno轉換成乙個字串

#include

char *strerror(int errnum);

#include

void perror(const char *s);

printf("%m");

所有的錯誤**都非0,errno=0表示無錯誤

errno是乙個全域性變數,其值隨時有可能發生變化,不安全

1)每個程序都會收到一張環境表

是乙個以null指標結尾的字元指標陣列

注意:當我們以指標陣列作為形參時,通常不傳遞陣列大小,而使陣列以空指標結束

2)全域性變數environ儲存了環境表的首位址

3)main函式的第三個引數就是環境表的首位址

所在庫環境變數:=

getenv:通過name獲得value

putenv:以= 形式設定環境變數,如果name不存在就新增

存在就修改

setenv:根據name設定value,若name已經存在,根據引數決定是否覆蓋原value

unsetenv:刪除環境變數

clearenv:清空環境變數,environ == null

Linux 系統程式設計

1 i o操作 2 檔案和目錄管理 3 記憶體管理 1 建立匿名記憶體對映 2 對映 dev zero檔案 類unix 作業系統中,dev zero是乙個特殊的檔案,當你讀它的時候,它會提供無限的空字元 null,ascii nul,0x00 其中的乙個典型用法是用它提供的字元流來覆蓋資訊,另乙個常...

Linux系統程式設計

1.linux程序 守護程序 脫離終端的後台程序 2.linux程序 殭屍程序 3.linux 下程序通訊 其中setsockopt server sockfd,sol socket,so reuseaddr,on,sizeof on 因為每乙個連線都由本地位址和遠端位址的組合唯一確定,所以只要遠端...

Linux系統程式設計 Linux系統呼叫

linux 系統呼叫 庫函式 目錄 系統呼叫概述 系統呼叫的實現 系統呼叫和庫函式的區別 系統呼叫,顧名思義,說的是作業系統提供給使用者程式呼叫的一組 特殊 介面。使用者程式可以通過這組 特殊 介面來獲得作業系統核心提供的服務,比如使用者可以通過檔案系統相關的呼叫請求系統開啟檔案 關閉檔案或讀寫檔案...