天天看點

Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

文章目錄:

  • 1.動态庫
    • 1.1 分類
    • 1.2 生成動态庫
    • 1.3 使用
    • 1.4 動态庫配合環境變量的使用
  • 2. 靜态庫
    • 2.1 分類
    • 2.2 靜态庫的的生成
    • 2.3 使用
  • 3. 靜态連結和動态連結
  • 4. 檔案系統(針對磁盤而言)
    • 4.1 ext2檔案系統:
    • 4.2 存儲資料的邏輯
    • 4.3 擷取檔案的邏輯
  • 5.軟硬連結
    • 5.1 軟連接配接
    • 5.2 硬連結

1.動态庫

1.1 分類

  • windows下:字尾為.dll的檔案為動态庫
    Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結
  • linux下:字尾為.so,字首為lib的檔案為動态庫
    Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

1.2 生成動态庫

指令:gcc/g++

必選項的指令行參數:

  • -shared==>生成動态庫
  • -fPIC:生成與位置無關的代碼

指令範式:

gcc/g++ [source code] -shared -fPIC -o lib[動态庫名稱].so

1.3 使用

本質上是想要使用動态庫産生一個可執行程式;

gcc/g++ [source code] -o [可執行程式] -L [動态庫所在路徑] -l[動态庫的名稱]

測試如下:

我們首先寫一個頭檔案,裡面聲明一個print()函數

Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

然後test.c中實作print()函數

Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

接着我們将這個test.c編譯成一個動态庫

Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

接着我們将test.c移出目前檔案夾,此時我們若想使用剛才寫的print()函數就得依賴libmytest.so,若我們直接運作main.c會發現找不到‘print’

Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

而此時我們就可以運作test_main

Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結
  • ldd+[可執行程式名稱]指令:檢視可執行程式依賴哪些動态庫
Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

當我們将生成的動态庫libmytest.so移出目前檔案夾,我們會看到如下結果,test_main不能運作

Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

1.4 動态庫配合環境變量的使用

如上圖所示,當我們将生成的動态庫libmytest.so移出目前檔案夾,會出現’not found’,且此時test_main也不能運作,那麼如何讓可執行程式能夠找到依賴的動态庫在哪呢?

解決方案:配合環境變量LD_LIBRARY_PATH進行使用

  • LD_LIBRARY_PATH:動态庫的搜尋的環境變量
  • PATH:可執行程式搜尋的環境變量
Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

2. 靜态庫

2.1 分類

  • windows下:字尾為.lib的檔案為動态庫
  • linux下:字首為lib,字尾為.a的檔案為靜态庫

2.2 靜态庫的的生成

ar -rc lib[靜态庫名稱].a [依賴彙編完成之後的".o"檔案]

步驟:

  • 1.先将要編譯靜态庫的代碼編譯到彙編為止,意味着

    生産力.o檔案

  • 2.ar -rc 生成靜态庫

2.3 使用

使用靜态庫編譯出一個可執行程式

gcc/g++ [source code] -o [可執行程式] -L [靜态庫所在路徑] -l[靜态庫的名稱]
Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

注意:如果可執行程式依賴靜态庫進行編譯成功的,會将靜态庫的内容直接打包到可執行程式當中

如下圖所示使用ldd指令是看不到靜态庫的:

Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

3. 靜态連結和動态連結

  • 1.一個程式依賴動态庫或者依賴靜态庫生成可執行程式的時候,動态庫或者靜态庫是不會幹擾連結方式的(靜态連結和動态連結)
  • 2.在編譯可執行程式,

    使用gcc/g++編譯的時候,預設不增加指令行參數"-static",則為動态連結。

    反之,則為靜态連結

4. 檔案系統(針對磁盤而言)

4.1 ext2檔案系統:

Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

上圖為磁盤檔案系統圖(核心記憶體映像肯定有所不同),磁盤是典型的塊裝置,硬碟分區被劃分為一個個的block。一個block的大小是由格式化的時候确定的,并且不可以更改

  • 超級塊(Super Block):存放檔案系統本身的結構資訊。記錄的資訊主要有:bolck 和 inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次挂載的時間,最近一次寫入資料的時間,最近一次檢驗磁盤的時間等其他檔案系統的相關資訊。Super Block的資訊被破壞,可以說整個檔案系統結構就被破壞了
  • GDT,Group Descriptor Table:塊組描述符,描述塊組屬性資訊
  • 塊位圖(Block Bitmap):描述每一個塊的使用情況,使用比特位為1,未使用比特位為0
  • inode位圖(inode Bitmap):描述inode節點的使用情況,inode Bitmap描述inode table當中哪一個inode節點被使用,哪一個inode節點沒有被使用
  • inode節點:就是用來描述檔案存儲的資訊,以及檔案的元資訊

4.2 存儲資料的邏輯

(1) 從block bitmap當中查找空閑的block塊,将檔案分成不同的塊存儲在不同的block當中

(2) 從inode bitmap當中查找空閑的inode節點,将檔案資訊儲存在inode當中,檔案資訊包含:檔案在那些block塊當中存儲的檔案名稱,檔案大小,檔案權限,檔案通路時間,檔案修改時間,檔案修改屬性時間,檔案的擁有者,檔案所屬組

(3)将檔案的名稱和inode節點号,作為目錄項儲存下來

4.3 擷取檔案的邏輯

(1)通過目錄項當中的檔案名稱找到對應的inode節點号

(2)通過inode節點号,找到對應的inode系欸但,再通過inode節點找到檔案的元資訊

(3)通過檔案元資訊,找到檔案存儲的block塊,将檔案内容組合起來

(4)展示給使用者,檔案的元資訊以及檔案内容

Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結
Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

5.軟硬連結

5.1 軟連接配接

  • 軟連接配接就是給檔案建立了一個快捷方式

如何建立一個軟連接配接

ln -s [原檔案] [要建立的軟連接配接檔案]
Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結
  • 修改源檔案會影響軟連結檔案,修改軟連結檔案會影響源檔案
Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結
  • 删除軟連接配接檔案,源檔案不會受到影響,但是删除源檔案的時候一定要把軟連接配接檔案也删除掉,不然會有如下圖所示情況
Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結

5.2 硬連結

  • 硬連結相當于檔案的一個備份(拷貝)

如何建立一個硬連結檔案

  • ln [源檔案] [硬連結檔案]
    Linux——基礎IO(三):動态庫&靜态庫,動态連結&靜态連結,檔案系統,軟硬連結1.動态庫2. 靜态庫3. 靜态連結和動态連結4. 檔案系統(針對磁盤而言)5.軟硬連結
  • 删除源檔案對硬連結檔案沒有影響

繼續閱讀