Het volgende wat er gebeurt als je computer opstart is dat init wordt geladen en uitgevoerd. Echter init maakt zoals bijna alle programma's gebruik van functies uit library's.
Je hebt wellicht al eens een voorbeeldprogramma in C zoals het volgende gezien:
main() { printf("Hello World!\n"); }
Het programma bevat geen definitie van printf
, dus waar komt het
vandaan? Het komt uit de standaard C library's, op een GNU/Linux systeem, glibc.
Als je het onder Visual C++ compileert, dan komt het uit een Microsoft
implementatie met dezelfde standaardfuncties. Er zijn een onbepaald groot
aantal van dergelijke standaardfuncties, voor berekeningen, tekenreeksen,
datums/tijden, geheugentoekenning, enzovoort.
Alles onder Unix (inclusief Linux) is of geschreven in C of heeft met veel
moeite getracht het voor te doen alsof het zo is, dus iedereen maakt gebruik
van deze functies.
Als je op je Linux systeem in /lib
kijkt, dan zie je heel veel
bestanden met de naam lib-en-nog-wat.so
of lib-en-nog-wat.a
enz. Het zijn library's met deze functies. Glibc is gewoon de GNU implementatie
van deze functies.
Er zijn twee manieren waarop programma's deze libraryfuncties kunnen
gebruiken. Als je een programma statisch linkt, dan worden
deze libraryfuncties gekopieerd in het uitvoerbare bestand dat wordt
aangemaakt. Hier zijn de lib-en-nog-wat.a
library's voor.
Link je een programma dynamisch (wat standaard gebeurt), dan
wordt de librarycode aangeroepen door het programma zodra het programma
deze code nodig heeft. Het wordt dan aangeroepen uit het
lib-en-nog-wat.so
bestand.
De opdracht ldd
is je vriend wanneer je erachter wilt zien te
komen welke library's nodig zijn voor een bepaald programma.
Hier zijn bijvoorbeeld de library's waar bash
gebruik van maakt:
[greg@Curry power2bash]$ ldd /bin/bash libtermcap.so.2 => /lib/libtermcap.so.2 (0x40019000) libc.so.6 => /lib/libc.so.6 (0x4001d000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
De werking van een aantal functies in de library's hangen af van waar je
je bevindt. In Australië schrijven we de datum bijvoorbeeld in de
opmaak dd/mm/yy, maar Amerikanen schrijven het als mm/dd/yy. Er wordt een
programma meegeleverd met de glibc
distributie genaamd
localedef
die het je mogelijk maakt dit in te stellen.
Gebruik ldd
om uit te zoeken welke library's je favoriete toepassingen
gebruiken.
Gebruik ldd
om uit te zoeken welke library's init
gebruikt.
Maak een library om mee te spelen, met daarin slechts één
of twee functies. Het programma ar
wordt gebruikt om ze aan te maken,
de manpage van ar
is wellicht een goed begin om te onderzoeken hoe
dit werkt. Schrijf, compileer en link een programma dat gebruik maakt van
deze library.