Programma's en bibliotheken

>> Index <<

Programma's kiezen

Bibliotheken

Programma's installeren

Programma's kiezen

Linux gebruikers hebben een ruime keus aan software. Het grootste deel hiervan is vrij van het internet te plukken. Hierbij hoeft het niet altijd om "open source" software (OSS) te gaan. Ook commerciële producten komen in een Linux versie beschikbaar.

Doorgaans is het wijs om in eerste instantie op de CD's van uw distributie naar software te zoeken. Dit heeft als voordeel dat de software aansluit bij uw Linux bibliotheken. Meestal is de installatie ook een stuk eenvoudiger.

Hier nog wat URL's om naar software te zoeken.

Bibliotheken

Programma's maken gebruik van bibliotheken. Programma's geven bibliotheken opdrachten voor het regelen van allerlei basale zaken. De routines uit de bibliotheken zijn bouwstenen van een programma. De compiler metselt ze aan elkaar (linking). De programmeur hoeft dan niet voor iedere taak het wiel zelf uit te vinden. Hij concentreert zich op de architectuur van het programma en laat de details aan beproefde routines over.

De meeste programma's maken gebruik van dynamisch gelinkte bibliotheken. Deze zijn te vergelijken met de dynamic link libraries (DLL) bibliotheken van Windows. Voordeel van het dynamisch linken is dat de bibliotheken door meerdere programma's gedeeld kunnen worden. Dat bespaart u ruimte in het geheugen en op de harde schijf.

Er kleven ook nadelen aan het gebruik van gedeelde bibliotheken:

  1. De benodigde bouwstenen moeten in de juiste maten (bibliotheek versies) op het systeem voorhanden zijn. Soms is dat vanwege een copyright restrictie niet mogelijk. Commerciële programma's brengen daarom nog wel eens hun eigen statisch gelinkte bibliotheken mee (bijv. Netscape).

  2. Als een programma door een programmeerfout vastloopt kan hij andere programma's die deze bibliotheek gebruiken in zijn val meeslepen. Om die reden gebruiken sommige systeem- en diagnose programma's hun eigen bibliotheken.

De meeste distributies bevatten slechts een major version van de c bibliotheek (libc of libc5).

Programma's die gemaakt zijn voor libc5.01 zouden het nog moeten doen onder libc5.99, maar niet meer op libc6. De versies 5 en 6 heten daarom major version numbers. Het getal achter de 5 (.0 of .99) is het versienummer. Om programma's die om libc5.01 vragen niet teleur te stellen maakt de make install (zie verder) van libc5.99 ook een symbolische link (verwijzing) met de naam libc5.01 naar libc5.99 aan. In dat geval roept het libc5.01 aan, maar libc5.99 voert de routines uit. Verwijzingen van libc5.01 naar lib6.0 bibliotheek zijn echter niet meer mogelijk. Vandaar dat de meeste distributies die naar versie 6 zijn overgegaan ook de wat oudere libc5 bibliotheek bevatten.

De C bibliotheken

Verreweg de belangrijkste bibliotheek is de GNU c bibliotheek. Het Linux besturingssysteem is zelf in de programmeertaal c geschreven en veel programma's zijn dat ook. Van de c bibliotheek bestaan meerdere versies. Het gaat vooral om libc5 en nieuwere glibc2. Het is de bedoeling dat de distributies naar GNU libc2 overstappen. De laatste staat ook bekend als de libc of libc6.

Met de opdracht ldd (print shared library dependencies) kunt u nagaan welke bibliotheken een bepaald programma (hier de bash shell) gebruikt.

sjoerd@zolder:~> whereis bash
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
sjoerd@zolder:~> ldd /bin/bash
        libreadline.so.4 => /lib/libreadline.so.4 (0x40024000)
        libhistory.so.4 => /lib/libhistory.so.4 (0x4004e000)
        libncurses.so.5 => /lib/libncurses.so.5 (0x40055000)
        libdl.so.2 => /lib/libdl.so.2 (0x4009d000)
        libc.so.6 => /lib/libc.so.6 (0x400a2000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Basale programma's als cat gebruiken bibliotheken uit /lib (in dit geval libc). Toepassingsprogramma's plaatsen hun bestanden meestal in /usr/lib.

Welke c bibliotheken op uw systeem geïnstalleerd zijn kunt u met locate nagaan. Locate vindt ook verwijzingen (softlinks) naar bibliotheken. Linux plaatst niet zoals Windows de bibliotheken in een grote Windows /system map, maar iedere versie krijgt zijn eigen map. Hierin is het versienummer te lezen. Zo kunnen meerdere bibliotheken vredig naast elkaar leven en voorkom je dat het ene programma de bestanden van het andere overschrijft. De symbolic links verwijzen doorgaans naar het laatste versienummer.

Zoeken naar c bibliotheken (die beginnen met libc.so) gaat met:

sjoerd@visser:~ > locate libc.so

Commentaar

/lib/libc.so.4

Symlink naar /lib/libc.so.4.7.6. Bij een update naar versie 4.7.9 moet de symlink uiteraard aangepast worden. Doorgaans zal het vervangen van de symlink door een installatiescript (bijv. in de rpm) plaatsvinden, maar het is wel een punt om op te letten.

/lib/libc.so.4.7.6

Een oudere libc blibliotheek (versie 4.7.6.)

/lib/libc.so.6

De libc (libc6).

/opt/applix/jre115/lib/i386/green_threads/libc.so.5

Ooit door Applixware geïnstalleerd. Deze blijkt ook in /usr geinstalleerd te zijn.

/usr/i486-linux-libc5/lib/libc.so

Symlink naar /usr/i486-linux-libc5/lib/libc.so.5.4.46.

/usr/i486-linux-libc5/lib/libc.so.1

Onduidelijk wat deze oude versie hier te zoeken heeft.

/usr/i486-linux-libc5/lib/libc.so.5

Symlink naar /usr/i486-linux-libc5/lib/libc.so.5.4.46.

/usr/i486-linux-libc5/lib/libc.so.5.4.46

De gebruikte glibc5 bibliotheek.

/usr/lib/jre1.1.7/lib/i686/green_threads/linuxlibs/libc.so.6

Deze door de Java Runtime machine geschreven bibliotheek lijkt overbodig te zijn, omdat /lib ook al een libc.so.6 bevat. Toch blijken de versies te verschillen.

/usr/lib/jre1.1.7/lib/i686/native_threads/linuxlibs/libc.so.6

Idem. De native_threads bibliotheek lijkt erg op de green_threads bibliotheek.

/usr/lib/libc.so

Een script voor de GNU linker (ld).

Er blijken drie major lib c bibliotheken te zijn geïnstalleerd (major versies 4, 5 en 6). De complete versie nummers zijn /lib/libc.so.4.7.6, /usr/i486-linux-libc5/lib/libc.so.5.4.46 en /lib/libc.so.6.

Een globale indruk van de geïnstalleerde bibliotheken krijgt u met het volgende commando:

[sjoerd@localhost sjoerd]$ cat /etc/ld.so.conf

/usr/X11R6/lib

/usr/lib

/usr/i486-linux-libc5/lib

Het bovenstaande is onder een demo van Mandrake 6.1.

Het door cat afgebeelde /etc/ld.so.conf is het configuratiebestand van de dynamische linker/loader ld.so. Het is te vergelijken met het LIBPATH zoekpad van OS/2. Hier zoekt de "dynamic linker" ld.so naar gedeelde bibliotheken. Zodra een programma opgestart wordt, laadt ld.so de door het programma gebruikte bibliotheken in het geheugen en worden ze met het programma verbonden (linken). Pas met de eraan gekoppelde bibliotheken kan het programma daadwerkelijk lopen (Zie:man ld.so).

Onder SuSE 6.1 stonden veel meer bibliotheken in de ld.so cache. Suse bevond zich in een overgangsfase van libc5 naar libc6. Programma's die voor de libc5 bibliotheek gemaakt zijn zullen het onder libc6 niet doen. Suse loste dit op door beide c bibliotheken te leveren, zodat uw oude programma's het blijven doen. Microsoft verplicht u doorgaans uw programma's op te waarderen als het besturingssysteem een nieuwe fase ingaat, maar onder Linux bepaalt niet de "marketing" maar de klant wat er gebeurd.

bash-2.02# cat /etc/ld.so.conf


/lib-aout

Een oude bibliotheek

/usr/X11R6/lib/Xaw95

De X11 Xaw widget set was bedoeld om een Windows 95 lookalike GUI te geven.

/usr/X11R6/lib/Xaw3d


/usr/X11R6/lib

Nodig voor de XFree86 server.

/usr/X386/lib

Deze 386 bibliotheken zullen het onder ieder systeem doen.

/usr/i486-linux/lib

De 486 bibliotheken zijn geoptimaliseerd voor Intel 86486 PC's en hoger.

/usr/i486-linux-libc5/lib

De plaats van de oude c library.

/usr/i486-linux-libc6/lib

De plaats van de nieuwe c library (libc) is verhuisd naar /usr/X11R6/lib!

/usr/i486-linuxaout/lib

Een oude a-out bibliotheek die door ldconfig geladen kan worden. Zie: man ldconfig.

/usr/local/lib

Van oudsher bibliotheekbestanden die niet bij het besturingssysteem hoorden. Tegenwoordig worden ze vaak in /opt/lib geplaatst.

/usr/openwin/lib

De OpenWindows bibliotheek van de SUN werkstations. Zie: OpenWindows User's Guide. De map /usr/openwin/lib bestaat bij mij echter niet.

/opt/kde/lib

De Qt bibliotheek van de Noorse firma Troll Tech. Deze in C++ geschreven grafische bibliotheek wordt door de K Desktop Environment (KDE) gebruikt. Er zijn twee versies van de Qt licentie: de Qt Free Edition voor X en de Qt Professional Edition (payware) voor X11 en Win32. Wie open source programma's schrijft voor X mag de vrije editie gebruiken. Wie de broncode van zijn met Qt geschreven applicaties niet vrij wil geven, moet de professionele (payware) versie gebruiken. De laatste versie is aantrekkelijk voor commerciële multi-platform toepassingen. Er zijn regelingen getroffen die garanderen dat deze niet onder de GPL vallende bibliotheek ook in de toekomst (kosteloos) voor het KDE project beschikbaar blijft, zelfs als de firma Troll Tech door MS opgekocht zou worden (;-).

/opt/gnome/lib

De GNU GTK+ bibliotheken. Deze C routines zijn voor de GIMP (GNU Image Manipulation Program) ontwikkeld. GTK is ook nodig voor GNU Object Model Environment (GNOME) programma's. De object georiënteerde omgeving wordt bereikt door macro's en conventies. Voor meer info zie: GTK+ - The GIMP Toolkit .

De opdracht "rpm -qa | grep lib" tenslotte zal een indruk van de als rpm geïnstalleerde bibliotheken geven. De opdracht "rpm -qa" geeft alle (query all) geïnstalleerde rpm pakketten en "| grep lib" filtert ze op de tekst "lib". Een groot deel hiervan zal niet in het zoekpad staan, maar kan wel worden opgeroepen door de bijbehorende programma's.

Programma's installeren

Programmeurs van Redhat ontwikkelden de door veel distributies gebruikte Redhat Package Manager (RPM), een programma dat behulpzaam is bij het installeren en deïnstalleren van software. Het systeem werkt zo goed, dat het min of meer de standaard werd van de meeste distributies. Distributies als Redhat, Mandrake en SuSE gebruiken meestal hun eigen frontend, maar het onderliggende mechanisme is gebaseerd op de Redhat Package Manager (RPM).

In de regel installeert u programma's op een van de volgende manieren.

Ad 1). Programma's installeert u het gemakkelijkst met de bij de distributies geleverde CD's. SuSE (yast) en Redhat ( glint) maken hierbij gebruik van de Redhat Packager, waarmee u programma's ook goed deïnstalleren en updaten kunt. Zie: man rpm en in de handleiding van de distributie.

Ad 2). Vanaf de prompt is de Redhat Packager ook te bedienen.

U kunt eenvoudig een gesorteerde lijst aanmaken van alle geïnstalleerde rpm pakketten met de query all switch van rpm:

rpm -qa | sort > rpm.all

of deze bekijken met less.

rpm -qa | sort | less

U kunt hierin ook specifiek zoeken, bijv. naar de java versie :

sjoerd@visser:~ > rpm -qa | grep java
javarunt-1.1.7v3-5

Of naar geïnstalleerde bibliotheken:

rpm -qa | grep lib

Met een recente Midnight Commander (mc) kunt u in RPM pakketjes verpakte programma's (eindigend op .rpm, maar meestal verpakt in *.gz of *.tgz bestanden) ook uitpakken en installeren.

De Midnight Commander is een handige Norton Commander clone voor Linux.

Bestanden die u op een fat schijf hebt staan en een sterretje vertonen (*pakket.tgz), moet u in de regel eerst naar een Ext2 partitie verplaatsen. Een sterretje voor het bestand duidt erop dat Linux ze als uitvoerbaar bestand beschouwd. Op een Ext2 partitie kunt u met File/Chmod de exec attributen verwijderen. Daarna kunt u de bestanden wel met de Midnight Commander openen en de pakketen installeren. In het voorbeeld staan de scripts (INSTALL, UPGRADE) al klaar.

In dit geval krijg ik de foutmelding dat er bibliotheken ontbreken:

root@zolder:/cdrom/special/Red_Hat_5.x/applix > /usr/lib/mc/extfs/rpm run /cdrom/special/Red_Hat_5.x/applix/axbase-4.4.1-13.i386.rpm INSTALL
Installing "/cdrom/special/Red_Hat_5.x/applix/axbase-4.4.1-13.i386.rpm"
error: failed dependencies:
ldso is needed by axbase-4.4.1-13
nkita is needed by axbase-4.4.1-13
Press any key to continue...

U kunt de ontbrekende bibliotheken eerst installeren in de hoop dat de foutmelding zal verdwijnen.

Een andere optie is een installatie en/of update te forceren met de --nodeps optie.

root@visser:/cdrom1/special/Red_Hat_5.x/applix > rpm -Uvh --nodeps axbase-4.4.1-13.i386.rpm
axbase ##################################################
Updating etc/rc.config... 

Deze was voor SuSE gemaakt.

Ctrl-o geeft onder mc de prompt (en Ctr-o geeft daarna de mc terug).

Pijl omhoog geeft de laatste opdracht (scheelt typewerk bij lange rpm namen).

/special/Red_Hat_5.x/applix/axbase-4.4.1-13.i386.rpm INSTALL

Daarna de opdracht aanpassen:

root@zolder:/cdrom/special/Red_Hat_5.x/applix > rpm -Uvh --nodeps axbase-4.4.1-13.i386.rpm

Veelgebruikte rpm opdrachten

Een nieuw programma installeren (-i, --install).

suse8:~ # rpm -i prog.rpm 

Meestal word -ivh gebruikt (v = verbose) en h voor de voortgangsrapportage.

Een programma opwaarderen (-U, --upgrade) vanaf een internetlokatie:

suse8:~ # rpm -U ftp://ftp.server/pub/prog.rpm:

Verwijder (-e, --erase) een programma:

suse8:~ # rpm -e prog.rpm

Ververs (-F, --freshen) een programma:

suse8:~ # rpm -F prog.rpm

Maak een nieuwe index aan van een beschadigde rpm-database.

suse8:~ # rpm -rebuilddb

Nuttige opties:

Installatie forceren: --force

Een ouder pakket installeren: --oldpackage

Geen controle op afhankelijkheden : --nodeps

Programma's compileren

Sommige programma's moeten nog gecompileerd worden. Compileren is het maken van een uitvoerbaar bestand aan de hand van broncode. Dat lijkt erg omslachtig, maar het heeft ook zijn voordelen. Zo kunnen programma's met meer of minder features gemaakt worden en is het programma voor een bepaalde processor te optimaliseren.

De README zal u vertellen wat u precies moet doen, maar in de regel gaat het bij compileren om drie opdrachten:

make config
make all
make install

Soms doet een installatiescript dat.

Let er op dat u de paden (bijv. LIBDIR) in het Makefile configuratiebestand juist invult als u het pakket niet via uw eigen distributeur verkreeg. Ook het verplaatsen van configuratie bestanden - bijv. van /usr/lib/prog.conf naar /etc/prog.conf volgens de FHS richtlijnen - vraagt nog wel eens een nieuwe compilatie van de uitvoerbare bestanden.

Voor de root is - uit veiligheidsoverwegingen - de huidige directory niet standaard in het pad opgenomen. Dit omdat er kwaadaardige versies van de door hem gebruikte tools in de huidige directory kunnen staan. U moet er expliciet naar verwijzen met ./ .

./make config
./make all
./make install

Een goede methode is om het eigenlijke compileerwerk in "make config" en "make all" als gebruiker uit te voeren. Fouten in de scripts komen dan niet ten laste van het systeem. "./make install" plaatst alles in de root directories. De installatie zult u in de regel wel als root moeten uitvoeren. Hiervoor kunt u sudo gebruiken.

./configure [en opties] && make && sudo make install

Een programma starten

./xwp start WP voor Linux in de huidige directory op (onder Windows zou u xwp kiezen). xwp start alleen WP voor Linux op als xwp in het pad zit. Daarom zou u de volgende alias in ~/.bashrc (de Bash shell) kunnen toevoegen:

alias xwp="/opt/wp/wpbin/xwp"

Problemen met bibliotheken

Het komt regelmatig voor dat een programma niet wil laden. Meestal is dat een probleem van ontbrekende bibliotheken. Om die reden controleert het rpm programma steeds de hulpprogramma's en bibliotheken waar de geïnstalleerde pakketten van afhankelijk zijn (dependencies).

Op een oude PC kon ik na stroomuitval de X server niet meer opstarten.

sjoerd@zolder:~> startx
xauth: error while loading shared libraries: libXmuu.so.1: cannot open shared object file: No such file or directory
xinit: error while loading shared libraries: libXmuu.so.1: cannot open shared object file: No such file or directory

Twee hulpprogramma's gaven een foutmelding: xauth en xinit. Ze konden het object bestand (een DLL onder Windows ) libXmuu.so.1 niet laden. Ldd (die de door een programma gebruikte gedeelde bibliotheken opsomt) bevestigde dit:

sjoerd@zolder:~> ldd xinit
ldd: ./xinit: Onbekend bestand of map
sjoerd@zolder:~> whereis xinit
xinit: /usr/X11R6/bin/xinit /usr/bin/X11/xinit /usr/X11/bin/xinit /usr/X11/man/man1/xinit.1x.gz
sjoerd@zolder:~> ldd /usr/X11R6/bin/xinit
        libXmuu.so.1 => not found
        libXext.so.6 => not found
        libX11.so.6 => not found
        libc.so.6 => /lib/libc.so.6 (0x4001d000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Whereis kon de objectbestanden ook niet vinden.

sjoerd@zolder:~> whereis libXmuu.so.1
libXmuu.so:

Maar ze waren er wel. In /usr/X11R6/lib bestand het bestand @libXmuu.so.1. Het was een snelkoppeling naar libXmuu.so.1.0. Blijkbaar bevonden ze zich niet meer in het zoekpad zodat de dynamic linker (ld.so) ze niet kon laden.

Het pad waar de dynamische linker naar bibliotheken zoekt is het bestand /etc/ld.so.conf. Onder SuSE worden nieuwe zoekpaden in /etc/ld.so.conf.in ingevoerd. Via het programma SuSEconfig worden ze in ld.so.cache geladen. Maar bij het benaderen van de map met mc kreeg ik foutmeldingen.

zolder:/etc # dir >dir.txt
ls: .so.conf: Onbekend bestand of map
ls: aliases: Onbekend bestand of map
ls: wgetrc: Toegang geweigerd
zolder:/etc #

Het bestand ld.so.conf was met de stroomuitval verdwenen. Via een backup van /etc kon ik hem herstellen.

Tip: maak altijd een backup van /etc(etra)!



> Top <
>> Index <<

[LnX] Games v1.1 - Making Linux more fun. Games, 3D, hardware, tweaking and lots of downloads

www.rpm.org

Maximum RPM: RPM handleiding

Frank's Corner, Running Windows applications and games on Linux using Wine