<!doctype linuxdoc system>

<article>

<title>Glibc 2 HOWTO 中文版

<author>原作 Eric Green, <tt/ejg3@cornell.edu/<newline>
譯者 Allex Juang, <tt/allex@ms2.accmail.com/

<date>1.5 版, 1998年 2月 8日

<abstract>
<nidx>GNU C library (see glibc)</nidx>
<nidx>glibc</nidx>
這份 glibc 2 HOWTO 內容包括在 Linux 系統上安裝與使用第二版 GNU C Library。
</abstract>

<toc>

<sect>簡介
<p>

<sect1>關於 glibc 2
<p>

<nidx>glibc!overview</nidx>
Glibc 2 是最新版的 GNU C 函式庫。
它目前不需修改就可以在 GNU Hurd，Linux i386， m68k， 以及 alpha 系統上執行，
而 2.1 版中將加入對 Linux PowerPC， MIPS， Sparc， Sparc 64 與 Arm
等系統的支援。未來將加入對其它架構及作業系統的支援。

在 Linux 上，glibc 2 是主要版本為 6 的 libc，也就是 Linux libc 5 的後繼者。
Linux libc 的發展人員想以此逐漸取代 libc 5。
就 2.0.6 來看，glibc 已具有成熟產品的品質。
Glibc 2.1 版 (在不久的將來) 將加入更多的功能，
並移植到更多系統上，足夠當作主流使用。

Glibc 2 有三個選擇性的附加套件：
<descrip>
<tag/Crypt/UFC-crypt 加密套件。 由於出口限制所以要分離出來。
<tag/LinuxThreads/Posix 1003.1c &dquot;pthread&dquot; 介面的實作。
<tag/Locale data/包含製造使用 glibc 的 internationalization 功能所需 locale
資料檔案的資料。
</descrip>

強烈建議安裝 Cryt 與 LinuxThreads 這兩個附加套件，
如果不安裝的話，有可能會與其它系統上的函式庫造成不相容的情形。
(假如你不想使用這兩個附加套件的話，
那你必須在執行 configure 時加上 --disable-sanity-checks 的選項)

<sect1>關於這份文件
<p>

這份文件涵蓋如何在 Linux 系統上安裝 glib 2，
適用對象是那些在 intel-based 機器上使用 libc 5 的使用者。
但是對於其它系統以及其它不同函式庫 (如 glibc 1) 的使用者，
只要將這份文件中出現的檔名以及系統架構名稱作適當的代換，
應該也可得到些幫助。

這份 HOWTO 的最新版本的拷貝可在
<url url="http://sunsite.unc.edu/LDP" name="Linux Documentation Project">
或是
<url url="http://www.imaxx.net/~thrytis/glibc/Glibc2-HOWTO.html">
找到。

<sect1>這份文件的最新改變
<p>

1.5 與 1.4 版的差別：
<itemize>
<item>由 Ed Bailey 加入索引
<item>我的新電子郵件信箱位址
</itemize>

1.4 與 1.3 版的差別：
<itemize>
<item>將目前狀態由實驗性改成成熟產品。
<item>更新發展中的移植列表。
<item>更新最新版到 2.0.6。
</itemize>

<sect>選擇你的安裝方式
<p>
<nidx>glibc!installing</nidx>

有許多種方式安裝 glibc，你可以安裝成一個測試用的函式庫，
將目前使用的函式庫當作是內定的，
然後在編譯程式的時候用不同的選項來試用新的函式庫。
用這種安裝方式以後可以輕易的移除 glibc。
(雖然用 glibc 連結的程式在移除 glibc 後都將不能使用)
另外，用這種方式安裝，你必須由原始碼重新編譯，
並沒有 binary distribution 可以安裝成測試的函式庫。
這樣的安裝請參照<ref id="test-install" name="安裝成測試用的函式庫">。

這份文件中所說的另一種方式則是將 glibc 安裝成主要函式庫。
所有新編譯的程式都將會使用 glibc，
但是你也可以在編譯時用不同的選項而將程式連結到舊的函式庫。
你可以直接安裝已經編譯好的版本，也可以自己編譯函式庫。
假如想更改最佳化或是組態選項，
或是想加入已編譯好的版本中未支援的 add-on 的話，
那你必需取得原始碼並且自己編譯，這個安裝的過程請參照
<ref id="primary-install" name="安裝成主要的 C 函式庫">

Frodo Looijaard 描述了另一種 glibc 的安裝方式。
他的方法是將 glibc 安裝成次要的函式庫，
然後設定交叉編譯器 (cross compiler) 來使用 glibc。
這個方式比起這份文件中的測試安裝要複雜的多，但是比較容易連結到 glibc。
這個方法在他的
<url url="http://huizen.dds.nl/~frodol/glibc/" name="Installing glibc-2 on Linux">
文件中說明。

假如你現在使用的是 Debian 1.3，
但是不想為了 glibc 而升級到不穩定的版本，
那麼
<url url="http://www.gate.net/~storm/FAQ/libc5-libc6-Mini-HOWTO.html" name="Debian libc5 to libc6 Mini-HOWTO">
會告訴你如何使用 Debian 的 package 來升級。

假如你要把 glibc 2 安裝到一重要的系統上，
那也許你應使用測試的安裝，或是在備用系統上試試看。
即使沒有臭蟲，某些程式在編譯之前仍然需要某些修改，
原因在於某些函式原型與型態上的改變。

<sect>取得函式庫<label id="getting">
<p>
<nidx>glibc!obtaining</nidx>

Glibc 2 包含 glibc package 以及數個附加套件：
LinuxThreads、 Locale 與 Crypt， 原始碼在
<itemize>
<item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.6.tar.gz">
<item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-linuxthreads-2.0.6.tar.gz">
<item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-localedata-2.0.6.tar.gz">
<item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.6.tar.gz">
</itemize>

你需要大約 150MB 的磁碟空間來作完全的編譯與安裝，
核心函式庫的基本安裝大約要 50MB。

2.0.6 並沒有 binary 的 package，
2.0.4 的 binary package 只有 i386 及 m68k 的版本，
而 2.0.1 for alpha 則可以在以下地方找到：
<itemize>
<item>Intel x86:
<itemize>
<item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.4.bin.i386.tar.gz">
<item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.4.bin.i386.tar.gz">
</itemize>

<item>Alpha:
<itemize>
<item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.1.bin.alpha-linux.tar.gz">
<item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.1.bin.alpha-linux.tar.gz">
</itemize>

<item>m68k:
<itemize>
<item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.4-m68k-linux.bin.tar.gz">
<item><url url="ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.4-m68k-linux.bin.tar.gz">
</itemize>
</itemize>

由於 cypt 這個附加套件有出口限制，非美國使用者請到
<url url="ftp://ftp.ifi.uio.no/pub/gnu">
取得。

如果你用的是 RedHat distribution，
那你可以從
<url url="ftp://ftp.redhat.com/pub/redhat/">
取得 glibc2 的 rpm。
在 RedHat distribution 5.0 中， glibc 2 是主要的 C 函式庫。

如果你用的是 Debian distribution，那你可以從
<url url="ftp://ftp.debian.org/debian/dists/unstable/main/">
取得 glibc2 的 package。檔名是 libc6。
Glibc 2 目前是 Debian 測試版的基本 package，
等到 Debian 2.0 出來之後將會是主要的 C 函式庫。

<sect>安裝成測試用的函式庫<label id="test-install">
<p>
<nidx>glibc!testing</nidx>

這一節的內容是關於如何將 glibc 2 安裝成測試用的函式庫。
所有編譯的程式都連結到你目前的函式庫，
除非你給了某些額外的參數才會連結到新的函式庫。
由於路徑被編譯到某些檔案中，你需要由原始碼來安裝這函式庫。

<sect1>編譯與安裝
<p>

<sect2>需求
<p>
<nidx>glibc!testing!prerequisites</nidx>

<itemize>
<item>約 150 MB 的磁碟空間
<item>GNU make 3.75
<item>gcc &gt;= 2.7.2 (最好是 2.7.2.1)
<item>binutils 2.8.1 (假如是 alpha 你還需要 snapshot)
<item>bash 2.0
<item>autoconf 2.12 (假如你更動了 configure.in)
<item>texinfo 3.11
</itemize>

在一台安裝有 64MB 記憶體 i586@133 的機器上，
編譯完整的函式庫 (包括附加套件) 大約須要 3 小時。
而在 i686@200 則須約一個半小時。

<sect2>解開原始碼
<p>
<nidx>glibc!testing!sources, extracting</nidx>

你必需由 archive 中取出原始碼。如此才能編譯它，最好的方式如下：
 <tscreen><verb>
 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
 </verb></tscreen>
這會將 linuxthreads、 crypt 與 localedata 等目錄放至 glibc-2.0.6 的目錄底下，
如此 configure 才可以找到這些 add-ons。

<sect2>設定組態
<p>
<nidx>glibc!testing!configuring</nidx>

在 glibc-2.0.6 的目錄底下，建立一個新的目錄 compile，並且 cd 到 compile 底下，
所有的工作都會在這個目錄中完成，這會簡化後續的清除工作。
(發展者似乎並未讓 'make clean' 作得很好)
 <tscreen><verb>
 mkdir compile
 cd compile
 </verb></tscreen>
執行 <tt>../configure</tt>。
要使用父加套件，你必需用 --enable-add-ons 指定，
例如說 --enable-add-ons=linuxthreads,crypt,localedata。

你也必需指定要安裝的目錄，/usr/i486-linuxglibc2 是個不錯的選擇，
這樣的 configure 命令如下：
 <tscreen><verb>
 ../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr/i486-linuxglibc2
 </verb></tscreen>

<sect2>編譯與安裝
<p>
<nidx>glibc!testing!compiling</nidx>
<nidx>glibc!testing!installing</nidx>

要編譯與驗證，執行
 <tscreen><verb>
 make
 make check
 </verb></tscreen>
假如 'make check' 成功了，安裝函式庫：
 <tscreen><verb>
 make install
 </verb></tscreen>

<sect1>更新 dynamic loader
<p>
<nidx>glibc!testing!dynamic loader, updating</nidx>
<nidx>glibc!testing!ld.so.conf, updating</nidx>

<enum>
<item>建立連結，
從 <tt>ld.so</tt> 到 <tt>/lib/ld-linux.so.2</tt>：
 <tscreen><verb>
 ln -s /usr/i486-linuxglibc2/lib/ld-linux.so.2 /lib/ld-linux.so.2
 </verb></tscreen>
當一個檔案連結時，這個函式庫是唯一一個位置固定的。
當穩定的版本出現的時候，
在 /lib 使用連結也會使得將 glibc 升級為主要函式庫時更為輕鬆。

<item>修改 <tt>/etc/ld.so.conf</tt>。
你需要增加新的函式庫所在的路徑到檔案的最後，
這路徑應該是 <tt>&lt;prefix&gt;/lib</tt>。
假如用以上的選擇就應該是 <tt>/usr/i486-linuxglibc2/lib</tt>。
在你修改了 <tt>/etc/ld.so.conf</tt> 之後，執行：
 <tscreen><verb>
 ldconfig -v
 </verb></tscreen>
</enum>

<sect1>設定 gcc
<p>
<nidx>glibc!testing!gcc configuration</nidx>

安裝的最後一步是更新 <tt>/usr/lib/gcc-lib</tt>
以使 gcc 知道如何使用新的函式庫。
首先，你需要複製目前的組態，要知道目前的組態，使用 gcc 的 -v 選項：
 <tscreen><verb>
 &percnt; gcc -v
 Reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs
 gcc version 2.7.2.2
 </verb></tscreen>
這裡，i486-unknown-linux 是目前所用的系統，2.7.2.2 則是目前版本。
你需要將 <tt>/usr/lib/gcc-lib/&lt;系統&gt;</tt> 複製到新的測試系統目錄：
 <tscreen><verb>
 cd /usr/lib/gcc-lib/
 cp -r i486-unknown-linux i486-linuxglibc2
 </verb></tscreen>
到你的新系統目錄以及版本目錄下：
 <tscreen><verb>
 cd /usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2
 </verb></tscreen>
修改目錄下的 <tt>specs</tt>。在這檔案中，
將 <tt>/lib/ld-linux.so.1</tt> 換成 <tt>/lib/ld-linux.so.2</tt>，
你也必需要移去檔案中所有的 <tt/&percnt;{...:-lgmon}/ 表示式，
因為 glibc 不使用 gmon 函式庫來做 profile。
你可以在<ref id="specs" name="Specs 檔範例">找到一個範例。

<sect1>更新標頭檔連結
<p>
<nidx>glibc!testing!header files, updating</nidx>

你需要在你的 include 目錄下建立連結到其它的 include 目錄：
 <tscreen><verb>
 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
 </verb></tscreen>
也許你有其它的函式庫，例如說 ncurse，
而這些函式庫會需要它們自己的標頭檔，
你應該從 <tt>/usr/include</tt> 複製或連結這些檔案。
(有些函式庫需要重新用 glibc2 來 compile，在這種情形下，
只要編譯並且安裝到 <tt>/usr/i486-linuxglibc2</tt>)

<sect1>測試你的安裝
<p>
<nidx>glibc!testing</nidx>

要測試安裝是否成功，建立一檔案 glibc.c 如下：
 <tscreen><verb>
 &num;include &lt;stdio.h&gt;

 main()
 {
     printf("hello world!\n");
 }
 </verb></tscreen>
用 &dquot;-b &lt;安裝目錄&gt; -nostdinc -I&lt;安裝目錄&gt;/include -I/usr/lib/gcc-lib/&lt;新系統目錄&gt/&lt;gcc 版本&gt;/include&dquot; 的選項編譯：
 <tscreen><verb>
 &percnt; 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
 </verb></tscreen>
使用 ldd 確定程式是用 glibc2 連結，而非舊有的 libc：
 <tscreen><verb>
 &percnt; 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)
 </verb></tscreen>
如果通過編譯，連結也確定，
並且執行時也產生 &dquot;hello world!&dquot; 的輸出，那麼安裝就成功了。


<sect>安裝成主要函式庫<label id="primary-install">
<p>
<nidx>glibc!installation</nidx>

這一節的內容是關於將 glibc2 安裝成你的主要 C 函式庫。
任何你編譯的新程式都將會連結到這一個函式庫，
除非你用了特殊的編譯選項來連結到其它的版本。

假如你是用 RedHat 或 Debian 並且已下載相關的 rpm 或 deb 檔，
請參閱 RedHat 或 Debian 的安裝說明，你可以直接跳過這一節。

<sect1>由原始碼編譯函式庫<label id="compiling">
<p>
<nidx>glibc!installation!compilation</nidx>

這一節解釋如何由原始碼編譯 glibc 2 與附加套件。
如果你想要改變最佳化與組態選項或使用額外的套件，那你就必須編譯函式庫。

<sect2>需求
<p>
<nidx>glibc!installation!prerequisites</nidx>

<itemize>
<item>約 150 MB 的磁碟空間
<item>GNU make 3.75
<item>gcc &gt;= 2.7.2 (最好是 2.7.2.1)
<item>binutils 2.8.1 (假如是 alpha 你需要 snapshot)
<item>bash 2.0
<item>autoconf 2.12 (假如你更動了 configure.in)
<item>texinfo 3.11
</itemize>

在一安裝有 64MB 記憶體的 i586@133 機器上，
編譯完整的函式庫與附加套件大約需要三個小時。
而在 i686@200 的機器上則約需要一個半小時。

<sect2>解開原始碼
<p>
<nidx>glibc!installation!sources, extracting</nidx>

你需要從 archive 中解出原始碼才能編譯它，
最好的方式是：
 <tscreen><verb>
 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
 </verb></tscreen>
這將會把 linuxthreads、crypt 與 localedata 等目錄放到 glibc-2.0.6 目錄下，
如此 configure 才能找到這些附加套件。

<sect2>設定組態
<p>
<nidx>glibc!installation!configuration</nidx>

在 <tt>glibc-2.0.6</tt> 的目錄底下，建立一個新的目錄 compile，
並且 cd 到 compile 底下，所也的工作都會在這個目錄中完成，
這會簡化後續的清除工作。
(發展者似乎並未讓 'make clean' 作得很好)
 <tscreen><verb>
 mkdir compile
 cd compile
 </verb></tscreen>

執行 <tt>../configure</tt>。
要使用附加套件你必需用 --enable-add-ons 來指定，
例如 --enable-add-ons=linuxthreads,crypt,localedata。
也許你也會想要指定安裝的目錄，要符合 linux 標準架構，
指定為 --prefix=/usr。
(當在 linux 系統上 prefix 被設為 <tt>/usr</tt>，
configure 知道要調整其它的路徑，
好將 libc.so 以及其它重要的函式庫放到 <tt>/lib</tt>)
完整的 configure 命令如下：
<tscreen><verb>
 ../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr
</verb></tscreen>

<sect2>編譯
<p>
<nidx>glibc!installation!compilation</nidx>

要編譯與驗證，
執行：
 <tscreen><verb>
 make
 make check
 </verb></tscreen>

<sect1>準備安裝
<p>
<nidx>glibc!installation!preparation for</nidx> 

無論是由原始碼編譯或是預先編譯好的版本，你現在必需移動某些檔案來迎接新的函式庫。
任何新編譯的程式會被連結到 glibc，但是舊有靜態連結的程式仍然倚靠著 libc 5，
所以你不能只是覆蓋掉舊有的版本。

<enum>
<item>建立一個新的目錄來放置舊檔案：
 <tscreen><verb>
 mkdir -p /usr/i486-linuxlibc5/lib
 </verb></tscreen>

<item>舊的標頭檔必需從 <tt>/usr/include</tt> 移開：
 <tscreen><verb>
 mv /usr/include /usr/i486-linuxlibc5/include
 </verb></tscreen>

<item>建立一個新的 include 目錄，並且設定到其它 include 目錄的連結：
 <tscreen><verb>
 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++
 </verb></tscreen>
這些連結須要視你的系統而稍作調整。
最少在 Slackware 中，g++ 標頭檔案在 <tt>/usr/local/g++-include</tt>，
而 Debian 卻放在 <tt>/usr/include/g++</tt>，
並且將 <tt>/usr/lib/g++-include</tt> 連結到 <tt>/usr/include/g++</tt>。
在後者的情形，你也許會想要將原始的 g++ include 目錄移回到
<tt>/usr/include</tt>。

<item>回存所有額外的標頭檔與連結。
某些非標準的函式庫會將檔案放至 <tt>/usr/include</tt>，
或是在 <tt>/usr/include</tt> 放置一連結到它們的 include 目錄下。
這些檔案與連結必須回存，如此才可以正確的使用這些額外的函式庫。

<item>將你的新函式庫路徑
(例如 <tt>/usr/i486-linuxlibc5/lib</tt>)
加入到 <tt>/etc/ld.so.conf</tt> 的<em>頂端</em>。
你最好要有 ld.so 1.8.8 或是更新的版本，
以避免在安裝完 glibc 之後出現一些奇怪的訊息。

<item>搬移或複製所有的舊函式庫到新的目錄。
 <tscreen><verb>
 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
 </verb></tscreen>
假如你的 <tt>/usr</tt> 與 <tt>/</tt> 是在不同的 partition 上，
那 <tt>libm.so.5</tt> 與 <tt>libc.so.5</tt> 應該用複製的非搬移，
因為一些用來啟動 linux 的程式會需要這兩個函式庫，
因此必須要位在 root partition。

<item>將 <tt>/usr/lib/*.o</tt> 移到新的目錄下。
 <tscreen><verb>
 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
 </verb></tscreen>

<item>在你的函式庫移動後，
更新 library cache。
 <tscreen><verb>
 ldconfig -v
 </verb></tscreen>
</enum>

<sect1>由預先編譯好的套件安裝
<p>
<nidx>glibc!installation!precompiled binaries</nidx>

如果你是由一已預先編譯好的 glibc 安裝，
你必須：
 <tscreen><verb>
 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
 </verb></tscreen>
如果你用的是不同的系統架構或是版本，請置換適當的檔名。

<sect1>由原始碼安裝
<p>
<nidx>glibc!installation!from source</nidx>

要由原始碼安裝，
執行：
 <tscreen><verb>
 make install
 ldconfig -v
 </verb></tscreen>

<sect1>更新 gcc specs
<p>
<nidx>glibc!installation!gcc specs file, updating</nidx>

安裝的最後一步
(不管你是由預先編譯好的套件或是由原始碼安裝)
是更新 gcc 的 <tt>spec</tt> 檔，
讓你可以正確的連結你的程式。
要知道 gcc 所用的是那一個 spec 檔，
如下輸入：
 <tscreen><verb>
 &percnt; gcc -v
 reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs
 gcc version 2.7.2.2
 </verb></tscreen>

在這裡，系統是 i486-unknown-linux，
而版本則是 2.7.2.2。
你必須將 <tt>/usr/lib/gcc-lib/&lt;系統&gt;</tt> 複製到舊的系統目錄下：
 <tscreen><verb>
 cd /usr/lib/gcc-lib/
 cp -r i486-unknown-linux i486-linuxlibc5
 </verb></tscreen>

到原先的目錄與版本目錄下：
 <tscreen><verb>
 cd /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2
 </verb></tscreen>
並修改在同一目錄下的 <tt>specs</tt>。
將這檔案中的 <tt>/lib/ld-linux.so.1</tt> 改成 <tt>/lib/ld-linux.so.2</tt>，
並且要將所有的 <tt/&percnt;{...:-lgmon}/ 表示式刪除，
因為 glibc 不使用 gmon 函式庫來做 profiling。
你可以在 <ref id="specs" name="Specs 檔範例"> 找到一份 specs 檔的範例。

<sect1>測試你的安裝
<p>
<nidx>glibc!installation!testing</nidx>

要測試安裝是否正確，
請建立 glibc.c 如下：
 <tscreen><verb>
 &num;include &lt;stdio.h&gt;

 main()
 {
     printf("hello world!\n");
 }
 </verb></tscreen>
並且 compile 這個程式：
 <tscreen><verb>
 &percnt; gcc glibc.c -o glibc
 </verb></tscreen>
使用 ldd 來查證這個程式是連結到 glibc2 而非你的舊 libc：
 <tscreen><verb>
 &percnt; ldd glibc
 libc.so.6 => /lib/libc.so.6 (0x4000e000)
 /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
 </verb></tscreen>
假如這個程式可以通過 compile，並且在執行後產生 &dquot;hello world!&dquot;
的輸出，那麼表示已經安裝成功。


<sect>使用非主要的 C 函式庫編譯程式
<p>
<nidx>glibc!compiling with alternate library</nidx>

有些時候你會想要使用不同的函式庫來編譯你的程式，這一節會解釋如何達成這個目的。
我會使用在前兩節中所使用的目錄與安裝名稱，記得要改變這些名稱以符合你的設定。

<sect1>一個關於使用非主要 C 函式庫的警告
<p>
<nidx>glibc!compiling with alternate library!warning</nidx>
在你開始編譯任何會在開機時用到的程式之前，
假如程式是動態連結，並且是在 non-root partition 被 mount 之前使用的話，
那所有連結用的函式庫都必須在 root partition 上。
在前面的安裝程序裡，我們將 glibc 安裝成主要的函式庫，
而舊的函式庫仍然保留在 <tt>/lib</tt>，
<tt>/lib</tt> 會在 root partition 上，
也就是說，所有在開機時會用到的程式都能正常工作。
然而，若你的 <tt>/usr</tt> 是在不同的 partition 上，
且把 glibc 當成測試用的函式庫，安裝在 <tt>/usr/i486-linuxglibc2</tt>，
那除非 <tt>/usr</tt> 已經被 mount，否則所有你用 glibc 編譯的程式都將不能使用。

<sect1>用測試安裝的 glibc 編譯程式
<p>
<nidx>glibc!compiling with alternate library!glibc</nidx>
要用測試安裝的 glibc 編譯程式，
你必須要將 include 路徑重設成 glibc 的 include 路徑。
指定 &dquot;-nostdinc&dquot; 會取消正常 include 路徑，
而 &dquot;-I/usr/i486-linuxglibc2/include&dquot; 則會指到 glibc 的 include
目錄，
你也必須要指定 gcc 標準 include 目錄，
通常是 <tt>/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include</tt>。
(這裡假設你安裝測試的函式庫在 i486-linuxglibc2，
而 gcc 的版本是 2.7.2.2)

要用測試安裝的 glibc 來連結，你必須指明 gcc 設定，
這是由 &dquot;-b i486-linuxglibc2&dquot; 這選項來達成。

對大部份的程式，
你可以簡單的將其加入 makefile 的
<tt>&dollar;CFLAGS</tt>
與
<tt>&dollar;LDFLAGS</tt>
選項中：
 <tscreen><verb>
 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
 </verb></tscreen>
假如你使用 configure 這個 script，在執行 configure 之前，
定義 shell 變數 <tt>&dollar;CFLAGS</tt> 與 <tt>&dollar;LDFLAGS</tt>
(在 csh/tcsh 下用 env/setenv
在 sh/bash/其它之下用 set/export)。
這樣產生的 makefile 應該會包含正確的 <tt>&dollar;CFLAGS</tt> 與
<tt>&dollar;LDFLAGS</tt>。
不過並非所有的 configure scrpt 都會去取得這些變數，
所以在執行完 configure 之後，你還是要檢查一下 makefile，
假如需要的話，手動修改它。

假如你所要編譯的程式只呼叫 gcc，(而不直接呼叫 cpp 或 binutils)
你可以使用以下的 script，省去每次指定所有選項的麻煩：
 <tscreen><verb>
 &num;!/bin/bash
 /usr/bin/gcc -b i486-linuxglibc2 -nostdinc \
              -I/usr/i486-linuxglibc2/include \
              -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include "&dollar;@"
 </verb></tscreen>
編譯時你可以使用這個 script 而不是 gcc。

<sect1>當 glibc 是主要函式庫時用 libc 5 編譯程式
<p>
<nidx>glibc!compiling with alternate library!libc 5</nidx>
當你已經將 glibc 安裝成主要的函式庫之後，又想用舊的函式庫來編譯程式的時候，
你必須將 include 路徑重設成舊的路徑。
指定 &dquot;-nostdinc&dquot; 將會使預設的路徑無效，
而 &dquot;-I/usr/i486-linuxlibc5/include&dquot; 會將 include
的路徑指到舊函式庫的 include 路徑，
你也必須要指定
&dquot;-I/usr/lib/gcc-lib/i486-linuxlibc5/2.7.2.2/include&dquot;
以含入 gcc 所需的 include 檔。
注意要視你新的目錄與 gcc 版本來調整這些路徑。

要用舊的 libc 來做連結，你必須指定 gcc 所用的架構。
這是由 &dquot;-b i486-linuxlibc5&dquot; 這個選項所指定的。

對大部份的程式，你可以簡單的將這些選項加入到 makefile 裡的
<tt>&dollar;CFLAGS</tt>
與
<tt>&dollar;LDFLAGS</tt>
選項裡：
 <tscreen><verb>
 CFLAGS = -nostdinc -I/usr/i486-linuxlibc5/include -I/usr/lib/gcc-lib/i486-linuxlibc5/2.7.2.2/include -b i486-linuxlibc5
 LDFLAGS = -b i486-linuxlibc5
 </verb></tscreen>
假如你使用 configure 這個 script，
在執行 configure 之前，
定義 shell 變數 <tt>&dollar;CFLAGS</tt> 與 <tt>&dollar;LDFLAGS</tt>
(在 csh/tcsh 下用 env/setenv
在 sh/bash/或其它之下用 set/export)。
這樣產生的 makefile 應該會包含正確的 <tt>&dollar;CFLAGS</tt> 與
<tt>&dollar;LDFLAGS</tt>。
不過並非所有的 configure scrpt 都會去取得這些變數，
所以在執行完 configure 之後，你還是要簡檢查一下 makefile，
假如需要的話，手動修改它。

假如你所要編譯的程式只呼叫 gcc，(而不直接呼叫 cpp 或 binutils)
你可以使用以下的 script，省去每次指定所有選項的麻煩：
 <tscreen><verb>
 &num;!/bin/bash
 /usr/bin/gcc -b i486-linuxlibc5 -nostdinc \
              -I/usr/i486-linuxlibc5/include \
              -I/usr/lib/gcc-lib/i486-linuxlibc5/2.7.2.2/include "&dollar;@"
 </verb></tscreen>
編譯時你可以使用這個 script 而不是 gcc。


<sect>編譯 C++ 程式
<p>
<nidx>glibc!C++ programs, compiling</nidx>

因為 libg++ 使用了部份的數學函式庫，也就是說會連結到 libm。
由於你目前的 libg++ 是用舊版的函式庫所建立的，
所以你必須重新用 glibc 來 compile libg++ 或是取得一份預先編譯好的版本。
最新版的 libg++ source 與用 glibc 所連結的預先編譯版可以在
<url url="ftp://ftp.yggdrasil.com/private/hjl/">
找到。

<sect1>用測試的 C 函式庫安裝 libg++
<p>
<nidx>glibc!libg++, installing!as test library</nidx>

假如你已經將 glibc 安裝成測試用的函式庫，那你必須安裝到 glibc 所安裝的目錄下
(例如由前一節所示的 <tt>/usr/i486-linuxglibc2</tt>)。
假如你要安裝預先編譯好的版本
(這也是我建議的安裝方式，因為我一直都不能用這種方式成功地編譯 libg++)，
你必須將檔案解到暫存的目錄下，
將 <tt>usr/lib/</tt> 下的所有檔案搬到
<tt>&lt;install directory&gt;/lib/</tt>，
並將 <tt>usr/include/</tt> 下的所有檔案搬到
<tt>&lt;install directory&gt;/include/</tt> 下，
(記得先刪除 <tt>include/g++</tt> 這個連結！)
再將 <tt>usr/bin/</tt> 下的檔案搬到 
<tt>&lt;install directory&gt;/bin/</tt>。

<sect1>在主要 glibc 下安裝 libg++
<p>
<nidx>glibc!libg++, installing!as primary library</nidx>
若你已經將 glibc 安裝成主要的函式庫，假如還想要用舊的 libc 來編譯 g++ 的程式，
那你必須先將舊的 libg++ 檔案移至舊的 libc 的目錄下。
也許最簡單的方式就是如前一節用 libc 5 來安裝一份新版的拷貝，
然後再正常安裝 glibc 版。

<sect1>使用非主要的 C 函式庫來編譯 C++ 程式
<p>
<nidx>glibc!C++ programs, compiling!with non-primary libc</nidx>
假如你想用非主要的 C 函式庫來編譯 C++ 程式，
那你必須要加入 g++ 的 include 目錄。
在上面的例子中，
對測試用的 glibc 是 <tt>/usr/i486-linuxglibc2/include/g++</tt>，
而對主要 glibc 則是 <tt>/usr/i486-linuxlibc5/include/g++</tt>，
這通常都可以由添加至 <tt>&dollar;CXXFLAGS</tt> 這個變數來完成：
 <tscreen><verb>
 CXXFLAGS = -nostdinc -I/usr/i486-linuxglibc2/include -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include -I/usr/i486-linuxlibc5/include/g++ -b i486-linuxglibc2
 </verb></tscreen>


<sect>報告臭蟲
<p>
<nidx>glibc!bugs, reporting</nidx>

假如你以為這函式庫有錯，請先閱讀 FAQ，也許已經有人遇到過這個問題，
並且也已經有了簡單的解決方法。
另外，你也應該查看 <tt>INSTALL</tt> 檔中的
"Recommended Tools to Install the GNU C Library" 一節，
因為有些錯誤不在於 glibc 而是在於這些工具。

假設你找到了臭蟲，請先確定那的確是臭蟲。
一個判斷的好方法是看看 glibc 的行為是否與其它的 C 函式庫相同。
假如相同的話，那也許你是錯的，而函式庫是正確的。
(但也不一定如此)
假如不相同的話，那肯定兩者之中有一個是錯的。

接著，請到 <url url="http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl">，
並且查看臭蟲資料庫，確定這個問題尚未有人提出。
你也應該看看 <tt>BUGS</tt>
(內付於 libc 中)
所列出的目前已被發現的臭蟲。

一旦你確定找到了一隻新的臭蟲，請試著將它縮小到最小的 test case。
就 C 函式庫而言，你只需要將它縮小到單獨一個函式呼叫(假如可以的話)。
這應該不是太困難的事。

最後一個步驟是就你的 test case 提出臭蟲報告。
要送出臭蟲報告，請包含你的 test case、你所得到的結果、你所期待的結果、
你認為可能的原因在那
(只要你曾想過的任何原因)、你的系統類別、你所使用的 GNU C 函式庫、
GNU CC 編譯器、GNU binutils 的版本。另外，
請附上執行 <tt>configure</tt> 時產生的 <tt>config.status</tt> 與
<tt>config.make</tt>，
這兩個檔案會在你執行 <tt>configure</tt> 時候的目錄下。

所有的臭蟲報告都應該使用 <tt/glibcbug/ 這個 GNU libc 所附的 shell script
送至 <url url="mailto:bugs@gnu.org" name="bugs@gnu.org"> (舊的位址 <url url="mailto:bugs@gnu.ai.mit.edu" name="bugs@gnu.ai.mit.edu">
也仍然可以使用)。
或是到 GNATS 網站上利用
<url url="http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl">
這個介面來做。

你的建議與問題應該送到 <url url="mailto:bugs-glibc@prep.ai.mit.edu" name="bugs-glibc@prep.ai.mit.edu"> 這個郵遞列表。
假如你沒有閱讀新聞群組 gnu.bug.glibc，
那麼你可以要求 <url url="mailto:bug-glibc-request@prep.ai.mit.edu" name="bug-glibc-request@prep.ai.mit.edu"> 加入這個列表。

請不要將 GNU C 函式庫的臭蟲報告送到 &lt;bug-gcc@prep.ai.mit.edu&gt;，
這是為了 GNU CC 而設立的，而 GNU CC 與 GNU C 函式庫是由不同人們的所維護的。


<sect>Specs 檔範例<label id="specs">
<p>
<nidx>glibc!GCC specs file, sample</nidx>

這裡是一份 <tt>specs</tt> 的範例。這將使 gcc 用 glibc2 來編譯與連結。
它應該位於
<tt>/usr/lib/gcc-lib/&lt;新系統目錄&gt;/&lt;gcc 版本&gt;</tt>.
假如你用的是 x86 的系統，那你也許可以直接將這一段複製到檔案裡去。
 <tscreen><verb>
 *asm:
 &percnt;{V} &percnt;{v:&percnt;{!V:-V}} &percnt;{Qy:} &percnt;{!Qn:-Qy} &percnt;{n} &percnt;{T} &percnt;{Ym,*} &percnt;{Yd,*} &percnt;{Wa,*:&percnt;*}

 *asm_final:
 &percnt;{pipe:-}

 *cpp:
 &percnt;{fPIC:-D__PIC__ -D__pic__} &percnt;{fpic:-D__PIC__ -D__pic__} &percnt;{!m386:-D__i486__} &percnt;{posix:-D_POSIX_SOURCE} &percnt;{pthread:-D_REENTRANT}

 *cc1:
 &percnt;{profile:-p}

 *cc1plus:

 *endfile:
 &percnt;{!shared:crtend.o&percnt;s} &percnt;{shared:crtendS.o&percnt;s} crtn.o&percnt;s

 *link:
 -m elf_i386 &percnt;{shared:-shared}   &percnt;{!shared:     &percnt;{!ibcs:       &percnt;{!static: 	&percnt;{rdynamic:-export-dynamic} 	&percnt;{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} 	&percnt;{static:-static}}}

 *lib:
 &percnt;{!shared: &percnt;{pthread:-lpthread} 	&percnt;{profile:-lc_p} &percnt;{!profile: -lc}}

 *libgcc:
 -lgcc

 *startfile:
 &percnt;{!shared:      &percnt;{pg:gcrt1.o&percnt;s} &percnt;{!pg:&percnt;{p:gcrt1.o&percnt;s} 		       &percnt;{!p:&percnt;{profile:gcrt1.o&percnt;s} 			 &percnt;{!profile:crt1.o&percnt;s}}}}    crti.o&percnt;s &percnt;{!shared:crtbegin.o&percnt;s} &percnt;{shared:crtbeginS.o&percnt;s}

 *switches_need_spaces:

 *signed_char:
 &percnt;{funsigned-char:-D__CHAR_UNSIGNED__}

 *predefines:
 -D__ELF__ -Dunix -Di386 -Dlinux -Asystem(unix) -Asystem(posix) -Acpu(i386) -Amachine(i386)

 *cross_compile:
 0

 *multilib:
 . ;
 </verb></tscreen>


<sect>雜項
<p>
<nidx>glibc!miscellanea</nidx>

<sect1>進一步的資料
<nidx>glibc!information resources</nidx>
<p>

<sect2>相關網頁
<p>
<nidx>glibc!information resources!WWW</nidx>

<itemize>
<item><url url="http://www.gnu.org/software/libc/libc.html" name="FSF's GNU C Library Home Page">
<item><url url="http://www.imaxx.net/~thrytis/glibc/" name="Using GNU Libc 2 with Linux">
<item><url url="http://huizen.dds.nl/~frodol/glibc/"name="Installing glibc-2 on Linux">.
<item><url url="http://www.gate.net/~storm/FAQ/libc5-libc6-Mini-HOWTO.html" name="Debian libc5 to libc6 Mini-HOWTO">.
</itemize>

<sect2>新聞群組
<p>
<nidx>glibc!information resources!newsgroups</nidx>

<itemize>
<item><htmlurl url="news:comp.os.linux.development.system" name="comp.os.linux.development.system">
<item><htmlurl url="news:comp.os.linux.development.apps" name="comp.os.linux.development.apps">
<item><htmlurl url="news:linux.dev.kernel" name="linux.dev.kernel">
<item><htmlurl url="news:gnu.bug.glibc" name="gnu.bugs.glibc">
</itemize>

<sect2>郵遞列表
<p>
<nidx>glibc!information resources!mailing lists</nidx>

<descrip>
<tag/Glibc 2 Linux 討論列表/
這個郵遞列表是為了讓安裝有 glibc，也就是新的 GNU C 函式庫，的使用者討論用的。
議題包括相容性的問題，以及在 linux/glibc 環境下程式的編譯問題。
要訂閱這個郵遞列表，
請寄一封信至 <url url="mailto:Majordomo@ricardo.ecn.wfu.edu"
name="Majordomo@ricardo.ecn.wfu.edu">，
信的內容為 "subscribe glibc-linux &lt;your email address&gt;"。
</descrip>

<sect1>貢獻者列表
<p>
大部份的資訊都是由
<url url="http://www.gnu.org/software/libc/libc.html" name="GNU Libc web page">
以及
Ulrich Drepper 的 &lt;drepper@gnu.ai.mit.edu&gt; glibc 2
announcement
所偷來的，
Andreas Jaeger &lt;aj@arthur.rhein-neckar.de&gt; 則提供了部份的臭蟲報告。

以下各位都曾對本文件提供相關資訊以及意見：
<itemize>
<item>Allex Juang&lt;allex@ms2.accmail.com.tw&gt;
<item>Mark Brown &lt;M.A.Brown-4@sms.ed.ac.uk&gt;
<item>Ulrich Drepper &lt;drepper@gnu.ai.mit.edu&gt;
<item>Scott K. Ellis &lt;ellis@valueweb.net&gt;
<item>Aron Griffis &lt;agriffis@coat.com&gt;
<item>Andreas Jaeger &lt;aj@arthur.rhein-neckar.de&gt;
<item>Frodo Looijaard &lt;frodol@dds.nl&gt;
<item>Ryan McGuire &lt;rmcguire@freenet.columbus.oh.us&gt;
<item>Shaya Potter &lt;spotter@capaccess.org&gt;
<item>Les Schaffer &lt;godzilla@futuris.net&gt;
<item>Andy Sewell &lt;puck@pookhill.demon.co.uk&gt;
<item>Gary Shea &lt;shea@gtsdesign.com&gt;
<item>Stephane &lt;sr@adb.fr&gt;
<item>Jan Vandenbos &lt;jan@imaxx.net&gt;
</itemize>
這份文件的翻譯是由以下數人所完成的：
<itemize>
<item>中文：  Allex Juang&lt;allex@ms2.accmail.com.tw&gt;
<item>法文：  Olivier Tharan &lt;tharan@int-evry.fr&gt;
<item>日文：  Kazuyuki Okamoto &lt;ikko-@pacific.rim.or.jp&gt;
</itemize>

<sect1>回饋
<p>

除了撰寫這份 HOWTO、維護
<url url="http://www.imaxx.net/~thrytis/glibc" name="glibc 2 for Linux">
這網頁、並且在我的機器上使用之外，我與 glibc 計劃完全無關，
我也不了解這方面的議題，但會儘可能的對寄給我的問題提供幫助。
我也很歡迎你提出任何的回饋、修正、或是建議，請將它們寄到
<url url="mailto:ejg3@cornell.edu" name="ejg3@cornell.edu">。

<sect1>Copyright.
<P>
此份文件的版權屬於 Eric Green，這份文件可以在 LDP 的執照下散佈。

</article>

