rtld i386 versus amd64

kron24 kron24 at gmail.com
Fri Feb 18 13:33:13 CET 2011


Dne 16.2.2011 17:47, Dan Lukes napsal(a):
...
> Vychazim z i386 systemu stejne verze jaky bude mit AMD64 na jaky hodlam
> prejit. rec je o normalne bezicim systemu kam se pristupuje na dalku po
> siti, v /usr/src jsou zdrojaky, v /usr/obj je jsou relozene veci PRO
> AMD64 (jak se tam dostali ? odjinud, respektive, je to sitove
> primoutovany vzdaleny disk). Takze:

Tak jo, mel jsme cas a napadlo me to zkusit...

Verze 8.1. Udelal jsem 2 virtualy, jeden s i386, druhy s adm64.
Na druhem jsem zbuildoval a nainstaloval world a kernel a pak
zkopiroval /usr/obj na stroj s i386.

>
> 1) nainstalovat LIB32 set.
> to by jeste nemelo mit na bezici system naprosto zadny vliv

Zkousel jsem "make install32", coz nefungovalo. Cteni make
souboru jsem po case vzdal a ten set jsem proste nainstaloval
cestou nejmensiho odporu - z ftp .../amd64/8.1-RELEASE/lib32

> 2) nakopirovat na stroj AMD64 kernel obsahujici COMPAT32

Tady jsem soubojem s make stravil jen par desitek vterin a pak
jsem proste nakopiroval /boot/kernel ze stroje adm64. Stary i386
kernel jsem si samozrejme schoval.

(Pro presnost zaznamu, ta option se jmenuje COMPAT_FREEBSD32.)

> 3) do rc.conf dat
> ldconfig32_paths="$ldconfig32_paths $ldconfig_paths"
> ldconfig_local32_dirs="ldconfig_local32_dirs ldconfig_local_dirs"

(V tom druhem radku jsem si doplnil dolary)

Pred rebootem asi budeme potrebovat jeste nejaky trik, protoze...

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

Jen tak z legrace jsem se z toho zkusil vyhrabat pomoci rescue:

Enter full pathname of shell or RETURN for /bin/sh: /rescue/sh
# mount -a
/libexec/ld-elf.so.1: Shared object "libutil.so.8" not found, required 
by "mount"
# /rescue/mount -a
# /etc/rc.d/ldconfig start
ELF ldconfig path: /lib /usr/lib /usr/lib/compat /usr/local/lib
32-bit compatibility ldconfig path: /usr/lib32 /usr/lib/compat 
/usr/local/lib

Ted uz bylo zdanlive dobre, sel spustit /bin/sh i /usr/local/bin/bash.
Opustil jsem single- a normalne nabehl skoro normalni multi-user.
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

I tak jsem cekal, ze ted - s novou databazi ldconfig - to dalsi
reboot uz muze jenom spravit, ale skoncil jsem zase u /bin/sh,
ktery nesel spustit:
...
/libexec/ld-elf.so.1: Shared object "libedit.so.7" not found, required 
by "sh"
Enter full pathname of shell or RETURN for /bin/sh:


Zkratka, misto abych prinesl neco uzitecneho, mam spis otazky:
- Neznamena ten problem s routovanim, ze nektere "systemove"
   32bit programy nad 64bit kernelem prece jenom nepojedou?
- Jak to, ze ten ldconfig zafunguje jenom "jednorazove"? Jak
   dosahnout preziti rebootu?
- Nebude kvuli tomu linkovani prece jenom nutne hrabnout
   na zdrojaky, jak jsi puvodne zamyslel?
- 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?

> 4) nyni je treba nainstalovat spravny /libexec/ld-elf.so.1
>
> stavajici /libexec/ld-elf.so.1 pochazejici pro i386 byl pro 64bit kernel
> zcela nepouzitelna, ale dokud neni na disku jediny 64 bitovy binar, tak
> by to melo byt fuk protoze se nepouzival.
>
>
> 5) na rade jsou systemove dynamicke knihovny (/lib, /usr/lib)
>
> 6) regenerovat databazi pro ldconfig
>
> 7) preinstalovat programy make a install
>
> 8) ted uz by to melo unest klasicky 'installworld'
>
> 9) restart
>
> mame konzistentni amd64-kernel/amd64-world system. Porty jsou stale
> i386, ale mely by bezet, protoze kompatibilita je pritomna
>
> 10) kompletni reinstalace portu na jejich amd64 varianty
>
> 11) odstranit upravy rc.conf
>
> 12) hotovo, restart
>
> ==================
>
> nesnazim se nekoho presvedcit at to jde zkouset - spis kdyby to nekoho
> zajimalo nebo to potreboval, nebo tam na prvni pohled videl nejaky zadrhel.

Nutne to nepotrebuju, je to jenom takove hrani...

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

>
> Dan

Oli


More information about the Users-l mailing list