Staticke linkovani

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Sobota Březen 10 19:03:01 CET 2007


On Thu, 8 Mar 2007, Ladislav Vaiz wrote:

> Glibc se uz asi dostala ze stavu, kdy nove verze byly binarne 
> nekompatiblini se starymi.

Glibc už se hlavně dostala ze stavu, kdy bylo jednoduché používat její
interní symboly a vytvářet tak programy, co s novou verzí nefungovaly. ;)

> Ad mail pana Kankovskeho:
> Rekompilace glibc pro me neni reseni, [...]

Proč? Bill Gates Vám to zakázal? ;)

Když chcete distribuovat binárku, ve které bude staticky nalinkovaná 
Glibc, tak je už jedno, jestli máte tu knihovnu z distribuce, nebo jestli 
jste si jí zkompiloval sám, ne?


On Thu, 8 Mar 2007, Jan Otte wrote:

> Vidite, napr. printf@@GLIBC_2.2.5.
> 
> A tohle vsechno muzete ovlivnit. Muzete specifikovat presnejsi verzi
> libc (potazmo kterekoliv knihovny) kterou chcete, muzete ovlivnit jmena
> symbolu [...]

Tady jde o to, že v Glibc (pohříchu je to mezi knihovnami dost bílá vrána)  
se používá mechanismus verzovaných symbolů, který dovoluje mít v jedné
dynamické knihovně několik nekompatibilních rozhraní. (I když nové verze 
většinou spíš znamenají, že se nějaké symboly přidávají, než že by se 
staré měnily.)

Použitou verzi ABI lze určit i ručně, ale obvykle se to nechává na ld,
aby verze odvodil z verze knihovny, kterou použije při linkování.
Nejjednodušší postup, jak učinit program binárně kompatibilní i se 
staršími verzemi, je zkompilovat (headery!) a slinkovat ho se starší
verzí knihovny.

(Mimochodem to máte nějaké zvláštní, že máte printf asociovaný s verzí 
GLIBC_2.2.5. Ale možná je to tou 64-bitovou platformou, jako že pro ní 
byla první verze ABI až 2.2.5.)

a samozrejme muzete si potrebne knihovny prilinkovavat sam 

> viz treba dlopen(3) a podobne. [...]

Hlavně aby to nedopadlo jako nejmenovaný hogo fogo komerční software,
který tohle dělal, a když vhodnou knihovnu nenašel (která ale nebyla
pochopitelně vidět v ldd), tak prostě provedl segfault...


On Thu, 8 Mar 2007, Ladislav Vaiz wrote:

> gcc -o test test.c -Wl,-Bstatic -lpthread -Wl,-Bdynamic
> /usr/lib/gcc-lib/i486-linux/3.3.5/../../../libpthread.a(ptw-write.o)(.text+0x25): 
> In function `write':
> : undefined reference to `__syscall_error'

Libpthread není dobrý příklad, jelikož je to součást Glibc.
A tak má libpthread a libc velmo intimní vztah, který se projevuje tím, že 
libpthread obsah používá skryté symboly v libc. Takže buď obojí staticky, 
nebo obojí dynamicky, třetí cesta není, jak říká klasik.

U méně provázaných knihoven není důvod, proč by to nemělo fungovat (tedy 
za předpokladu, že nevznikne stejná situace jako s tím NSS, že máte L1 
staticky, L2 dynamicky a L2 potřebuje L1 -- pochopitelně v dynamickém 
tvaru).


On Fri, 9 Mar 2007, Jan Otte wrote:

> Ale uvedomte si ze pri linkovani byla libpthread zahozena, protoze
> nebyla potreba.

To platí u statických knihoven, kde fakticky linker vybere z knihovny jen 
ty soubory *.o, co potřebuje (některé linkery umí dokonce vybírat i části 
přeloených souborů, ale to už trochu vyrovnávání intelektového deficitu na 
straně tvůrců knihoven).

Dynamickou knihovnu linker přilinkuje vždycky, je-li vyžádána.


--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