jak udelat DSO s prilinkovanou knihovnou staticky?
Václav Ovsík
vaclav.ovsik na i.cz
Úterý Červen 22 14:58:44 CEST 2004
Zdravim,
mel bych takovy delsi mirne OT dotaz. Je to ovsem dost hustej dotaz,
a vyzaduje to guru pohled, jestli se ovsem nepletu :-).
Potrebuji vyrobit perl XS modul se staticky prilinkovanou knihovnou
urcite verze tak, aby mi to nekolidovalo s toutez knihovnou starsi
verze, ktera se taha dynamicky nekdy predtim.
Nejlepe budu uplne konkretni, abych to poradne zamlzil:
Mam nejake CGI skripty, ktere pouzivaji muj XS k OpenSSL. Potud vse
ok. Ted jsem v ramci optimalizace chtel pouzit mod_perl a skripty
poustet pres Apache::Registry. Potiz je, ze pouzivam take mod_ssl.
mod_ssl je soucasti distra a je linkovano proti verzi OpenSSL
z distra (dynamicky) (konkretne na Debianu Woody 0.9.6).
Ja ovsem potrebuji OpenSSL z CVS (0.9.8), takze ho mam v /usr/local
nainstalovane. XS modul je linkovan proti nemu.
No a ted ten hlavni problem:
Jak zalinkovat openssl 0.9.8 staticky (dejme tomu, ze je to
prelozene s -fPIC) do toho meho DSO modulu???
Puvodne jsem si myslel, ze jsem happy, kdyz mam OpenSSL 0.9.8 prelozene
pouze staticky. Ze se mi proste muj XS modul sestavi s nim...
Nektere skripty, mi ovsem zpusobuji SIGSEGV. Kdyz jsem se tim zaobiral
(uz nekolik dni), zjistil jsem postupnym ocesavanim, ze se XS modul
tluce s mod_ssl.
Je to tak, ze linker z toho prilinkovaneho kusu libcrypto.a z OpenSSL
vyexportuje vsechny symboly ven. Takze z meho XS modulu se sakra stane
kus OpenSSL dynamicke knihovny :-(). No a jak je to predmetem
dynamickeho linkovani, ten muj XS modul vola zrejme funkce z OpenSSL
0.9.6 (alespon gdb se tak tvari), kde to zhavaruje.
Muze mi prosim nekdo osvetlit (treba odkaz) problematiku duplicitnich
symbolu v dynamickem linkovani? Jak se s tim zavadec popere?
Preci musi jit zalinkovat ta knihovna do DSO a ty symboly co nechci
zahodit?! Zkoumal jsem zbezne info k ld, ale uprime pochopit to ted
z fleku nejak nejsem schopen. Psat si vlastni ld script je asi uz trosku
mimo, to uz je fakt pro hardcore lidi.
Jako zajimavou jsem zkusil volbu --retain-symbols-file. Udelal jsem nm
na XS modul a nechal tam jenom moje symboly. Pak jsem vylinkoval DSO
skutecne jenom s mimi symboly, uz tam nebylo to OpenSSL smeti, ale
zazrak se nekonal. Pada to na drzku i tak.
Navic jsem zas narazil na dalsi problem. :-) Kdyz jsem OpenSSL prelozil
s podporou debugovani a XS taky s -g nasledne slinkoval XS pomoci ld,
tak to DynaLoader nenatahne, ze mu chybi symbol stat. Koukal jsem na to
jak puk. Vyhodil jsem to --retain-symbols-file a stejne nic.
Musi se to slinkovat pres kompilator, kterej na to pousti nejakej
collect2 ci co. Pak to funguje. Doted jsem si myslel, ze linkovat muzu
plnohodnotne pomoci ld z binutils (no mozna by to slo, ale asi by se
musel predhodit jeste nejakej objekt z gcc-lib).
Prosim tedy, jestli nekdo vite, jak upravit tohle:
cc -shared -o X.so X.o -static -L/usr/local/lib -lcrypto
tak, aby v X.so nebyly symboly z libcrypto.a...
Tak dejte vedet, diky
Jinak jsem problem vyseparoval do maleho XS a problem navodim pres:
LD_PRELOAD=/usr/lib/libcrypto.so.0.9.6 /usr/bin/perl \
-Iblib/arch -Iblib/lib test.pl
Takze kdyby chtel nekdo fakt experimentovat, mohu poslat maly modulek,
na kterem je to videt. Dotycny by ovsem potreboval jeste to OpenSSL...
Reseni, ze prelozim i mod_ssl proti tomu OpenSSL 0.9.8 se mi nelibi,
0.9.8 neni stable, abych s tim behal SSL.
Jeste jednou za kazdy napad.
--
Zito
Další informace o konferenci Linux