(1)庫文件:某些功能模塊的集合,項目之間代碼的共享,模塊化開發。預先編譯好的方法的集合。比如:我們提前寫好一些數據公式的實現,將其打包成庫文件以后只需使用庫文件即可,而不需要重新編寫。
(2)靜態庫和動態庫(共享庫)的區別
靜態庫: windows .lib linux .a
靜態庫在鏈接過程中使用,使用靜態庫編譯的的可執行程序包含靜態庫的內容,所以可執行文件的執行不依賴靜態庫。(靜態庫是功能的“.o”的集合)
動態庫: windows .dll linux .so
動態庫在執行過程中使用,在執行中需要動態庫的支持,將動態庫動態加載到內存中,所以可執行文件的執行依賴動態庫。(是沒有main函數的可執行文件)
靜態庫在鏈接過程中,將代碼拷貝到可執行文件當中,當它多次被使用時就會有多份沒用的拷貝存在內存中,當然在程序文件本身中也存在重復代碼,這浪費了許多內存和磁盤空間。而動態庫在運行時才被加載到內存中,不同的程序可以得到內存中相同的動態庫的副本,這就為我們節省了內存空間。
(3)靜態庫的生成
3.1)將源文件編譯生成中間文件(*.o)
3.2)ar crv libxxx.a *.o(所有的中間文件)
3.3)gcc -o main main.c -L -lxxx
-L 指定靜態庫路徑 -l 指定靜態庫名稱
(1)動態庫的生成
gcc -shared -fPIC -o libxxx.so *.c
gcc -o main main.c -L -lmath
庫函數:在函數庫文件中。執行時在用戶態中。庫函數可能還會轉調系統調用函數,比如:fopen,printf 。也可能不需要,比如:strlen,strcopy
系統調用(英語:system call):指運行在用戶空間的應用程序向操作系統內核請求某些服務的調用過程。 系統調用提供了用戶程序與操作系統之間的接口。一般來說,系統調用都在內核態執行。由於系統調用不考慮平台差異性,由內核直接提供,因而移植性較差(幾乎無移植性)。在內核中實現。
系統調用函數觸發0x80中斷,將相應系統調用號存入eax寄存器中,陷入內核,內核開始執行中斷處理程序,在系統調用表中查找對應的系統內核函數並調用,執行完成后將數據通過eax寄存器帶到用戶空間。