Glibc 2 HOGYAN Eric Green, ejg3@cornell.edu v1.6, 1998. június 22. _________________________________________________________________ A glibc 2 HOGYAN leírja, hogyan telepítsd és használd a GNU C programkönytár 2-es verzióját (libc 6) a Linux operációs rendszeren. _________________________________________________________________ 1. Bevezetés 1.1 Amit a glibc 2-ről tudni kell A Glibc 2 a GNU C programkönyvtár legújabb változata. Jelenleg módosítás nélkül fut GNU Hurd rendszereken és a Linux i386, mk68k és alpha rendszereken. A 2.1-es verzió támogatni fogja a Linux PowerPc-t valamint a MIPS, Sparc, Sparc-64 és Arm platformokat. A könyvtár a jövőben más architektúrákat és operációs rendszereket is támogatni fog. A Linux rendszereken a glibc 2, a 6-os verziószámú libc-vel egyezik meg, amely a libc 5 utódja. A Linuxos libc fejlesztői a libc 6-al fel akarjak váltani a libc 5-öt. A 2.0.6-os verziótól kezdve, a libc megbízhatónak tekinthető. A 2.1-es változat, amely hamarosan napvilágot lát, készen áll majd a széleskörű felhasználásra, és további platformokat is fog támogatni. Három opcionális kiegészítő létezik a glibc 2-höz: Crypt Az UFC-crypt csomag. Ezt a csomagot nem integrálták a glibc-be, az exporttilalmak miatt. LinuxThreads A Posix 1003.1c "pthread" interfész egy implemetációja. Locale data Ez tartalmazza a locale adatfájlok előállításához szükséges adatokat, ezekre akkor van szükség, ha használni akarod a glibc nemzetközi lehetőségeit. A crypt és LinuxThreads kiegészítő csomagok erősen ajánlottak... Ha nem használod őket, inkompatibilitási problémák léphetnek fel más rendszerek különböző könyvtáraival. (Ha ezek után mégsem akarod használni őket, meg kell adjad a --disable-sanity-checks opciót a configure szkript futtatásánál.) 1.2 Erről a dokumentumról Ez a HOGYAN arról szól, hogyan telepítsd a glibc 2 könyvtárat egy meglévő Linux rendszerre. A leírás abból indul ki, hogy libc 5-ot használsz i386-os architektúrán, de más rendszerek és könyvtárak (pl. glibc1) felhasználói is hasznát vehetik, csak le kell cseréljék a megfelelő fájl- és architektúra-neveket a szituációnak megfelelően. Eme HOGYAN legfrissebb változatát megtalálod a [1]Linux Documentation Project részeként vagy a következő kiszolgálón: [2]http://www.imaxx.net/~thrytis/glibc/Glibc2-HOWTO.html. 1.3 Mi változott a közelmúltban? Különbségek a dokumentum 1.6-os és 1.5-os változatai között: * Kijavítottam a bináris glibc csomag telepítésére vonatkozó utasításokat. Különbségek a dokumentum 1.5-os és 1.4-es változatai között: * Indexelés hozzáadása, köszönet Ed Bailey-nek. * Megváltoztattam az e-mail címemet. 2. Telepítési módszer kiválasztása A glibc-t többféleképpen telepítheted. Feltelepítheted tesztelés céljára, ebben az esetben a régi könyvtárakat használod továbbra is alapértelmezésben, de ha fordítasz egy programot, megadhatod, hogy az használja a teszt könyvtárat. Ha ezt a telepítési módszert választod, később könnyen eltávolíthatod a glibc-t a gépedről (persze a hozzá kapcsolódó programok nem fognak működni). Ha ilyen módon tesztelni akarod a glibc-t, forrásból kell fordítsad, mert nem készült tesztelési célból bináris csomag (pl. rpm). Erről a megoldásról a [3]Telepítés teszt könyvtárként fejezetben olvashatsz. Ezzel ellentétben, telepítheted a glibc-t elsődleges programkönyvtárként is. Ilyenkor minden új program, amit a gépen fordítasz, alapértelmezésben a glibc-t fogja használni, kivétel persze, ha fordításkor a régi könyvtárat adod meg. Fordíthatod a könyvtárat magad, vagy feltelepítheted bináris csomagból is. Ha változtatni akarsz a glibc beállításain, az optimalizálással akarsz variálni, vagy olyan kiegészítőt akarsz használni, ami a bináris csomagban nincsen benne, le kell töltened a forráskódot, és le kell fordítanod a könyvtárat. Ez esetben a telepítési útmutatót megtalálod a [4]Telepítés elsődleges C könyvtárként fejezetben. Frodo Looijaard leír egy harmadik telepítési módszert. Az ő módszerének lényege, hogy a glibc-t másodlagos könyvtárként telepíted, és beállítasz egy keresztfordítót (cross compiler), ami a glibc-t használja. Ez a telepítési módszer kicsit bonyolultabb, mint a tesztkönyvtárként telepítés, de utána egyszerűbb olyan programokat fordítani, amik a glibc-t használják. Ennek a módszernek a leírását a [5]A glibc-2 telepítése Linuxra című dokumentumba találod. Ha 1.3-as Debiant használsz, és nem akarod a glibc miatt az "unstable" változatot használni, olvasd el a [6]Debian libc5 to libc6 Mini-HOWTO-t, ez leírja, hogyan frissítsd Debian csomagokkal rendszeredet. Ha a glibc 2-t egy fontos gépre telepíted, valószínűleg a teszt telepítés a jobb választás. Még ha a glibc-ben nincsenek is hibák, egyes programokat esetleg módosítani kell, hogy le tudd fordítani őket, mert változhatnak a könyvtárban a függvények prototípusai és típusai. 3. A könyvtár beszerzése A glibc 2 négy csomagból áll: a glibc csomagból és a három kiegészítő csomagból, ezek: LinuxThreads, Locale és Crypt. A forrásokat letöltheted a következő helyekről: * [7]ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.6.tar.gz * [8]ftp://prep.ai.mit.edu/pub/gnu/glibc-linuxthreads-2.0.6.tar.gz * [9]ftp://prep.ai.mit.edu/pub/gnu/glibc-localedata-2.0.6.tar.gz * [10]ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.6.tar.gz A teljes glibc fordításához és telepítéséhez kb. 150 MB lemezterületre lesz szükséged. Ha bináris csomagból telepíted az alap glibc-t, akkor kb. 50MB-al kell számolnod. A 2.0.6-os változatból nincsenek bináris csomgok. A 2.0.4-es verzió bináris csomagjai i386-os és m68k architektúrákra, valamint a 2.0.1-es változat alphára megtalálható itt: * Intel x86: + [11]ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.4.bin.i386.tar.gz + [12]ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.4.bin.i386. tar.gz * Alpha: + [13]ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.1.bin.alpha-linux .tar.gz + [14]ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.1.bin.alpha -linux.tar.gz * m68k: + [15]ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.4-m68k-linux.bin. tar.gz + [16]ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.4-m68k-linu x.bin.tar.gz A Crypt kiegészítő csomagra exportkorlátozások vannak érvényben. Az Egyesült Államokon kívül élő felhasználók ezt a csomagot a [17]ftp://ftp.ifi.uio.no/pub/gnu kiszolgálóról szerezhetik be. Ha Red Hat összeállítást használsz, letöltheted a 2-es glibc-t rpm csomagokban a Red Hat ftp kiszolgálójáról: [18]ftp://ftp.redhat.com/pub/redhat/. A Red Hat a glibc 2 könyvtárat használja elsődleges C könyvtárként az összeállítás 5.0-as verziója óta. Ha Debiant használsz, letöltheted a 2-es glibc-t deb csomagokban a Debiantól [19]ftp://ftp.debian.org/debian/dists/unstable/main/. A fájlokat libc6-nak hívják. A glibc 2 része a Debian hamm verziójának, elsődleges C könyvtár lesz a Debian 2.0 megjelenésétől. 4. Telepítés teszt könyvtárként Ez a rész azt írja le, a glibc 2 telepítését teszt könyvtárként. Ha bármilyen programot fordítasz, azt a fordító a régi glibc-vel szerkeszti össze, hacsak nem adod meg külön, hogy a teszt könyvtárat szeretnéd használni. Fordításkor az elérési útvonalak belekerülnek néhány fájlba, ezért valószínűleg forrásból kell telepítsd a könyvtárat. 4.1 Fordítás és telepítés Telepítési követelmények * Kb. 150 MB üres lemezterület * GNU make 3.75 * gcc >= 2.7.2 (még jobb, ha 2.7.2.1) * binutils 2.8.1 (alphához egy snapshot-ra van szükség) * bash 2.0 * autoconf 2.12 (ha megváltoztatod a configure.in fájlt) * texinfo 3.11 Egy i586@133 gépen 64 MB RAM-mal, kb. 3 órába telik, amíg elkészül a teljes könyvtár a kiegészítőkkel. Egy erősen leterhelt i686@200 gépen ugyanez kb. fél órába kerül. A forrás kicsomagolása Ahhoz, hogy le tudd fordítani a forrást, ki kell csomagolnod. Ezt legkönnyebben a következő módon teheted meg: 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 Ez a glibc-2.0.6 könyvtárba csomagolja ki a linuxthreads, crypt és locale kiegészítőket, ahol a configure megtalálja őket. Beállítás A glibc-2.0.6 könyvtárba hozzál létre egy compile nevű könyvtárat, majd lépj bele. Mindent ebben a könyvtárban fogsz csinálni, ez egyszerűsíti a takarítást. (A fejlesztők eddig nem törték magukat, hogy a 'make clean' tökéletesen működjön.) mkdir compile cd compile Futtasd le a ../configure szkriptet. Ha kiegészítő csomagokat is akarsz használni, meg kell adnod a --enable-add-ons kapcsolót, pl.: --enable-add-ons=linuxthreads,crypt,localedata. Ki kell válaszd a célkönyvtárat, ahova a könyvtárat telepíteni fogod. Erre a /usr/i486-linuxglibc2 egy jó választás. Ehhez a configure paraméterei a következők: ../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr/i486 -linuxglibc2 Fordítás és telepítés A fordításhoz és ellenőrzéshez írd be a következőket: make make check Ha a 'make check' sikeresen lefutott, telepítsd a könyvtárat root felhasználóként (még mindig a compile könyvtárból): make install 4.2 A dinamikus betöltő (dynamic loader) frissítése 1. Hozzál létre egy kötést, ami az új ld.so -ról a /lib/ld-linux.so.2 -ra mutat: ln -s /usr/i486-linuxglibc2/lib/ld-linux.so.2 /lib/ld-linux.so.2 Ez az egyetlen könyvtár, amelynek rögzített a helye, miután egy programhoz hozzá lett kapcsolva. Ha a /lib könyvtárban létrehozol egy kapcsot (link) hozzá, akkor később könnyebb lesz áttérni a glibc-re, mint elsődleges C könyvtárra, amikor megjelenik a stabil verziója. 2. Szerkeszd a /etc/ld.so.conf fájlt. A fájl végére be kell írnod a lib könyvtár elérési útvonalát, amiben az új programkönyvtárak vannak. Valahogy így fog kinézni: /lib, tehát pl. /usr/i486-linuxglibc2/lib a fenti esetben. A /etc/ld.so.conf fájl elmentése után futtasd le a következő parancsot: ldconfig -v 4.3 Beállítás a gcc fordítóhoz A telepítés utolsó lépése a /usr/lib/gcc-lib frissítéséből áll. Ez azért szükséges, hogy a gcc tudja használni az új programkönyvtárakat. Első körben duplikálni kell a gcc-t. Hogy megtudd melyik az éppen működő ggc konfiguráció, használd a gcc -v kapcsolóját: % gcc -v Reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs gcc version 2.7.2.2 Ebben az esetben az i486-unknown-linux a rendszer típusa, és a 2.7.2.2 a gcc verziószáma. Át kell másolnod a /usr/lib/gcc-lib/ könyvtárat az új tesztrendszer könyvtárába: cd /usr/lib/gcc-lib/ cp -r i486-unknown-linux i486-linuxglibc2 Lépj be az új tesztrendszer könyvtárába, majd a verziószámmal jelölt könyvtárba, cd /usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2 ezek után módosítsd a specs fájlt, ami ebben a könyvtárban található. Írd át a /lib/ld-linux.so.1 szöveget /lib/ld-linux.so.2-re. Ha ez megvan, törölj ki minden %{...:-lgmon} fájlra mutató hivatkozást, mert a glibc nem használja a gmon könyvtárat. Találsz egy példa spec fájlt a [20]Példa specs fájl fejezetben. 4.4 A fejlécfájlokra mutató kapcsok frissítése Kapcsokat (link) kell létrehoznod az új include könyvtárban, amik egyéb include könyvtárakra mutatnak: 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 Előfordulhat, hogy vannak más programkönyvtáraid, mint pl. az ncurses, ezeknek a fejlécfájlait is ebbe a könyvtárba kell helyezned. Ezeket a fájlokat át kell másolnod vagy kapcsoznod (link) a /usr/include könyvtárból. (Lehetnek olyan programkönyvtárak is, amiket újra kell fordítanod, hogy a glibc2-vel működni tudjanak. Ebben az esetben egyszerűen fordítsd le őket, és a telepítésnél add meg a /usr/i486-linuxglibc2 könyvtárat.) 4.5 A telepített programkönyvtár tesztelése A programkönyvtár teszteléséhez, hozz létre egy glibc.c fájlba következőkkel: #include main() { printf("hello world!\n"); } Fordítsd le a következő opciókkal: "-b -nostdinc -I/include -I/usr/lib/gcc-lib///include": % 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 Az ldd parancs segítségével ellenőrizd, hogy a fordító tényleg a glibc2-vel szerkesztette-e össze a programocskát és nem a régi libc-vel: % ldd glibc libc.so.6 => /usr/i486-linuxglibc2/lib/libc-2.0.6.so (0x4000d000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) Ha a programot le tudtad fordítani, a gcc az új glibc2-höz szerkesztette és amikor elindítod, azt írja ki, hogy "hello world!", a telepítés sikeres volt. 5. Telepítés elsődleges C könyvtárként Ez a rész arról szól, hogy hogyan telepítsd a glibc 2-t elsődleges C könyvtárként. Ezek után minden program amit a rendszereden fordítasz az új C programkönyvtárat fogja használni, hacsak nem beszéled le erről speciális fordító kapcsolók segítségével. Ha RedHat vagy Debian Linuxot használsz és letöltötted a megfelelő rpm vagy deb csomagokat, átugorhatod ezt a részt, nézd meg a RedHat vagy Debian telepítési útmutatót. 5.1 A könyvtár fordítása forráskódból Ez a rész leírja, hogy hogyan fordítsd le a glibc 2-t és a kiegészítőit a forrásból. Akkor kell fordítanod a glibc-t, ha változtatni akarsz az alapbeállításain vagy az optimalizáláson, vagy olyan kiegészítőt akarsz használni, amihez nincsen bináris csomag. Telepítési követelmények * Kb. 150 MB üres hely a lemezen * GNU make 3.75 * gcc >= 2.7.2 (még jobb, ha 2.7.2.1) * binutils 2.8.1 (az alphához kell egy snapshot) * bash 2.0 * autoconf 2.12 (ha megváltoztatod a configure.in fájlt) * texinfo 3.11 Egy i586@133 gépen 64 MB RAM-mal, kb. 3 órába telik, amíg elkészül a teljes könyvtár a kiegészítőkkel. Egy erősen leterhelt i686@200 gépen ugyanez kb. fél órába kerül. A forrás kicsomagolása Ahhoz, hogy le tudd fordítani a forrást, ki kell csomagolnod. Erre a legjobb megoldás a következő: 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 Ez a glibc-2.0.6 könyvtárba csomagolja ki a linuxthreads, crypt és locale kiegészítőket, ahol a configure megtalálja őket. Beállítás A glibc-2.0.6 könyvtárba hozzál létre egy compile nevű könyvtárat majd lépj bele. Mindent ebben a könyvtárban fogsz csinálni, ez egyszerűsíti a takarítást. (A fejlesztők eddig nem törték magukat, hogy a 'make clean' tökéletesen működjön.) mkdir compile cd compile Futtasd le a ../configure szkriptet. Ha kiegészítő csomagokat is akarsz használni, meg kell adnod az --enable-add-ons kapcsolót, pl.: --enable-add-on\s=linuxthreads,crypt,localedata. Valószínűleg meg akarod adni a célkönyvtárat is, ahova a glibc-t telepíteni akarod. Mivel a szabványos Linux disztribúcióhoz akarsz igazodni, add meg a --prefix=/usr kapcsolót. (Ha egy Linux rendszeren az /usr könyvtárat adod meg, a configure magától be tud állítani egyéb fontos elérési útvonalakat, ahova a libc.so és egyéb más fontos a /lib-ben lévő könyvtárakat kell tenni. A configure parancssora valahogy így fog kinézni: ../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr Fordítás A fordításhoz és ellenőrzéshez írd be a következőket: make make check 5.2 Felkészülés a telepítésre Akár fordítod a glibc-t, akár bináris csomagokból rakod fel, néhány fájlt át kell helyezned, mert bár minden újonnan fordított program az új glibc-t fogja használni, a régi (nem statikusan linkelt) programoknak szükségük van a régi programkönyvtárra (libc5), ezért azt nem írhatod egyszerűen felül. 1. Hozz létre egy új könyvtárat a régi fájloknak: mkdir -p /usr/i486-linuxlibc5/lib 2. A régi fejléc fájlokat ki kell helyezni a /usr/include könyvtárból: mv /usr/include /usr/i486-linuxlibc5/include 3. Csinálj egy új include könyvtárat és hozd létre a szükséges, más include könyvtárakra mutató kapcsokat: 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++ Ezek a kapcsok lehet, hogy kicsit eltérnek a megadottól, mert az include könyvtárak helye összeállítástól függő. Legalább is a Slackware Linuxokon a g++ fejléc fájlok a /usr/local/g++-include könyvtárban vannak, míg a Debian alatt a /usr/include/g++ könyvtárban találhatók és a /usr/lib/g++-include kapocs a /usr/include/g++-ra mutat. Az utóbbi esetben valószínűleg szerencsésebb az eredeti g++ include könyvtárat visszahelyezni a /usr/include könyvtárba. 4. Állíts vissza minden plusz fejléc fájlt és kapcsot, ami esetleg az eredeti /usr/include könyvtárban volt. Egyes szabványtalan programkönyvtárak, mint pl. az ncurses fájlokat raknak be a /usr/include könyvtárba, vagy kapcsokat hoznak ott létre, melyek az adott programkönyvtár include könyvtárára mutatnak. Ezeket a fájlokat és kapcsokat vissza kell állítanod, hogy továbbra is használni tudd a kérdéses programkönyvtárakat. 5. Add hozzá az új programkönyvtár könyvtárát (pl. /usr/i486-linuxlibc5/lib) az /etc/ld.so.conf fájl elejéhez. Legalább az 1.8.8-as verziójú ld.so-ra van szükséged, különben bizarr hibaüzenetekkel találod magad szembe a glibc telepítése után. 6. Helyezd át az összes régi C programkönyvtárat az új könyvtárba. 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 A libm.so.5 és libc.so.5 fájlokat másolni kell és nem áthelyezni, ha a /usr nem a / partíción van, mert ezekre a programkönyvtárakra a Linuxnak induláskor szüksége van, ezért a / köteten kell legyenek. 7. Helyezd át az /usr/lib/*.o fájlokat az új könyvtárba. 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. Frissítsd a programkönyvtár gyorsítótárát, miután átrendezted a programkönyvtárakat. ldconfig -v 5.3 Telepítés bináris csomagból Ha előre fordított bináris csomagokból telepíted a glibc-t, először ellenőrizd a csomagok tartalmát: tar -tzvf glibc-2.0.bin.i386.tar.gz tar -tzvf glibc-crypt-2.0.bin.i386.tar.gz Ha elégedett vagy az eredménnyel, telepítheted a glibc-t: cd / tar -xzf glibc-2.0.bin.i386.tar.gz tar -xzf glibc-crypt-2.0.bin.i386.tar.gz ldconfig -v Ha más architektúrát vagy verziót használsz, értelemszerűen helyettesítsd a fájlneveket. A glibc legújabb verziója általában nincs meg bináris csomagban, viszont a legújabb verzió használata mindig javasolt, a hibajavítások miatt. Ha nem tudod a glibc-t lefordítani a saját gépeden, tölts le egy bináris programkönyvtárat tartalmazó csomagot egy olyan disztribúcióból, ami a glibc-t használja (pl. RedHat) és telepítsd azt. 5.4 Telepítés forráskódból A programkönyvtár forráskódból való telepítéséhez, add ki root felhasználóként a compile/ könyvtárból a következő utasításokat: make install ldconfig -v 5.5 A gcc specs fájljának frissítése A telepítés utolsó lépéseként (mind a bináris csomagok, mind a forráskódból való telepítés esetén) frissíteni kell a gcc specs fájlját, hogy a fordító az új glibc-vel szerkessze össze a későbbiekben fordított programokat. Hogy meghatározd, a gcc melyik specs fájl használja, add ki a következő parancsot: % gcc -v reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs gcc version 2.7.2.2 Ebben az esetben a i486-unknown-linux írja le a rendszert és a 2.7.2.2 a verziót. Át kell másolnod a /usr/lib/gcc-lib/ könyvtárat a régi rendszer könyvtárba: cd /usr/lib/gcc-lib/ cp -r i486-unknown-linux i486-linuxlibc5 Lépjél be az eredeti könyvtáraba, majd a verziószám által jelölt könyvtárba: cd /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2 Ezek után módosítsd a specs fájlt, ami ebben a könyvtárban található. Írd át a /lib/ld-linux.so.1 szöveget /lib/ld-linux.so.2-re. Ha ez megvan, törölj ki minden %{...:-lgmon} fájlra mutató hivatkozást, mert a glibc nem használja a gmon könyvtárat. Találsz egy példa spec fájlt a [21]Példa specs fájl fejezetben. 5.6 A feltelepített programkönyvtár tesztelése A programkönyvtár ellenőrzéséhez, hozz létre egy glibc.c nevű fájlt a következő tartalommal: #include main() { printf("hello world!\n"); } Fordítsd le a programot. % gcc glibc.c -o glibc Az ldd programmal ellenőrizd, hogy a fordító tényleg az új programkönyvtárat használja: % ldd glibc libc.so.6 => /lib/libc.so.6 (0x4000e000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) Ha a programot sikerül lefordítani, és futása eredményeként kiírja, hogy "hello world!" a telepítés sikerült. 6. Fordítás a nem elsődleges libc-vel Vannak olyan alkalmak, amikor nem az elsődleges programkönyvtárat szeretnéd használni fordításkor. Ez a rész azt írja le, hogy ezt hogyan teheted meg. A felhasznált könyvtár- és fájlnevek megegyeznek az előző részben használtakkal. Ne felejtsd el megváltoztatni ezeket a neveket a telepítésednek megfelelően. 6.1 Figyelmeztetés, ha nem elsődleges C programkönyvtárat használsz Mielőtt bármilyen olyan programot fordítanál, amit a Linux a rendszer indulásakor használ (a nem root partíciók felcsatolása előtt), ne felejtsd el, hogy ha a program dinamikusan linkelt, szüksége van a programkönyvtárakra a root partíción. Ha megfigyelted az előző részben leírt telepítést, hiába a glibc az új C programkönyvtár, a régi libc is megmaradt a /lib könyvtárban, ami a root partíción van. Ez azt jelenti, hogy a régi libc-vel összeszerkesztett programok továbbra is használhatók az indulási folyamat során. Ha viszont a /usr nem a root partíción van és a glibc-t teszt könyvtárként telepíted a /usr/i486-linuxglibc2 könyvtárba, minden új, a teszt könyvtárral fordított program működésképtelen lesz, amíg nincs felcsatolva a /usr könyvtárat tartalmazó partíció. 6.2 Programok fordítása teszt glibc-vel Ahhoz, hogy egy programot a teszt glibc könyvtárral fordíts, be kell állítanod az include könyvtárak és fájlok elérési útvonalait úgy, hogy azok a teszt glibc könyvtárban lévő include fájlokra mutassanak. Ha a parancssoron megadod a "-nostdinc" kapcsolót, az törli a hivatkozásokat az alapértelmezett include elérési útvonalakat, a "-I/usr/i486-linuxglibc2/include" pedig megadja a glibc include fájlok helyét. Meg kell még add a gcc include fájljait, amelyek a /usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include könyvtárban találhatók (akkor, ha 2.7.2.2-es gcc-t használsz és a teszt programkönyvtárat az i486-linuxglibc2 könyvtárba telepítetted). Meg kell add ezeken kívül a gcc beállításait. Ezt megteheted a "-b i486-linuxglibc2" kapcsolóval. A legtöbb programnál megadhatod ezeket a kapcsolókat a makefile $CFLAGS és $LDFLAGS opcióinál: 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 Ha configure szkriptet használsz a fordítás előtt, állítsd be a $CFLAGS és $LDFLAGS környezeti változókat (csh/tcsh-ban használd az env/setenv parancsokat, sh/bash-ban használd a set/export-ot ) a configure futtatása előtt. Az így generált makefile fájlokban szerepelnie kell a megfelelő $CFLAGS és $LDFLAGS beállításoknak. Nem minden configure szkript olvassa ki a parancsértelmező környezetéből a változókat, ezért ellenőrizni kell a makefile-t, és kézzel javítani szükség esetén. Ha a fordítandó program csak a gcc-t hívja meg (és nem egyenesen a cpp-t vagy a binutils-t), használhatod a következő szkriptet a kapcsolók megadására: #!/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 "$@" Használd ezt a szkriptet fordításnál a "gcc" helyett. 6.3 Programok fordítása libc 5-el, ha a glibc az elsődleges programkönyvtár Ha a régi libc könyvtárral akarsz programot fordítani és a glibc-t elsődleges könyvtárként telepítetted, vissza kell állítsad az include fájlok elérési útvonalát a régi include fájlokéra. Meg kell add a "-nostdinc" kapcsolót, ez törli az alapértelmezett beállításokat, majd a "-I/usr/i486-linuxlibc5/include" kapcsolóval be kell állítanod a libc5 include fájljainak az elérési útvonalát. Meg kell még adnod a "-I/usr/lib/gcc-lib/i486-linuxlibc5/2.7.2.2/include" kapcsolót, amely a gcc specifikus include fájlok helyét adja meg. Ne felejtsd el, az itt megadott könyvtárneveket a saját rendszerednek megfelelően megváltoztatni (könyvtárnevek és gcc verzió). Végül meg kell add a gcc beállításait, a "-b i486-linuxlibc5" kapcsolóval. A legtöbb programnál megadhatod ezeket a kapcsolókat a makefile $CFLAGS és $LDFLAGS opcióinál: 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 Ha configure szkriptet használsz a fordítás előtt, állítsd be a $CFLAGS és $LDFLAGS környezeti változókat (csh/tcsh-ban használd az env/setenv parancsokat, sh/bash-ban használd a set/export-ot ) a configure futtatása előtt. Az így generált makefile fájlokban szerepelnie kell a megfelelő $CFLAGS és $LDFLAGS beállításoknak. Nem minden configure szkript olvassa ki a parancsértelmező környezetéből a változókat, ezért ellenőrizni kell a makefile-t, és kézzel javítani szükség esetén. Ha a fordítandó program csak a gcc-t hívja meg (és nem egyenesen a cpp-t vagy a binutils-t), használhatod a következő szkriptet a kapcsolók megadására: #!/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 "$@" Használd ezt a szkriptet fordításnál a "gcc" helyett. 7. C++ programok fordítása A libg++ használja a matematikai programkönyvtárat, tehát a libm könyvtárhoz van kapcsolva. Mivel a meglévő libg++ könyvtárad a régi C programkönyvtárat használja, újra kell fordítanod a glibc-vel, vagy telepítened kell egy bináris könyvtárat (amit glibc-vel fordítottak). A libg++ legfrissebb változatát (forráskódot vagy bináris csomagot x86-os architektúrához) letöltheted a [22]ftp://ftp.yggdrasil.com/private/hjl/ ftp helyről. 7.1 A libg++ telepítése teszt glibc könyvtárral Ha teszt könyvtárként telepítetted a glibc-t, abba a könyvtárba kell telepítened a fájlokat, amelyikben a glibc található (pl. /usr/i486-linuxglibc2, az előző fejezetekben leírt példák alapján). Ha bináris csomagból telepíted a libg++ könyvtárat (amit forrón ajánlok, mert még sohasem volt szerencsém így libg++ könyvtárat fordítani), csomagold ki a fájlokat egy átmeneti könyvtárba, majd helyezd át a usr/lib/ könyvtárban lévő fájlokat az /lib/ könyvtárba, a usr/include/-ban lévő fájlokat a /include/ könyvtárba (ne felejtsd el először törölni az include/g++ kapcsot!) és a usr/bin/-ben lévő fájlokat az /bin/ könyvtárba. 7.2 A libg++ telepítése elsődleges glibc könyvtár esetén Ha a glibc-t elsődleges könyvtárként telepítetted, először át kell helyezned a régi libg++ fájljaidat a régi libc könyvtárba, abban az esetben ha ezen túl is akarsz fordítani g++ programokat a régi libc-vel. valószínűleg ennek az a legegyszerűbb módja, hogy telepítesz egy libc5-el fordított új libg++, mint az előző fejezetben és utána feltelepíted a glibc-t normálisan. 7.3 C++ programok fordítása a nem elsődleges libc könyvtárral Ha C++ programokat szeretnél nem elsődleges libc-vel fordítani, meg kell add a g++ include könyvtárat, ami a fenti példák esetén /usr/i486-linuxglibc2/include/g++ lenne teszt glibc konfiguráció esetén vagy /usr/i486-linuxlibc5/include/g++ elsődleges glibc konfiguráció esetén. Ezt általában el lehet érni a $CXXFLAGS változó módosításával: 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 8. Problémák A glibc csomagban található egy GYIK (FAQ), amiben további információt és megoldásokat találhatsz a problémákra. A GYIK-nek van egy hálózaton elérhető változata is: [23]http://www.imaxx.net/~thrytis/glibc/glibc-FAQ.html. Most kiemelnék néhány problémát, amikről a GYIK-ben nincs (vagy nem elég részletesen van) szó. 8.1 Nem működik a gépnevek feloldása A glibc 2 más módszert használ a gépnevek feloldására, mint a libc5. A glibc "name server switch" (NSS) kódrésze keresi a /etc/nsswitch.conf fájlt. Ha nem működik a gépnév feloldás, amikor glibc 2 könyvtárat használó alkalmazásokat futtatsz, és a /etc/resolv.conf fájlod megvan, és tartalmazza a szükséges információkat, nézd meg, hogy van-e /etc/nsswitch.conf fájlod. Ha nincs ilyen nevű fájl, akkor hozz létre egyet, a következő tartalommal: hosts: files dns Ezzel beállítottad, hogy a névkiszolgálókra vonatkozó információk a /etc/resolv.conf fájlban vannak. Ha további részletek is érdekelnek, olvasd el a libc info lapját, amiben részletesen le van írva a nsswitch.conf fájl felépítése. 9. Hibák bejelentése Ha úgy gondolod, hogy hiba van a programkönyvtárban, olvasd el először a GYIK-et. Nem kizárt, hogy másnak esetleg ugyanaz a problémája volt, mint Neked, és van egyszerű megoldás. Ellenőrizd még a glibc csomagjában található INSTALL fájl "Recommended Tools to Install the GNU C Library" részét, mert a problémád adódhat más program hibájából is, nem feltétlenül a glibc működik rosszul. Ha hibát találtál, először győződj meg róla, hogy tényleg igazi hibáról van szó. Ennek ellenőrzésére egy jó módszer, ha összehasonlítod a GNU C programkönyvtár és valamilyen másik C programkönyvtár viselkedését. Ha ugyanaz az eredmény mind a két programkönyvtárral, akkor valószínűleg nem hibáról van szó (bár nem 100%). Ha a két könyvtár viselkedése nem egyezik meg, akkor valószínű, hogy hibát találtál. Ezek után nézd meg a [24]http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl címen elérhető hibákat tartalmazó adatbázist (bug database). Lehet, hogy valaki már előtted bejelentette a hibát. Érdemes megnézni a glibc csomagban található BUGS fájlt, amiben szintén az ismert hibák listája található. Ha már biztos vagy benne, hogy új hibát találtál, próbáld megállapítani a lehető legpontosabban, egy nagyon egyszerű tesztprogrammal, hogy mi okozza a hibát. A C program könyvtár esetében ez azt jelenti, hogy meg kell állapítanod, hogy melyik függvényhívás idézi elő. Ez nem túl nehéz feladat. A legutolsó lépés, amikor megvan az egyszerű kis tesztprogram, a hiba bejelentése. A hiba bejelentésénél, küldd el a tesztprogramot, az eredményeket amiket kaptál, az eredményeket amiket vártál, esetleg arról valamit, hogy szerinted mi lehet a gond (ha van valami ötleted), a rendszer típusát, a GNU C programkönyvtár verzióját, a gcc fordító verzióját és a GNU Binutils verzióját. Mellékeld még a config.status és config.make fájlokat, ezeket abban a könyvtárban találod, ahonnan a configure szkriptet futtattad. Minden a GNU C könyvtárral kapcsolatos hibabejelentést a glibcbug shell szkipt segítségével kell elküldeni a [25]bugs@gnu.org címre (működik még a régi [26]bugs@gnu.ai.mit.edu cím is), vagy a GNATS webes interfészén keresztül a [27]http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl honlapon. Javaslatokat és kérdéseket a [28]bugs-glibc@prep.ai.mit.edu levelezőlistára lehet küldeni. Ha nem olvasod a gnu.bug.glibc hírcsoportot, feliratkozhatsz a listára a [29]bug-glibc-request@prep.ai.mit.edu honlapon. Kérlek NE küldjél GNU C könyvtárral kapcsolatos hibabejelentést a címre. Ez a lista a GNU CC hibáival foglalkozik. A GNU CC és a GNU C könyvtár két külön dolog, különböző emberek tartják karban. 10. Példa specs fájl Ide beszúrtam egy specs fájlt, amit a gcc használ a glibc 2-vel fordításnál és linkelésnél. A fájl a /usr/lib/gcc-lib// könyvtárban található. Ha x86-os rendszered van, valószínűleg bemásolhatod a fájlba ezt a részt egy az egyben. *asm: %{V} %{v:%{!V:-V}} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} *asm_final: %{pipe:-} *cpp: %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__} %{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT} *cc1: %{profile:-p} *cc1plus: *endfile: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s *link: -m elf_i386 %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-lin ux.so.2}} %{static:-static}}} *lib: %{!shared: %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} *libgcc: -lgcc *startfile: %{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{ !p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS .o%s} *switches_need_spaces: *signed_char: %{funsigned-char:-D__CHAR_UNSIGNED__} *predefines: -D__ELF__ -Dunix -Di386 -Dlinux -Asystem(unix) -Asystem(posix) -Acpu(i386) -Am achine(i386) *cross_compile: 0 *multilib: . ; 11. Egyéb 11.1 További információ Web lapok * [30]Az FSF GNU C Programkönyvtár Weblapja * [31]GNU Libc 2 használata Linuxszal * [32]Glibc-2 telepítése Linuxra. * [33]Debian libc5-ről libc6-ra Mini-HOWTO. Hírcsoportok * [34]comp.os.linux.development.system * [35]comp.os.linux.development.apps * [36]linux.dev.kernel * [37]gnu.bugs.glibc Levelezőlisták Glibc 2 Linux fórum. Ez a lista olyan Linux felhasználók vitafóruma, akik feltelepítették a glibc2-t, az új GNU C programkönyvtárat. A témák: kompatibilitással összefüggő kérdések, programok fordítása során felmerülő problémák (Linux/glibc környezetben). A feliratkozáshoz küldj egy levelet a [38]Majordomo@ricardo.ecn.wfu.edu címre, a levél törzsében legyen:"subscribe glibc-linux ". A levelezőlista archívuma megtalálható a [39]http://www.progressive-comp.com/Lists/?l=linux-glibc&r=1&w= 2#linux-glibc címen. 11.2 Köszönet Ezen információ nagy részét a [40]GNU Libc honlapról loptam, valamint Ulrich Drepper glibc 2 bejelentéseiből és megjegyzéseiből. Andreas Jaeger-től származik a hibabejelentést leíró fejezet egy része. A következők voltak segítségemre e dokumentum összeállításában: * Allex * Mark Brown * Ulrich Drepper * Scott K. Ellis * Aron Griffis * Andreas Jaeger * Hank Leininger * Frodo Looijaard * Ryan McGuire * Shaya Potter * Les Schaffer * Andy Sewell * Gary Shea * Stephane * Jan Vandenbos * Michael Wolf Ezt a dokumentumot különböző nyelvekre fordítják: * Kínai: Allex * Francia: Olivier Tharan * Japán: Kazuyuki Okamoto * Magyar: Kovács Emese 11.3 Visszajelzés Ezen HOGYAN írásától, valamint a [41]glibc 2 for Linux honlap karbantartásától eltekintve semmi közöm sincs a glibc projekthez. Távol állok attól, hogy mindent tudjak a témakörről, ennek ellenére szívesen megpróbálok segíteni, ha gondjaid támadnak. Szívesen látok minden visszajelzést, javítást vagy kiegészítést a [42]ejg3@cornell.edu címen. 11.4 Szerzői jogok Copyright © Eric Green, 1997. Ez a dokumentum továbbadható az LDP licencében rögzített feltételek mellett. 11.5 Magyar fordítás A magyar fordítást [43]Kovács Emese készítette (1999). A lektorálást [44]Daczi László végezte el (2002.12.28). Bármilyen fordítással kapcsolatos észrevételt a [45]linuxhowto@sch.bme.hu címre küldjetek. Eme dokumentum legfrissebb változata megtalálható a [46]Magyar Linux Dokumentációs Projekt honlapján. References 1. http://sunsite.unc.edu/LDP 2. http://www.imaxx.net/~thrytis/glibc/Glibc2-HOWTO.html 3. file://localhost/home/dacas/temp/Glibc2-HOWTO-hu.html#test-install 4. file://localhost/home/dacas/temp/Glibc2-HOWTO-hu.html#primary-install 5. http://huizen.dds.nl/~frodol/glibc/ 6. http://www.gate.net/~storm/FAQ/libc5-libc6-Mini-HOWTO.html 7. ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.6.tar.gz 8. ftp://prep.ai.mit.edu/pub/gnu/glibc-linuxthreads-2.0.6.tar.gz 9. ftp://prep.ai.mit.edu/pub/gnu/glibc-localedata-2.0.6.tar.gz 10. ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.6.tar.gz 11. ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.4.bin.i386.tar.gz 12. ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.4.bin.i386.tar.gz 13. ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.1.bin.alpha-linux.tar.gz 14. ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.1.bin.alpha-linux.tar.gz 15. ftp://prep.ai.mit.edu/pub/gnu/glibc-2.0.4-m68k-linux.bin.tar.gz 16. ftp://prep.ai.mit.edu/pub/gnu/glibc-crypt-2.0.4-m68k-linux.bin.tar.gz 17. ftp://ftp.ifi.uio.no/pub/gnu 18. ftp://ftp.redhat.com/pub/redhat/ 19. ftp://ftp.debian.org/debian/dists/unstable/main/ 20. file://localhost/home/dacas/temp/Glibc2-HOWTO-hu.html#specs 21. file://localhost/home/dacas/temp/Glibc2-HOWTO-hu.html#specs 22. ftp://ftp.yggdrasil.com/private/hjl/ 23. http://www.imaxx.net/~thrytis/glibc/glibc-FAQ.html 24. http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl 25. file://localhost/home/dacas/temp/bugs@gnu.org 26. file://localhost/home/dacas/temp/bugs@gnu.ai.mit.edu 27. http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl 28. file://localhost/home/dacas/temp/bugs-glibc@prep.ai.mit.edu 29. file://localhost/home/dacas/temp/bug-glibc-request@prep.ai.mit.edu 30. http://www.gnu.org/software/libc/libc.html 31. http://www.imaxx.net/~thrytis/glibc/ 32. http://huizen.dds.nl/~frodol/glibc/ 33. http://www.gate.net/~storm/FAQ/libc5-libc6-Mini-HOWTO.html 34. news:comp.os.linux.development.system 35. news:comp.os.linux.development.apps 36. news:linux.dev.kernel 37. news:gnu.bug.glibc 38. mailto:Majordomo@ricardo.ecn.wfu.edu 39. http://www.progressive-comp.com/Lists/?l=linux-glibc&r=1&w=2#linux-glibc 40. http://www.gnu.org/software/libc/libc.html 41. http://www.imaxx.net/~thrytis/glibc 42. mailto:ejg3@cornell.edu 43. mailto:emese@eik.bme.hu_NO_SPAM 44. mailto:dacas@freemail.hu_NO_SPAM 45. mailto:linuxhowto@sch.bme.hu_NO_SPAM 46. http://tldp.fsf.hu/index.html