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