Staticke linkovani

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Sobota Duben 8 11:13:07 CEST 2000


On Fri, 7 Apr 2000, Miloš Prchlík wrote:

> >zkuste -lncurses dat az na konec :)
> 
> Jo, to je presne ono.  S velkym O :) Muzete mi vysvetlit, prosim Vas, proc
> je to zrovna takhle? Clovek aby se pak uhledal. A dekuji za zachranu nervu.

Linker normalne (da se to -- aspon u GNU ld -- zmenit pomoci -(...-), viz
info ld) funguje pouze jednopruchodove a ze statickych knihoven, coz
jsou vlastne jen baliky *.o souboru, vybira pouze ty soubory, u kterych
podle aktualniho seznamu nedefinovanych odkazu sezna, ze je potrebuje
(aspon pokud nema zadano --whole-archive).

Kdyz tedy provedete toto:

	gcc -Wall -pipe -O -fomit-frame-pointer -L/usr/lib -lncurses
	-static -o gd ./gui.o ./core.o

pak ld vidi -lncurses, ale protoze jeste nedosel ke gui.o a core.o, je
seznam nedefinovanych odkazu prazdny (skoro, asi tam bude neco z crt*.o,
ktere gcc prida na zacatek), a tudiz do vysledku nic z libncurses.a
neda. Kdyz pak dojde na misto, kde by to bylo potreba, tak uz je pozde.
Duvod pro toto (mozna podivne chovani) je ten, ze uplne reseni muze
vyzadovat nekolik pruchodu seznamem knihoven, resp. drzet najednou uplne
informace o vsech knihovnach (a provadet na tom jakesi prohledavani
grafu), coz nebylo z kapacitnich a rychlostnich duvodu povazovano za
unosne (mluvime o unixovem davnoveku, i kdyz i dnes by neskodilo, kdyby se
obcas nekdo nad takovymi vecmi zamyslel :> ).

U dynamickych knihoven se tento efekt neprojevi, protoze *.so je jeden
dale nedelitelny objekt, ktery proste vezme na vedomi jako celek.

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."




Další informace o konferenci Linux