?? glibc2-howto.txt
字號(hào):
修改目錄下的 specs。在這檔案中, 將 /lib/ld-linux.so.1 換成 /lib/ld-linux.so.2, 你也必需要移去檔案中所有的 %{...:-lgmon} 表示式, 因?yàn)?glibc 不使用 gmon 函式庫(kù)來(lái)做 profile。 你可以在 [20]Specs 檔□例找 到一個(gè)□例。 4.4 更新標(biāo)頭檔連結(jié) 你需要在你的 include 目錄下建立連結(jié)到其它的 include 目錄: cd /usr/i486-linuxglibc2/include ln -s /usr/src/linux/include/linux ln -s /usr/src/linux/include/asm ln -s /usr/X11R6/include/X11 也許你有其它的函式庫(kù),例如說(shuō) ncurse, 而這些函式庫(kù)會(huì)需要它們自己的標(biāo)頭 檔, 你應(yīng)該從 /usr/include 復(fù)制或連結(jié)這些檔案。 (有些函式庫(kù)需要重新用 glibc2 來(lái) compile,在這種情形下, 只要編譯并且安裝到 /usr/i486-linuxglibc2) 4.5 測(cè)試你的安裝 要測(cè)試安裝是否成功,建立一檔案 glibc.c 如下: #include <stdio.h> main() { printf("hello world!\n"); } 用 "-b <安裝目錄> -nostdinc -I<安裝目錄>/include -I/usr/lib/gcc-lib/<新 系統(tǒng)目錄>/<gcc 版本>/include" 的選項(xiàng)編譯: % gcc -b i486-linuxglibc2 -nostdinc -I/usr/i486-linuxglibc2/include -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include glibc.c -o glibc 使用 ldd 確定程式是用 glibc2 連結(jié),而非舊有的 libc: % ldd glibc libc.so.6 => /usr/i486-linuxglibc2/lib/libc-2.0.5.so (0x4000d000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 如果通過(guò)編譯,連結(jié)也確定, 并且執(zhí)行時(shí)也產(chǎn)生 "hello world!" 的輸出,那麼 安裝就成功了。 5. 安裝成主要函式庫(kù) 這一節(jié)的內(nèi)容是關(guān)於將 glibc2 安裝成你的主要 C 函式庫(kù)。 任何你編譯的新程 式都將會(huì)連結(jié)到這一個(gè)函式庫(kù), 除非你用了特殊的編譯選項(xiàng)來(lái)連結(jié)到其它的版本 。 假如你是用 RedHat 或 Debian 并且已下載相關(guān)的 rpm 或 deb 檔, 請(qǐng)參閱 RedHat 或 Debian 的安裝說(shuō)明,你可以直接跳過(guò)這一節(jié)。 5.1 由原始碼編譯函式庫(kù) 這一節(jié)解釋如何由原始碼編譯 glibc 2 與附加套件。 如果你想要改變最佳化與 組態(tài)選項(xiàng)或使用額外的套件,那你就必須編譯函式庫(kù)。 需求 * 約 150 MB 的磁碟空間 * GNU make 3.75 * gcc >= 2.7.2 (最好是 2.7.2.1) * binutils 2.8.1 (假如是 alpha 你需要 snapshot) * bash 2.0 * autoconf 2.12 (假如你更動(dòng)了 configure.in) * texinfo 3.11 在一安裝有 64MB 記憶體的 i586@133 機(jī)器上, 編譯完整的函式庫(kù)與附加套件大 約需要三個(gè)小時(shí)。 而在 i686@200 的機(jī)器上則約需要一個(gè)半小時(shí)。 解開原始碼 你需要從 archive 中解出原始碼才能編譯它, 最好的方式是: tar xzf glibc-2.0.6.tar.gz cd glibc-2.0.6 tar xzf ../glibc-linuxthreads-2.0.6.tar.gz tar xzf ../glibc-crypt-2.0.6.tar.gz tar xzf ../glibc-localedata-2.0.6.tar.gz 這將會(huì)把 linuxthreads、crypt 與 localedata 等目錄放到 glibc-2.0.6 目錄 下, 如此 configure 才能找到這些附加套件。 設(shè)定組態(tài) 在 glibc-2.0.6 的目錄底下,建立一個(gè)新的目錄 compile, 并且 cd 到 compile 底下,所也的工作都會(huì)在這個(gè)目錄中完成, 這會(huì)簡(jiǎn)化後續(xù)的清除工作。 (發(fā)展者似乎并未讓 'make clean' 作得很好) mkdir compile cd compile 執(zhí)行 ../configure。 要使用附加套件你必需用 --enable-add-ons 來(lái)指定, 例 如 --enable-add-ons=linuxthreads,crypt,localedata。 也許你也會(huì)想要指定 安裝的目錄,要符合 linux 標(biāo)準(zhǔn)架構(gòu), 指定為 --prefix=/usr。 (當(dāng)在 linux 系統(tǒng)上 prefix 被設(shè)為 /usr, configure 知道要調(diào)整其它的路徑, 好將 libc.so 以及其它重要的函式庫(kù)放到 /lib) 完整的 configure 命令如下: ../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr 編譯 要編譯與驗(yàn)證, 執(zhí)行: make make check5.2 準(zhǔn)備安裝 無(wú)論是由原始碼編譯或是預(yù)先編譯好的版本,你現(xiàn)在必需移動(dòng)某些檔案來(lái)迎接新 的函式庫(kù)。 任何新編譯的程式會(huì)被連結(jié)到 glibc,但是舊有靜態(tài)連結(jié)的程式仍然 倚靠著 libc 5, 所以你不能只是覆蓋掉舊有的版本。 1. 建立一個(gè)新的目錄來(lái)放置舊檔案: mkdir -p /usr/i486-linuxlibc5/lib 2. 舊的標(biāo)頭檔必需從 /usr/include 移開: mv /usr/include /usr/i486-linuxlibc5/include 3. 建立一個(gè)新的 include 目錄,并且設(shè)定到其它 include 目錄的連結(jié): mkdir /usr/include ln -s /usr/src/linux/include/linux /usr/include/linux ln -s /usr/src/linux/include/asm /usr/include/asm ln -s /usr/X11R6/include/X11 /usr/include/X11 ln -s /usr/lib/g++-include /usr/include/g++ 這些連結(jié)須要視你的系統(tǒng)而稍作調(diào)整。 最少在 Slackware 中,g++ 標(biāo)頭檔 案在 /usr/local/g++-include, 而 Debian 卻放在 /usr/include/g++, 并且將 /usr/lib/g++-include 連結(jié)到 /usr/include/g++。 在後者的情形 ,你也許會(huì)想要將原始的 g++ include 目錄移回到 /usr/include。 4. 回存所有額外的標(biāo)頭檔與連結(jié)。 某些非標(biāo)準(zhǔn)的函式庫(kù)會(huì)將檔案放至 /usr/include, 或是在 /usr/include 放置一連結(jié)到它們的 include 目錄 下。 這些檔案與連結(jié)必須回存,如此才可以正確的使用這些額外的函式庫(kù)。 5. 將你的新函式庫(kù)路徑 (例如 /usr/i486-linuxlibc5/lib) 加入到 /etc/ld.so.conf 的頂端。 你最好要有 ld.so 1.8.8 或是更新的版本, 以 避免在安裝完 glibc 之後出現(xiàn)一些奇怪的訊息。 6. 搬移或復(fù)制所有的舊函式庫(kù)到新的目錄。 mv /usr/lib/libbsd.a /usr/i486-linuxlibc5/lib mv /usr/lib/libc.a /usr/i486-linuxlibc5/lib mv /usr/lib/libgmon.a /usr/i486-linuxlibc5/lib mv /usr/lib/libm.a /usr/i486-linuxlibc5/lib mv /usr/lib/libmcheck.a /usr/i486-linuxlibc5/lib mv /usr/lib/libc.so /usr/i486-linuxlibc5/lib mv /usr/lib/libm.so /usr/i486-linuxlibc5/lib cp /lib/libm.so.5.* /usr/i486-linuxlibc5/lib cp /lib/libc.so.5.* /usr/i486-linuxlibc5/lib 假如你的 /usr 與 / 是在不同的 partition 上, 那 libm.so.5 與 libc.so.5 應(yīng)該用復(fù)制的非搬移, 因?yàn)橐恍┯脕?lái)啟動(dòng) linux 的程式會(huì)需要 這兩個(gè)函式庫(kù), 因此必須要位在 root partition。 7. 將 /usr/lib/*.o 移到新的目錄下。 mv /usr/lib/crt1.o /usr/i486-linuxlibc5/lib mv /usr/lib/crti.o /usr/i486-linuxlibc5/lib mv /usr/lib/crtn.o /usr/i486-linuxlibc5/lib mv /usr/lib/gcrt1.o /usr/i486-linuxlibc5/lib 8. 在你的函式庫(kù)移動(dòng)後, 更新 library cache。 ldconfig -v5.3 由預(yù)先編譯好的套件安裝 如果你是由一已預(yù)先編譯好的 glibc 安裝, 你必須: cd / gzip -dc glibc-2.0.bin.i386.tar.gz | tar tvvf - gzip -dc glibc-crypt-2.0.bin.i386.tar.gz | tar tvvf - ldconfig -v 如果你用的是不同的系統(tǒng)架構(gòu)或是版本,請(qǐng)置換適當(dāng)?shù)臋n名。 5.4 由原始碼安裝 要由原始碼安裝, 執(zhí)行: make install ldconfig -v5.5 更新 gcc specs 安裝的最後一步 (不管你是由預(yù)先編譯好的套件或是由原始碼安裝) 是更新 gcc 的 spec 檔, 讓你可以正確的連結(jié)你的程式。 要知道 gcc 所用的是那一個(gè) spec 檔, 如下輸入: % gcc -v reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs gcc version 2.7.2.2 在這里,系統(tǒng)是 i486-unknown-linux, 而版本則是 2.7.2.2。 你必須將 /usr/lib/gcc-lib/<系統(tǒng)> 復(fù)制到舊的系統(tǒng)目錄下: cd /usr/lib/gcc-lib/ cp -r i486-unknown-linux i486-linuxlibc5 到原先的目錄與版本目錄下: cd /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2 并修改在同一目錄下的 specs。 將這檔案中的 /lib/ld-linux.so.1 改成 /lib/ld-linux.so.2, 并且要將所有的 %{...:-lgmon} 表示式刪除, 因?yàn)?/span> glibc 不使用 gmon 函式庫(kù)來(lái)做 profiling。 你可以在 [21]Specs 檔□例 找到 一份 specs 檔的□例。 5.6 測(cè)試你的安裝 要測(cè)試安裝是否正確, 請(qǐng)建立 glibc.c 如下: #include <stdio.h> main() { printf("hello world!\n"); } 并且 compile 這個(gè)程式: % gcc glibc.c -o glibc 使用 ldd 來(lái)查證這個(gè)程式是連結(jié)到 glibc2 而非你的舊 libc: % ldd glibc libc.so.6 => /lib/libc.so.6 (0x4000e000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 假如這個(gè)程式可以通過(guò) compile,并且在執(zhí)行後產(chǎn)生 "hello world!" 的輸出, 那麼表示已經(jīng)安裝成功。 6. 使用非主要的 C 函式庫(kù)編譯程式 有些時(shí)候你會(huì)想要使用不同的函式庫(kù)來(lái)編譯你的程式,這一節(jié)會(huì)解釋如何達(dá)成這 個(gè)目的。 我會(huì)使用在前兩節(jié)中所使用的目錄與安裝名稱,記得要改變這些名稱以 符合你的設(shè)定。 6.1 一個(gè)關(guān)於使用非主要 C 函式庫(kù)的警告 在你開始編譯任何會(huì)在開機(jī)時(shí)用到的程式之前, 假如程式是動(dòng)態(tài)連結(jié),并且是在 non-root partition 被 mount 之前使用的話, 那所有連結(jié)用的函式庫(kù)都必須在 root partition 上。 在前面的安裝程序里,我們將 glibc 安裝成主要的函式庫(kù) , 而舊的函式庫(kù)仍然保留在 /lib, /lib 會(huì)在 root partition 上, 也就是說(shuō) ,所有在開機(jī)時(shí)會(huì)用到的程式都能正常工作。 然而,若你的 /usr 是在不同的 partition 上, 且把 glibc 當(dāng)成測(cè)試用的函式庫(kù),安裝在 /usr/i486-linuxglibc2, 那除非 /usr 已經(jīng)被 mount,否則所有你用 glibc 編 譯的程式都將不能使用。 6.2 用測(cè)試安裝的 glibc 編譯程式 要用測(cè)試安裝的 glibc 編譯程式, 你必須要將 include 路徑重設(shè)成 glibc 的 include 路徑。 指定 "-nostdinc" 會(huì)取消正常 include 路徑, 而 "-I/usr/i486-linuxglibc2/include" 則會(huì)指到 glibc 的 include 目錄, 你也 必須要指定 gcc 標(biāo)準(zhǔn) include 目錄, 通常是 /usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include。 (這里假設(shè)你安裝測(cè)試 的函式庫(kù)在 i486-linuxglibc2, 而 gcc 的版本是 2.7.2.2) 要用測(cè)試安裝的 glibc 來(lái)連結(jié),你必須指明 gcc 設(shè)定, 這是由 "-b i486-linuxglibc2" 這選項(xiàng)來(lái)達(dá)成。 對(duì)大部份的程式, 你可以簡(jiǎn)單的將其加入 makefile 的 $CFLAGS 與 $LDFLAGS 選項(xiàng)中: CFLAGS = -nostdinc -I/usr/i486-linuxglibc2/include -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include -b i486-linuxglibc2 LDFLAGS = -b i486-linuxglibc2 假如你使用 configure 這個(gè) script,在執(zhí)行 configure 之前, 定義 shell 變 數(shù) $CFLAGS 與 $LDFLAGS (在 csh/tcsh 下用 env/setenv 在 sh/bash/其它之下 用 set/export)。 這樣產(chǎn)生的 makefile 應(yīng)該會(huì)包含正確的 $CFLAGS 與 $LDFLAGS。 不過(guò)并非所有的 configure scrpt 都會(huì)去取得這些變數(shù), 所以在執(zhí) 行完 configure 之後,你還是要檢查一下 makefile, 假如需要的話,手動(dòng)修改 它。 假如你所要編譯的程式只呼叫 gcc,(而不直接呼叫 cpp 或 binutils) 你可以使 用以下的 script,省去每次指定所有選項(xiàng)的麻煩: #!/bin/bash
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -