Glibc 2 HOGYAN Eric Green, ejg3@cornell.edu v1.6, 1998. június 22. A glibc 2 HOGYAN leírja, hogy 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. ______________________________________________________________________ Tartalomjegyzék 1. Bevezetés 1.1 Amit a glibc 2-ről tudni kell 1.2 Erről a dokumentumról 1.3 Mi változott a közelmúltban? 2. Telepítési módszer kiválasztása 3. A könyvtár beszerzése 4. Telepítés teszt könyvtárként 4.1 Fordítás és telepítés 4.1.1 Előkövetelmények 4.1.2 A forrás kicsomagolása 4.1.3 Beállítások 4.1.4 Fordítás és telepítés 4.2 A "dynamic loader" frissítése 4.3 Beállítás a gcc-hez 4.4 A fejlécfájlokra mutató kapcsok frissítése 4.5 A feltelepített programkönyvtár tesztelése 5. Telepítés elsődleges C könyvtárként 5.1 A könyvtár fordítása forráskódból 5.1.1 Előkövetelmények 5.1.2 A forrás kicsomagolása 5.1.3 Beállítások 5.1.4 Fordítás 5.2 Felkészülés a telepítés előtt 5.3 Telepítés bináris csomagból 5.4 Telepítés forráskódból 5.5 A gcc specs fájljának frissítése 5.6 A feltelepített programkönyvtár tesztelése 6. Fordítás a nem elsődleges libc-vel 6.1 Figyelmeztetés, ha nem elsődleges C programkönyvtárat használsz 6.2 Programok fordítása teszt glibc-vel 6.3 Programok fordítása 5-ös libc-vel, ha a glibc az elsődleges programkönyvtár 7. C++ programok fordítása 7.1 A libg++ telepítése teszt glibc könyvtárral 7.2 A libg++ telepítése elsődleges glibc könyvtár esetén 7.3 C++ programok fordítása a nem elsődleges libc-vel 8. Problémák 8.1 Nem működik a gépnevek feloldása 9. Hibák bejelentése 10. Példa specs fájl 11. Egyéb 11.1 További információ (NIDXglibc!további információ)NIDX 11.1.1 Web lapok 11.1.2 Hírcsoportok 11.1.3 Levelező listák 11.2 Köszönet 11.3 Visszajelzés 11.4 Szerzői jogok ______________________________________________________________________ 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 Linux fejlesztők 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átozat, 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 a különböző könyvtárak között. (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, hogy 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. Ennek a HOGYAN-nak a legfrissebb változatát megtalálod a Linux Documentation Project részeként vagy a következő kiszolgálón: . 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 fel. 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 így tesztelni akarod, a glibc-t forrásból kell fordítsad, mert nincs ehhez a konfigurációhoz bináris csomag (pl. rpm). Erről a megoldásról a ``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íthetsz bináris csomagokat 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 ``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 teszt könyvtár telepítése, de utána egyszerűbb olyan programokat fordítani, amik a glibc-t használják. Ehhez a módszerhez a leírást egy külön dokumentumban találod: A glibc-2 telepítése Linux-ra . Ha 1.3-as Debian-t használsz, de nem akarod a glibc miatt az "unstable" változatot használni, olvasd el a Debian libc5 to libc6 Mini-HOWTO-t , ez leírja, hogyan frissítsd a rendszeredet Debian csomagok segítségével. 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 2-es glibc négy csomagból áll: a glibc csomagból és a három kiegészítő csomagból, név szerint LinuxThreads, Locale és Crypt. A forrásokat letöltheted a következő helyekről: · · · · 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áltozathoz 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: · · · Alpha: · · · m68k: · · 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 kiszolgálóról szerezhetik be. Ha Red Hat-et használsz, letöltheted a 2-es glibc-t rpm csomagokban a Red Hat ftp kiszolgálójáról: . A Red Hat a 2-es glibc-t használja elsődleges C könyvtárként a disztibúció 5.0-as verziója óta. Ha Debian-t használsz, letöltheted a 2-es glibc-t deb csomagokban a Debiantól . 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, hogy hogyan telepítsd a 2-es libc-t teszt könyvtárként. Ha bármilyen programot fordítasz, azt a fordító a régi libc-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 forrásból kell telepítsd a könyvtárat. 4.1. Fordítás és telepítés 4.1.1. Elő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-t) · 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 kihasznált i686@200-en ugyanez kb. fél órába kerül. 4.1.2. A forrás kicsomagolása Ahhoz, hogy le tudd fordítani a forrást, ki kell csomagolnod azt az archívból. 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. 4.1.3. Beállítások A glibc-2.0.6 könyvtárba hozzál létre egy compile nevű könyvtárat, majd lépjél bele. Mindent ebben a könytá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. /usr/i486-lin­ uxglibc2 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 4.1.4. 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 fel­ használóként (még mindig a compile könyvtárból): make install 4.2. A "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 pro­ gramhoz hozzá lett linkelve, és ha a /lib könyvtárban létrehozol egy kapcsot 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. Módosítsd a /etc/ld.so.conf-ot. 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-hez 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 teszt rendszer könyvtárába: cd /usr/lib/gcc-lib/ cp -r i486-unknown-linux i486-linuxglibc2 Lépjél be az új teszt rendszer 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-t /lib/ld-linux.so.2-ra. Ha ez megvan, törölj ki minden hivatkozást a %{...:-lgmon} -ra a fájlból, mert a glibc nem használja a gmon könyvtárat. Találsz egy példa spec fájlt a ``Példa specs fájl'' fejezetben. 4.4. A fejlécfájlokra mutató kapcsok frissítése Kapcsokat 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önytáraid, mint pl. az ncurses, ezeknek a fejlécfájljait is ebből a könytárból kell elérjed. Ezeket a fájlokat át kell másolnod vagy kötnöd 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 feltelepített programkönyvtár tesztelése A programkönyvtár teszteléséhez, hozzál létre egy glibc.c fájlta következőkkel: #include main() { printf("hello world!\n"); } Fordítsd le a következő opciókkal: "-b -nost­ dinc -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 sikeresen 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 2-es glibc-t elsődleges C könyvtárként. Ezek után minden program amit a rendszereden fordítasz az új C programkönytá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 linux-ot 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 2-es glibc-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. 5.1.1. Elő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-t) · 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 kihasznált i686@200-en ugyanez kb. fél órába kerül. 5.1.2. A forrás kicsomagolása Ahhoz, hogy le tudd fordítani a forrást, ki kell csomagolnod azt az archívból. 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. 5.1.3. Beállítások A glibc-2.0.6 könyvtárba hozzál létre egy compile nevű könyvtárat majd lépjél bele. Mindent ebben a könytá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 5.1.4. 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és előtt Akár fordítod a glibc-t, akár bináris csomagokból rakod fel, néhány fájlt át kell mozgatnod, 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 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 venni a /usr/include-bó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 lehet disztribúciófüggő. Legalább is a Slack­ ware linuxokon a g++ fejléc fájlok a /usr/local/g++-include könyvtárban vannak, míg a Debian linuxokon a /usr/include/g++ könyvtárban találhatók és a /usr/lib/g++-include kapocs a /usr/include/g++-re mutat. Az utóbbi esetben valószínűleg szerencsésebb az eredeti g++ include könyvtárat visszamozgatni a /usr/include-be. 4. Állítsál 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ére. 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. Mozgasd/másold á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 mozgatni, ha a /usr nem a / partíción van, mert ezekre a programkönyvtárakra a linux­ nak induláskor szüksége van, ezért a / köteten kell legyenek. 7. Mozgasd 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árat, 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, hogy mi van a csomagokban: 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, viszon 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él 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 fel. 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 végső lépcsőjeké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 Az ebben a könyvtárban található specs fájlt kell módosítanod. A fájlban írd át a /lib/ld-linux.so.1-t /lib/ld-linux.so.2-ra. Minden hivatkozást a %{...:-lgmon} kifekezésre törölnöd kell a fájlból, mert a glibc nem a gmon-t használja. Később e dokumentumban találsz egy ``Példa specs fájl'' című részt. 5.6. A feltelepített programkönyvtár tesztelése A programkönyvtár ellenőrzése végett, hozzál létre a glibc.c nevű fájlt a következőkkel: #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 pro­ gramkö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 valósítsd meg. A felhasznált könyvtár- és fájlnevek megegyeznek az előző részben használtakkal. Ne felejtsd el megváltoztani 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ál, be kell állítanod az include könyvtárak és fájlok elérési útvonalait úgy, hogy azok a teszt glibc könyvtár include-jaira 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 adjad a gcc include fájljait, amik a /usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include könyvtárban találhatók (persze 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 adjad 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-okban 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 5-ös libc-vel, ha a glibc az elsődleges pro­ gramkö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 adjad 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-okban 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-hez van linkelve. Mivel a meglévő libg++-od 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 következő címrő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++-t (amit forrón ajánlok, mert még sohasem volt szerencsém így libg++-t fordítani), csomagold ki a fájlokat egy átmeneti könyvtárba, majd mozgasd á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 mozgatnod 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-vel Ha C++ programokat szeretnél nem elsődleges libc-vel fordítani, meg kell adjad 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 még több információt és megoldásokat találhatsz a problémákra. A GYIK-nak van egy hálózaton elérhető változata is: . 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-t 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 nincsen ilyen nevű fájl, akkor hozzál létre egyet, a következő tartalommal: hosts: files dns Ezzel megmondtad, 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, ami leírja az nsswitch.conf fájlt. 9. Hibák bejelentése Ha úgy gondolod, hogy hiba van a programkönyvtárban, olvasd el először a GYIK-ot. 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-éből. 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 címen elérhető hibákat tartalmazó adatbázist (bug database). Nézd meg, hátha már valaki előtted lejelentette 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 csalja elő. Ez nem túl nehéz feladat. A legutolsó lépés, amikor megvan az egyszerű kis tesztprogram, a hiba lejelentése. A hiba lejelenté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 címre (működik még a régi cím is), vagy a GNATS webes interfészén keresztül a címen. Javaslatokat és kérdéseket a levelezőlistára lehet küldeni. Ha nem olvasod a gnu.bug.glibc hírcsoportot, feliratkozhatsz a listára a címen. 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-linux.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) -Amachine(i386) *cross_compile: 0 *multilib: . ; 11. Egyéb 11.1. További információ 11.1.1. Web lapok · Az FSF GNU C Programkönyvtár Weblapja · GNU Libc 2 használata Linux-szal · Glibc-2 telepítése Linuxra . · Debian libc5-ről libc6-ra Mini-HOWTO . 11.1.2. Hírcsoportok · comp.os.linux.development.system · comp.os.linux.development.apps · linux.dev.kernel · gnu.bugs.glibc 11.1.3. 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 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 címen. 11.2. Köszönet Ezen információ nagy részét a GNU Libc weblapról loptam valamint Ulrich Drepper glibc 2 announcement-jébő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 eltekintve, valamint a glibc 2 for Linux weblap karbantartásától, 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 ejg3@cornell.edu címen. 11.4. Szerzői jogok Copyright © Eric Green, 1997. Magyar fordítás © Kovács Emese, 1999. Ez a dokumentum továbbadható az LDP licenszében rögzített feltételek mellett.