一些關於Linux庫的知識

2021-09-25 15:04:43 字數 1872 閱讀 3216

庫就目標檔案的集合,我們把不需要公升級更新維護的**打包合併在一起方便使用,也可以對源**進行保密。

靜態庫在使用時是把被呼叫的**複製到呼叫模組中,然後在執行程式時,靜態庫就不需要了。

靜態庫的執行速度快,但占用空間大,當庫中的內容發生變化時,需要重新編譯出新的程式,因此不能輕易修改庫中的內容。

而共享庫只是在呼叫模組中嵌入呼叫**的在庫的相對位置的位址,當執行程式時,共享庫會的程式一起載入到記憶體中,當執行到呼叫共享庫中**的指令時跳轉到共享中執行,執行完畢後在跳轉回來。

占用空間小,方便更將新(共享庫發生變化後,程式不需要再次編譯),相對於靜態庫執行效率略低。

靜態庫的擴充套件名為.a,共享庫(動態庫)的擴充套件名為.so。

1. 1、建立靜態庫

編寫源**:vi .c/.h

編譯源**:gcc -c ***.c -> ***.o

打包生成靜態庫:ar -r lib***.a x1.o x2.o …

ar命令的一些引數:

-r 把目標檔案新增到靜態庫中,已經存在的更新

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

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

-t 顯示靜態庫中有哪些目標檔案

-x 把靜態庫拆分成目標檔案

**1. 2、呼叫靜態庫

3、執行

在編譯時已經把被函式的二進位制複製到可執行檔案中了,在執行時不再需要靜態庫檔案。

2. 1、建立共享庫

編寫源**:vi .c/.h

編譯出位置無關目標檔案:

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

鏈結生成共享庫:

gcc -shared x1.o x2.o x3.0 … -o lib***.so

2. 2、呼叫共享庫

直接呼叫:呼叫者要和庫在同一路徑下

gcc main.c lib***.so

2. 3、執行

在使用共享庫時,呼叫者只是記錄了被**在庫的位置,因此在執行時需要共享庫同時被載入。

作業系統會根據ld_library_path環境變數的設定來載入共享庫。

**#include

1. 載入共享庫

void *dlopen(const char *filename, int flag);

filename:共享庫的庫名,或路徑

flag:

rtld_lazy 使用時才載入

rtld_now 立即載入

返回值:共享庫的控制代碼(類似檔案指標)

2. 獲取識別符號位址並使

void *dlsym(void *handle, const char *symbol);

handle:共享庫的控制代碼

symbol:識別符號的名字

返回值:識別符號在共享庫中的位置(位址,可以解引用,或跳轉過去)。

**3、解除安裝共享庫**

int dlclose(void *handle);

handle:共享庫的控制代碼

返回值:成功返回0,失敗返回-1

4、獲取錯誤資訊**

char *dlerror(void);

返回值:會把在使用共享庫的過程**現的錯誤,以字串形式返回

nm:檢視目標檔案、可執行檔案、靜態庫、共享庫的中的符號列表

ldd:檢視可執行程式所依賴的共享庫有哪些

strip:**,去除掉目標檔案、可執行檔案、靜態庫和共享庫中的符號列表、除錯資訊。

objdump 顯示二進位制模組的反彙編資訊

一些Linux知識

etc security limits 設定檔案描述符 注意行首加 cat proc pid limits 實際的對程序的限制都在這裡 systemctl list unit files grep vncserver查開機是否自啟 lsb release a查系統版本 檢視該值的命令是 sysctl...

linux一些知識

linux的基本目錄結構詳解 bin 二進位制可執行命令 dev 裝置特殊檔案 etc 系統管理和配置檔案 etc rc.d 啟動的配置檔案和指令碼 home 使用者主目錄的基點,比如使用者user的主目錄就是 home user,可以用 user表示 lib 標準程式設計庫,又叫動態鏈結共享庫,作...

關於指標的一些知識

要說指標 位址 筆者認為必須從記憶體開始說起,也就是儲存單元的位址,他是一種編號,相當於一排的座位,位址 座位編號 但是要談起 指標 可不像平時書上說的那樣,指標 位址,這種說法已經被廣大的 語言愛好者給抨擊了,那指標相當於什麼?可能你要這麼問,形象的說指標就相當於乙個箱子,箱子裡面放了乙個椅子,椅...