UNIX glibc 的使用者資訊

C 語言程式庫是所有 UNIX 系統中最重要的元件之一,負責讓應用程式與核心處理序之間互動順暢。

以下提供您一些建議與背景資訊,方便您判斷:

  • 安裝的 AntiVir 掃描程式是否對應至所屬的電腦環境,以及
  • 在出現不一致的情況時,可在何處找到可用的更新

背景

事實上,UNIX 系統的所有元件 (包括作業系統本身、系統程式與絕大部分應用程式) 都是直接以 C 語言來撰寫,或是依據 C 語言撰寫的元件為基礎發展出來的。

在所謂的 libc 當中,我們通常可以看到作業期間應用程式所依據的基本常式。 libc 包括檔案、記憶體儲存、網路與處理序管理的相關作業,以及存取作業系統所執行的所有服務。

為了符合邏輯,不會在每個程式中重複建立並提供這些常式, 而是將它們安裝在系統的中央位置,隨時供各項程式使用。 由於 UNIX 支援共用程式庫概念 (相較於其他平台上的 DLL 檔),因此常見的作法是將對應的應用程式分割為所謂的動態連結二進位檔。 此一底層基礎系統會在程式啟動時,先提供連結的 C 語言程式庫。

在 Linux 環境下,此 libc 最常發生的實施案例便是 glibc。 和所有常見且廣泛使用的開放原始碼專案一樣,此程式碼也不斷地開發與修訂。 程式錯誤不斷經過修正、功能不斷增加,並持續實施更多的強化功能。 在一般標準不斷更改和開發的這個持續修正程序中,已做了某些固定不變的調整。

因此,實際上我們不時會發現各種不一致情況。 這個問題「表面上」看似同質性頗高,不過這些變異卻可能造成不同的應用程式需求。 舉例來說,當語意有更改時,之前以特定方式用來解譯資料的介面可能會忽然受制於其他程序。 另一項可能的影響則是: 介面因修改所屬參數而變成另一種型態,並可能因為功能已經增強而一併修改所屬的作業方式。

基於上述理由,程式庫 (包括其現有開發狀態以及其行為) 會強式建立版本。 不過,並非所有版本都能與彼此「完全」相容, 而且通常會以向上與向下相容為目標。 不過,前提是版本必須非常相近才行。 換句話說: 實際上相容性無法進行任何重大變更,

那麼還要做什麼? 為了讓所有版本達到一致的狀態,在作業系統和應用程式原始檔都具備的情況下,直接轉譯整個系統會是最方便的方式。 如果應用程式是以二進位檔方式取得,在下載時必須選擇正確的版本。 請記住一點,經過基礎元件更新,已存在的元件之間可能存在相依性,並受制於更新。 舉例來說,如果您將 libc 此類重要的系統元件置換或是升級為另一個版本,不只是作業系統,連同所有應用程式軟體都需要一併更新。

判斷 AntiVir 需要支援的程式庫版本

即便聽起來有些不合理,但基於相容性和互通性理由,執行中的應用程式不能判斷已安裝的 libc 版本,或是指定該版本是否能夠在此環境中執行。 程式庫設計中甚至沒有計劃要判斷版本 (即使有個別實施項目提供這項功能,也不代表此程序不適用於其他所有系統與平台)。 同時,我們真的不知道原始來源為何: 如果應用程式因為所需的版本與可用的版本不一致而無法執行時,要如何啟動與執行自己的作業呢?

很抱歉,我們無法免除使用者以下所述工作,一切還是得按部就班進行。 在上述情況中,系統管理員需要時刻注意安裝的軟體版本是否一致,沒有其他人能夠代勞。 但是,至少我們提供您一個辨識與解決問題的方針。


解決問題

以下是關於 Linux 和 GNU-C 語言程式庫的問題。 以上觀點對其他平台同樣成立,不過目前只有在 Linux 與 GNU libc 共存的環境下,才需要從提供的版本當中選擇一種版本。

glibc 程式庫以某種格式存在硬碟上,方便您當成「正常程式」來使用。 這種方式不但有助於您進行開發,還可讓您從中擷取重要的資訊。

當您執行:
/lib/libc.so.6 | head -1
會看到版本號碼 (事實上,輸出結果會顯示非常多資訊,不過我們只需要注意第一行上面的版本號碼)。 如果在執行這項命令之後出現「權限拒絕」之類的錯誤,或是因為某些原因無法將檔案識別為「程式」,您可以試著使用下列命令啟動:
/lib/ld-linux.so.2 /lib/libc.so.6 | head -1
如果版本號碼開頭為 2.0 或 2.1,則必須使用標示為 glibc20 的軟體封存。 如果版本號碼開頭為 2.2 或 2.3,則必須使用標示為 glibc22 的軟體封存。 您還可以在 (內部) 版本 1 中找到 libc 程式庫,而且檔名為 libc.so.5。 儘管這項實施已經不是最新,也未包含太多功能,不過由於規模明顯小很多 (缺少國際化版本),以及需要考量經濟的狀況下或是無法取得更新時,該實施還是常被置入嵌入式系統當中。

除了 libc GNU 版本之外,其他 libc 程式庫實施會因為各種不同目的 (例如「精簡性」或是「方便可攜性」) 而存在。 不過由於此軟體應用程式是經過審慎考慮的結果 (不會「意外地」出現,或是透過標準發佈安裝),我們假設受影響的系統管理員已經非常熟悉本身的系統。 他們會將各方面因素納入考量,而且應該很清楚哪一個 glibc 實施會最適合。 換句話說,他們應該已經很清楚該用哪一個 Avira 軟體封存。

一旦發生目錄程式庫中未包含 libc 實施檔案這種不尋常的情況時,系統管理員應該知道去哪找到這個檔案。 在執行的系統中,載入程式會知道去哪找到共用物件。 若您有疑問,可以執行以下命令:
ldd /bin/ls (或是另一個動態連結的程式)
並搜尋與 libc 相關的程式碼 (或是在程式庫無法如上述啟動程式時,搜尋 ld-linux)。


總結

外部程式「只能」發展高階的應用程式邏輯,並同時採用系統元件做為 libc 以便執行低階功能。 如果這兩項元件無法搭配,則軟體將無法正常運作 (這時可能會出現「好像可以運作」、「有時候可以運作,但大部分情況下不行」、「一般情況下無法運作,也無法執行任何功能」,甚至於「將我的硬碟格式化、讓我氣到掉頭髮,連我的貓都遺棄我了」之類的情況)。

應用程式本身無法以令人滿意的方式執行相容性測試。 這時使用者的配合便不可或缺,唯有倚賴使用者才能維持系統一致性和運作正常。 由於我們的軟體針對不同環境推出了不同的 Linux 版本,因此有必要依據個別安裝的 C 程式庫來做決定。

您可以使用下列命令,判斷硬碟上安裝的 C 程式庫之完整檔案路徑,以及安裝的實施版本:

$ ldd /bin/ls /bin/bash /usr/bin/vi/bin/ls:

librt.so.1 => /lib/librt.so.1 (0x4001e000)
libc.so.6 => /lib/libc.so.6 (0x40030000)
libpthread.so.0 => /lib/libpthread.so.0 (0x40160000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

/bin/bash:

libdl.so.2 => /lib/libdl.so.2 (0x4001e000)
libc.so.6 => /lib/libc.so.6 (0x40022000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

/usr/bin/vi:

libncurses.so.5 => /lib/libncurses.so.5 (0x4001e000)
libgpm.so.1 => /usr/lib/libgpm.so.1 (0x40066000)
libdl.so.2 => /lib/libdl.so.2 (0x4006c000)
libperl.so.1 => /usr/lib/libperl.so.1 (0x4006f000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x4016f000)
libutil.so.1 => /lib/libutil.so.1 (0x4019c000)
libpthread.so.0 => /lib/libpthread.so.0 (0x4019f000)
libm.so.6 => /lib/libm.so.6 (0x401f0000)
libc.so.6 => /lib/libc.so.6 (0x40213000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

$ /lib/libc.so.6 | head -1
GNU C 程式庫穩定版本 2.3.1,作者 Roland McGrath et al。

請依據安裝的 C 程式庫安裝合適的 Avira 軟體封存。 我們的 Linux 專屬 AntiVir 程式經過特別設計,可以和 GNU-libc 版本 2.2 或 2.3 一起運作。 至於資源有限,或是因為其他原因而使用 libc5 的系統,我們也提供對應的版本。 未在系統上使用 GNU 實施的系統管理員應該選擇最佳對應軟體封存。

受影響的產品

  • Avira AntiVir MailGate [Linux]
  • Avira AntiVir MailGate [Solaris]
  • Avira MailGate Suite [Linux]
  • Avira WebGate Suite [Linux]
  • Avira WebGate Suite [Solaris]
  • Avira AntiVir Professional, 版本 10 [Linux]
  • Avira AntiVir Professional, 版本 10 [Solaris]
  • Avira AntiVir Server, 版本 10 [Linux]
  • Avira AntiVir Server, 版本 10 [Solaris]
  • 建立日期 : 2007年3月14日星期三
  • 上次更新 : 2011年3月21日星期一
  • 文章評價