rtld i386 versus amd64
Dan Lukes
dan at obluda.cz
Sat Feb 19 13:24:41 CET 2011
kron24 wrote:
>> 1) nainstalovat LIB32 set.
>> to by jeste nemelo mit na bezici system naprosto zadny vliv
>
> Zkousel jsem "make install32", coz nefungovalo.
Ten target existuje, takze to je dobry kandidat na "spravne reseni".
Problem nejspis bude v tom, ze 'install' faze se pokousi pouzit uz
"novy" make - tedy ten co je prelozeny v /usr/obj
Sice si myslim, ze tam ta logika je dost dobra na to, aby v tomto
pripade prisla na to, ze ten 64bitovy co tam je nemuze pouzit, ale mozna
tam je nekde nejaka chybicka.
To je ale, rekneme, drobny detail k doladeni - az/pokud bude zrejme, ze
"to cele" nema vady zasadni.
Pro instalaci kernelu to plati taky.
>> 3) reboot
>>
>> nyni mame amd64-kerne/i386 world system - mel by byt ovsem normalne
>> funkcni (vcetne portu) - kernel je 64, world je kompletne 32 bitu a 32
>> bitu kernel podporuje, ma tam i potrebne knihovny, vcetne
>> /libexec/ld-elf32.so.1
>
> ... po rebootu je problem s dynamickym linkovanim:
>
> Trying to mount root from ufs:/dev/ad0s1a
> /libexec/ld-elf.so.1: Shared object "libedit.so.7" not found, required
> by "sh"
Jeden problem by tam byt mohl - neni jasne, zda a jakou ma 'ldconfig'
vnitrni logiku tykajici se architektury. Ja doufal, ze sve chovani meni
podle toho, an jake architekture (kernelu) je spusten. Je ale mozne, ze
se chova podle toho, pro jakou architekturu byl prelozen. A protoze v
teto chvili pouzivame jeste i386/ldconfig, nemusel nam databaze knihoven
pripravit do spravneho ciloveho stavu (je mozne, ze 64bitove knihovny
ignoroval a zaznamy o 32 bitovych nedal do souboru, kde maji byt na
64bitovem systemu lec tam, kam je dava na i386).
Pokud by se tento problem potvrdil, znamemalo by to, ze bud' je treba
sahnout dovnitr ldconfig a zmenit to, podle ceho urcuje "na cem bezi"
NEBO nechat ho vytvorit databaze na "spatnem" miste a pak je proste jen
prekopirovat pod spravne jmeno. Pokud by se ukazalo, ze i386/ldconfig
nevytvari /var/run/ld-elf32.so.hints tak by to slo udelat dokonce pred
rebootem - po nabehnuti by na ten soubor uz nesahnul (a ze nam vytvori
nesmyslny /var/run/ld-elf.so.hints) nevadi, zatim nemame jedinny amd64
binar.
> Jen tak z legrace jsem se z toho zkusil vyhrabat pomoci rescue:
Jo, v tomto pripade je /rescue/* - protoze to je staticky linkovane,
naprosto nezbytna vec.
> Jediny na prvni podhled viditelny zadrhel byla routovaci tabulka:
>
> # netstat -rn
> netstat: no namelist
> # /etc/rc.d/routing restart
> route: writing to routing socket: Invalid argument
> add net default: gateway 192.168.235.1: Invalid argument
> - Neznamena ten problem s routovanim, ze nektere "systemove"
> 32bit programy nad 64bit kernelem prece jenom nepojedou?
Skoro to tak vypada. Patrne nektere predavane datove struktury jsou
"architektonicky variabilni". Otazka je, jestli je to "design" nebo
"bug". Jadro by melo byt schopno zdetekovat, ze volajici program bezi v
"compatibility" rezimu a podle toho by melo parsovat predavana data -
bud' to nedela, nebo je zakopany pes nekde jinde.
> - Jak to, ze ten ldconfig zafunguje jenom "jednorazove"? Jak
> dosahnout preziti rebootu?
To je mi taky divny, ale bez detailnejsiho ladeni - jak se lisi spusteni
ldconfigu behem startupu a to "rucni" to nedokazu rict.
> - Nebude kvuli tomu linkovani prece jenom nutne hrabnout
> na zdrojaky, jak jsi puvodne zamyslel?
Je to porad otevrena moznost, ale pokud to jde bez zasahu do zdrojaku,
byl bych radsi. Vlastni zasahy do zdrojaku jsou vzdycky problem a snazim
se jim maximalne vyhybat. Uz tak jich tam mam jako maku ...
A kdyz uz jsou fakt nutny, tak pokud mozno ne do klicovych komponent -
jako je jadro nebo prave ld-elf.so.1. To daleko radeji sahnu do kodu
'ldconfig', coz je sice dulezity, presto vsak v podstate jednorazove
pouzivany program.
> - Jako workaround me napadlo pouzit staticke programy - do /bin
> a /sbin jsem z /rescue nakopiroval sh, mount a ldconfig. To
> bylo na start systemu prece jen dost malo :-) Muzu pokracovat
> dal a asi bych se dostal k nejake minimalne sade potrebnych
> statickych programu, ale ma tahle cesta smysl?
Prekladem /bin a /sbin s optionem -DNO_SHARED bys mel ziskat kompletni
statickou sadu zakladnich programu.
Ale ja si nemyslim, ze to pomuze (pominu-li, ze se tak bude lepe ladit,
protoze proste budes mit k dispozici funkcni programy - zase ale
nepoznas co by nefungovalo, kdyby byly "normalni").
Vypada to, ze problemy jsou dva - nejak spatne se nam chova ldconfig -
to bdue v lepsim pripade problem s jeho volanim, v horsim pripade
problem s jeho vnitrni logikou. A nejake napady jak z toho vybruslit
jsem popsal nahore. Zmena logiky dynamickeho linkovani nam problem spis
nevyresi.
Druhy problem je komunikace pres routing-socket, kde se predavaji
binarni data a asi jsou spatne interpretovana - to je trochu horsi.
Lepsi varianta je, ze to je nezamysleny bug - bud' ta data nemaji byt
architekturne zavisla (a chyba je, ze jsou), nebo zavisla byt mohou a
kernel je ma zavisle interpretovat (a chyba je v teto logice). V takovem
pripade je treba chybu najit, odreportovat - oni ji do nekolika let do
kodu vlozi. Do te doby to ja mohu mit jako lokalni "vlastni" patch.
Takove patche me tolik netrapi. Horsi je, pokud se commiteri rozhodnou,
z enebylo zamerem dosahnou tohoto typu kompatibility a tudiz nejde o
bug, ale "by design".
I tak to samozrejem mohu opravit, ale jde o "trvalou diversitu" od
spolecneho kodu - a tomu se opravdu chci vyhybat. Alespon v jadre.
A uz vybec se mi nechce zanaset trvale potencialni problemy do systemu
kvuli necemu tak vyjimecnemu jako je i386->amd64 cross upgrade. I kdyby
to cele fungovalo dokonale - za zivot jich tezko udelam dve stovky.
Kvuli tomu nebudu riskovat potize, ze nebude fungovat neco, co se
pouziva rutinne.
Pokdu s eukaze, ze kompatibilita neni cilem, tak by resenim mohl byt
vlastni 'route' (vznikly upravou ze "standardniho"), ktery by se na
system nakopiroval pred rebootem - za standardni by byl nahrazen
pozdeji, v ramci 'installworld'. Uprava by spocivala v tom, z eby datove
struktury predaval v takovem tvaru, v najem jim dokze amd64 jadro
rozumet ...
>> Ja sam se ted nebudu pokouset to zkouset a doladit do finalne
>> pouziteneho stavu ...
>
> ... ale jsem ochoten se tomu jeste venovat a jestli me Ty nebo
> nekdo dalsi popostrci, pokusim se k tomu pouzitelnemu stavu
> dostat.
To je spoluprace, ktera mi momentalne vyhovuje. Ja fakt nemam cas si s
tim ted hrat. Pokud ty cas a naladu mas, zkus se podivat co po tom
startu vlastne vyrobil ten ldconfig - zda vyrobil jen
/var/run/ld-elf.so.hints nebo i /var/run/ld-elf32.so.hints - a co do
nich vlastne dal. To je vec, ktera se na "normalnim" systemu spatrit neda.
Na "route" se podivat muzu - na to nemusim "zparchantet" zadnou masinu,
to si proste i386/route nakopiruju domu a zkusim to, to zadne velke
mnozstvi casu nevyzaduje.
Dan
More information about the Users-l
mailing list