2011-03-15 71 views
0

我在系統中的三個不同路徑中具有相同的共享庫。假設路徑是PATH1,PATH2 & PATH3。鏈接器或加載器如何處理共享庫的斷開軟鏈接?

共享庫的名字是libmylib.so

現在,PATH1如果我更換一個破碎的軟鏈接的libmylib.so,它爲圖書館進入和搜查的PATH2。

但是,PATH1如果我用其名稱爲libmylib.so一些其他的文本文件(或一些無關的文件)替換libmylib.so,然後應用程序執行失敗,指出「沒有一個ELF頭」

我有些困惑的行爲?爲什麼它會搜索其他路徑以避免軟連接斷開,並在文件不正確的情況下失敗。我期待它也搜索其他路徑的不正確的文件。

回答

3

它可能只是試圖打開它。懸掛符號鏈接或不存在,它將返回相同的錯誤。如果你想做一些不同的事情,你需要明確測試符號鏈接。很少有節目關心。

+3

打開一個懸空的符號鏈接返回ENOENT,同樣的錯誤作爲一個不存在的文件,因此對連接器的懸空符號鏈接看起來是一樣的不存在的文件,它將繼續看。一旦找到文件,它會停止搜索。 – bdk 2011-03-15 14:46:03

1

它只是。我不知道任何描述此行爲的原因的設計文檔,但我認爲是這樣的:軟鏈接的斷開與「找不到文件」幾乎相同,因此不夠嚴重,無法解決問題。損壞的庫表示更嚴重的問題(磁盤損壞,文件被覆蓋),因此它應該有錯誤消息。

一旦您決定顯示錯誤信息,您還必須終止程序。否則,錯誤消息會被有效地預先寫入程序寫入stderr的內容;這可能會被第二個程序通過管道進行解析,然後管道可能會失敗,或者進一步傳播錯誤,直到它結束於直到幾個月後纔讀取的日誌文件。

1

與具有libmylib.so

此文件中的名稱一些其他的文本文件(或一些無關文件)是不是一個破碎軟鏈接,這僅僅是一個普通文件(如共享對象文件應該是) 符號鏈接是一個特殊的文件系統元素(如目錄),VFS知道它的本質,因爲信息存儲在相應的inode中,但不是因爲文件內容。

摘要:

  • 破碎符號鏈接仍然與符號鏈接擴展
  • 真正的文件。所以,作爲共享對象處理(在這種情況下 - 斷)

檢查他們的屬性(d , - ,L):

 
drwxr-xr-x 2 Ibadinov staff 68 18 aoû 15:21 dir 
-rw-r--r-- 1 Ibadinov staff 0 18 aoû 15:21 file 
lrwxr-xr-x 1 Ibadinov staff 4 18 aoû 15:22 link -> file 

基本信息:

http://en.wikipedia.org/wiki/Inode

http://en.wikipedia.org/wiki/Symbolic_link#Storage_of_symbolic_links