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
--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 的標頭檔案和庫檔案目錄。
編譯安裝glibc
今天早上本來打算研究一下dup2函式的實現,以驗證檔案描述符相關的模型,但是通過gdb除錯起來後發現跳轉到了 sysdeps unix syscall template.s 檔案,很明顯這是系統呼叫的模板檔案,之前咱們研究過的fork函式還有一定的特殊性 是通過arch fork巨集跳轉到系統呼叫 ...
glibc的安裝編譯
有些軟體可能要求系統的 glibc 高於某個版本才可以正常執行。如果您的 glibc 低於要求的版本,為了執行這些軟體,您就不得不公升級您的 glibc 了 您可以尋找已經編譯好的 rpm 包或者使用源 的方式公升級 glibc。解壓 tar zxvf glibc 2.7.tar.gz cd gli...
Linux manjaro 安裝glibc指定版本
檢視現在系統的glibc版本 strings lib64 libc.so.6 grep glibc 直接安裝最新版 sudo pacman s glibc lib32 glibc force安裝glibc 2.19版本 wget edu cn gnu libc glibc 2.19 tar xz 解...