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