Glibc 安裝指南(適用於2.3/2.4/2.5/2.6/2.7)Glibc 安裝指南(適用於2.3/2.4/2.5/2.6/2.7)編譯前的預備知識與要點提示
Glibc-2.3.6 建議使用 GCC-4.0 編譯,Glibc-2.4/2.5 建議使用 GCC-4.1 編譯,Glibc-2.6/2.7 建議使用 GCC-4.2 編譯。所有這些版本最低要求使用 GCC-3.4 編譯。
編譯 Glibc 時使用的核心標頭檔版本可以比實際運行 Glibc 的核心版本高。如果實際啟動並執行核心版本比標頭檔版本高,那麼新核心的新特性將無法使用。更多細節可以查看[八卦故事]核心標頭檔傳奇的跟帖部分。
不要在運行中的系統上安裝 Glibc,否則將會導致系統崩潰,至少應當將新 Glibc 安裝到其他的單獨目錄,以保證不覆蓋當前正在使用的 Glibc 。
Glibc 不能在源碼目錄中編譯,它必須在一個額外分開的目錄中編譯。這樣在編譯發生錯誤的時候,就可以刪除整個編譯目錄重新開始。
在運行 configure 指令碼時可以設定 CC CFLAGS LDFLAGS 環境變數來最佳化編譯。文法:configure [OPTION]... [VAR=VALUE]...
需要注意的是有些測試專案假定是以非 root 身份執行的,因此我們強烈建議你使用非 root 身份編譯和測試 Glibc 。
配置選項
下列選項皆為非預設值[特別說明的除外]
-
--help
--version
--silent
--cache-file=FILE
--config-cache
--no-create
--srcdir=DIR
--exec-prefix=EPREFIX
--bindir=DIR
--sbindir=DIR
--libexecdir=DIR
--sysconfdir=DIR
--sharedstatedir=DIR
--localstatedir=DIR
--libdir=DIR
--includedir=DIR
--oldincludedir=DIR
--datarootdir=DIR
--datadir=DIR
--infodir=DIR
--localedir=DIR
--mandir=DIR
--docdir=DIR
--htmldir=DIR
--dvidir=DIR
--pdfdir=DIR
--psdir=DIR
--build=BUILD
--host=HOST
-
這些選項的含義基本上通用於所有軟體包,這裡就不特別講解了。
-
--prefix=PREFIX
-
安裝目錄,預設為 /usr/local
Linux檔案系統標準要求基本庫必須位於 /lib 目錄並且必須與根目錄在同一個分區上,但是 /usr 可以在其他分區甚至是其他磁碟上。因此,如果指定 --prefix=/usr ,那麼基本庫部分將自動安裝到 /lib 目錄下,而非基本庫部分則會自動安裝到 /usr/lib 目錄中。但是如果保持預設值或指定其他目錄,那麼所有組件都間被安裝到PREFIX目錄下。
-
--enable-add-ons[=DIR1,DIR2,...]
-
編譯DIR1,DIR2,...中的附加軟體包。其中的"DIR"是附加軟體包的目錄名。未指定列表或指定為"yes"則編譯所有源碼樹根目錄下找到的附加軟體包。Glibc-2.4/2.5/2.6/2.7預設值為"yes",而 Glibc-2.3.6 預設為--disable-add-ons 。
-
--disable-shared
-
不編譯共用庫(即使平台支援)。在支援 ELF 並且使用 GNU 連接器的系統上預設為 --enable-shared 。[提示] --disable-static 選項實際上是無效的,靜態庫總是被無條件的編譯和安裝。
-
--enable-bind-now
-
禁用"lazy binding",也就是動態連接器在載入 DSO 時就解析所有符號(不管應用程式是否用得到),預設行為是"lazy binding",也就是僅在應用程式首次使用到的時候才對符號進行解析。因為在大多數情況下,應用程式並不需要使用動態庫中的所有符號,所以預設的"lazy binding"可以提高應用程式的載入效能並節約記憶體用量。然而,在兩種情況下,"lazy binding"是不利的:①因為第一次調用DSO中的函數時,動態連接器要先攔截該調用來解析符號,所以初次引用DSO中的函數所花的時間比再次調用要花的時間長,但是某些應用程式不能容忍這種不可預知性。②如果一個錯誤發生並且動態連接器不能解析該符號,動態連接器將終止整個程式。在"lazy
binding"方式下,這種情況可能發生在程式運行過程中的某個時候。某些應用程式也是不能容忍這種不可預知性的。通過關掉"lazy binding"方式,在應用程式接受控制權之前,讓動態連接器在處理進程初始化期間就發現這些錯誤,而不要到運行時才出亂子。
-
--enable-bounded
-
啟用運行時邊界檢查(比如數組越界),這樣會降低運行效率,但能防止某些溢出漏洞。
-
--disable-force-install
-
不強制安裝當前新編譯的版本(即使已存在的檔案版本更新)。
-
--disable-hidden-plt
-
預設情況下隱藏僅供內部調用的函數,以避免這些函數被加入到過程連結資料表(PLT,Procedure Linkage Table)中,這樣可以減小 PLT 的體積並將僅供內部使用的函數隱藏起來。而使用該選項將把這些函數暴露給外部使用者。
-
--enable-kernel=VERSION
-
VERSION 的格式是 X.Y.Z,表示編譯出來的 Glibc 支援的最低核心版本。VERSION 的值越高(不能超過核心標頭檔的版本),加入的相容性代碼就越少,庫的運行速度就越快。
-
--enable-oldest-abi=ABI
-
啟用老版本的應用程式二進位介面支援。ABI 是老 Glibc 的版本號碼。預設值大部分情況下為 --disable-oldest-abi ,建議明確指定為 --disable-oldest-abi
-
--enable-check-abi
-
在"make check"時執行"make check-abi"。[提示]在我的機器上始終導致check-abi-libm測試失敗。
-
--disable-versioning
-
不在共用庫對象中包含符號的版本資訊。這樣可以減小庫的體積,但是將不相容依賴於老版本 C 庫的二進位程式。[提示]在我的機器上使用此選項總是導致編譯失敗。
-
--enable-omitfp
-
編譯時間忽略幀指標(使用 -fomit-frame-pointer 編譯),並採取一些其他最佳化措施。忽略幀指標可以提高運行效率,但是調試將變得不可用,並且可能產生含有 bug 的代碼。使用這個選項還將導致額外編譯帶有調試資訊的非最佳化版本的靜態庫(庫名稱以"_g"結尾)。
-
--disable-profile
-
禁用 profiling 資訊相關的庫檔案編譯。Glibc-2.3.6 預設為 enable,Glibc-2.4/2.5/2.6/2.7 預設為disable 。
-
--disable-sanity-checks
-
真正的禁用線程(僅在特殊環境下使用該選項)。
-
--enable-stackguard-randomization
-
在程式啟動時使用一個隨機數初始化 __stack_chk_guard ,主要用來抵抗惡意攻擊。該選項僅存在於 2.4 及以上版本中。
-
--enable-static-nss
-
編譯靜態版本的NSS(Name Service Switch)庫。不推薦這樣做,因為串連到靜態NSS庫的程式不能動態配置以使用不同的名字資料庫。
-
--with-headers=DIR
-
指定核心標頭檔的所在目錄。
-
--with-binutils=DIR
-
強制指定編譯時間使用的 Binutils(as,ld) 的位置。
-
--without-cvs
-
不訪問CVS伺服器。推薦使用該選項,特別對於從CVS下載的的版本。
-
--with-elf
-
指定使用 ELF 對象格式,建議在支援 ELF 的 Linux 平台上使用此選項明確指定。
-
--with-gd=DIR
--with-gd-include=DIR
--with-gd-lib=DIR
-
強制指定 libgd 的安裝目錄(DIR/include和DIR/lib)。後兩個選項分別指定包含檔案和庫目錄。
-
--with-gmp=DIR
-
強制指定 gmp 的安裝目錄。
-
--without-selinux
-
禁用 SELinux 支援。
-
--without-fp
-
僅在硬體沒有浮點運算單元並且作業系統沒有類比的情況下使用。x86 與 x86_64 的 CPU 都有專門的浮點運算單元。而且 Linux 有 FPU 類比。簡單的說,不要 without 這個選項!因為它會導致許多問題!
-
--without-tls
-
禁止編譯支援執行緒區域儲存(TLS)的庫。使用這個選項將導致相容性問題。
以下選項意義不大,一般不用考慮它們
-
--without-__thread
-
即使平台支援也不使用TSL特性。建議不要使用該選項。
-
--enable-all-warnings
-
在編譯時間顯示所有編譯器警告,也就是使用 -Wall 選項編譯。
-
--with-cpu=CPU
-
在 gcc 命令列中加入"-mcpu=CPU"。鑒於"-mcpu"已經被反對使用,所以建議不要設定該選項,或者設為 --without-cpu 。
-
--with-xcoff
-
使用XCOFF對象格式(主要用於windows)。
-
--x-includes=DIR
--x-libraries=DIR
-
分別指定 X 的標頭檔和庫檔案目錄。