Avanti Indietro Indice

2. Installazione

2.1 Background

Lo scopo di questa conversione è quello di rimanere con un sistema che sia in grado di costruire e di far girare i programmi in ELF e col sistema a.out, con entrambe i tipi di programmi in grado di trovare le rispettive famiglie di librerie condivise. Questo ovviamente richiede un pò più di intelligenza nella ricerca delle librerie rispetto al semplice `guarda in /lib, /usr/lib e in tutti i posti in cui il programma è stato detto di cercare'.

La bestiola responsabile di ricercare le librerie in linux è /lib/ld.so. Il compilatore ed il linker non inseriscono nel codice i percorsi assoluti delle librerie dentro i programmi; inseriscono invece il nome delle librerie, e il percorso assoluto di ld.so, e lasciano che sia ld.so ad associare il nome della libreria al percorso adeguato al runtime. Questo ha un effetto molto importante --- significa che le librerie che un programma usa, possono essere mosse verso altre directory senza ricompilare il programma , semprechè a ld.so sia stato detto di cercare nelle nuove directory. Questa è una funzionalità essenziale per l'operazione di scambio delle directory che segue.

Ne consegue che, naturalmente, ogni tentativo di cancellare o spostare ld.so causerà il fatto che ogni programma che sia linkato dinamicamente sul sistema linux, cesserà di funzionare. Questa è generalmente ritenuta una cattiva cosa...

Per il codice binario in ELF, viene fornito un dynamic loader (caricatore dinamico del codice) alternativo. Si chiama /lib/ld-linux.so.1, e fa esattamente le stesse cose di ld.so, ma per i programmi in ELF. ld-linux.so.1 usa gli stessi programmi e gli stessi file di supporto (ldd, ldconfig, e /etc/ld.so.conf, che vengono usati dal loader del formato a.out.

L'idea di base, poi, è che le cose che riguardano lo sviluppo in ELF (compilatori, include files e librerie) vadano in /usr/{bin,lib,include} dove attualmente si trovano quelle che riguardano l'a.out, e che queste ultime vadano spostate in /usr/i486-linuxaout/{bin,lib,include}. /etc/ld.so.conf farà una lista di tutti i posti dove ci si può aspettare di trovare una libreria, e ldconfig è abbastanza intelligente da distinguere tra le varianti di ELF e di a.out.

Ci sono un paio di eccezioni al piazzamento delle librerie, tuttavia.

2.2 Prima di partire --- Note e diffide

2.3 Si avrà bisogno di...

I seguenti pacchetti sono disponibili a ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ e a ftp://sunsite.unc.edu/pub/Linux/GCC/. Entrambe i siti sono ampiamente distribuiti in giro per il mondo; per favore, prendetevi il tempo necessario per cercare il sito più vicino a voi. E` più veloce per voi e per chiunque altro.

Questi pacchetti (sia la versione mostrata qui che qualunque altra successiva) sono richiesti. Scaricate e leggete anche le varie release notes per ciascuno di essi: questi sono i file chiamati release.packagename. Questo specialmente se si scaricano versioni più recenti di quelle descritte qui, poichè la procedura può essere cambiata.

2.4 Ridisponendo il proprio filesystem

Bene.... Si noti che in tutto quel che segue, quando io dico `si rimuova', naturalmente intendo `si faccia un backup e poi si rimuova' :-). Inoltre, queste istruzioni si applicano direttamente soltanto alle persone che non hanno già smanettato con l'ELF --- quelli che ci si aspetta abbiano già la capacità di adattare le cose in modo appropriato. Andiamo!

  1. Creare le nuove directory verso cui si sposteranno le cose di a.out

    mkdir -p /usr/i486-linuxaout/bin
    mkdir -p /usr/i486-linuxaout/include
    mkdir -p /usr/i486-linuxaout/lib
    mkdir /lib-aout
    

  2. Si scompatti il pacchetto del linker dinamico ld.so-1.7.3 nella directory in cui di solito si mette il codice sorgente, poi si legga lo script ld.so-1.7.3/instldso.sh appena estratto. Se si ha un sistema realmente standard, è sufficiente farlo girare digitando sh instldso.sh, ma se si ha qualcosa di insolito allora si faccia l'installazione a mano. `Qualcosa di insolito' comprende
  3. Si editi /etc/ld.so.conf per aggiungere le nuove directory /usr/i486-linuxaout/lib (e /lib-aout se si pensa di averne bisogno). Poi si faccia girare /sbin/ldconfig -v per controllare che sono state caricate le nuove directory.
  4. Si muovano tutte le librerie a.out da /usr/*/lib a /usr/i486-linuxaout/lib. Si noti che ho scritto `librerie' non `qualunque cosa'. Quindi si intende i file che rispondono al nome di lib*.so* , lib*.sa*, o lib*.a. Non si incominci a spostare /usr/lib/gcc-lib o niente di sciocco come questo in giro.
  5. Adesso si guardi a /lib. Si lasci intatto libc.so*, libm.so*, e libdl.so*. Se si hano link simbolici a librerie X (libX*.so.3*) lasciate li anche questi --- XView e qualche altro pacchetto potrebbe averne bisogno. Si lasci ld.so*, ld-linux.so* e qualunque altro file che comincia con ld. Per le librerie rimanenti, (se ne avete qualcuna): se si ha /usr sulla partizione root, si mettano in /usr/i486-linuxaout/lib. Se si ha /usr montata separatamente, si mettano in /lib-aout. Adesso si faccia girare ldconfig -v
  6. Si rimuova la directory /usr/lib/ldscripts se è li, per la preparazione all'installazione delle utility binarie (che la ricreeranno).
  7. Si rimuova qualsiasi copia di ld e di as (eccetto ld86 e as86) che si può trovare in /usr/bin.
  8. Alcune versioni del GNU tar sembrano avere problemi riguardo ai link simbolici nella directory di destinazione. Si hanno due possibilità a questo punto:
    1. (perferibilmente) Si usi cpio invece di tar, poichè non ha questo problema. zcat /ovunque/sia/stato/messo/libc-5.0.9.tar.gz | cpio -iv è l'incantesimo magico qui, che deve essere eseguito dalla directory root.
    2. (se non si ha installato cpio) Prima di installare le immagini della libc, si può andare in /usr/include e rimuovere alcune parti. Questa è brutta. Molti pacchetti (come ncurses) sono installati in /usr/include dai manutentori della distribuzione e non sono fornite con la libreria C. Si faccia un backup dell'albero della directory /usr/include, si usi tar tzf per vedere cosa c'è nell'archivio prima di scompattarlo, poi cancellare le poche cose di /usr/include che sono al momento contenute. Poi si scompatti il file libc-5.0.9.bin.tar.gz dalla directory root.
  9. installare il pacchettocon le utility binarie. tar -xvzf binutils-2.5.2.l17.bin.tar.gz -C / è una buona maniera per farlo.
  10. A questo punto è stato installato tutto quello che serve per far girare gli eseguibili in ELF. Gli esperti medici raccomandano che i lavoratori VDU (VDU è un acronimo per Video Display Unit, quindi si indicano qui i lavoratori che usano qualunque dispositivo con un monitor N.d.T.) prendano delle pause regolari dallo schermo; questo sarebbe un momento opportuno. Non si dimentichi quello che si stava facendo tuttavia, a seconda della versione di gcc che si stava precedentemente usando, è possibile che non si sia in grado di compilare programmi in formato a.out, fino a che non si installa il nuovo gcc.
  11. fare il backup e cancellare tutto in /usr/lib/gcc-lib/{i486-linux, i486-linuxelf, i486-linuxaout}/ Se si usa un driver gcc non standard, (per esempio se si usa il GNU ADA), si copi anche quello in un posto sicuro. Poi si installi in pacchetto gcc, di nuovo scompattando il tutto dalla directory root.
  12. Alcuni programmi (solitamente vari programmi per X) usano /lib/cpp, che generalmente sotto linux è un link a /usr/lib/gcc-lib/i486-linux/version/cpp. Siccome ilpasso precedente ha cancellato qualsiasi versione a cui cpp stava puntando, bisognerà ricreare il link:
    $ cd /lib
    $ ln -s /usr/lib/gcc-lib/i486-linux/2.7.0/cpp .
    
  13. La gente di FSSTND hanno ancora una volta giustificato la loro esistenza muovendo i file utmp e wtmp da /var/adm a /var/run e a /var/log rispettivamente. Bisognerà aggiungere alcuni link che dipendono da dove attualmente questi risiedono, e può essere necessario creare le directory /var/log and /var/adm. Io ho riprodotto qui sotto l'output del comando ls -l delle parti appropriate del mio sistema:
    $ ls -ld /var/adm /var/log /var/run /var/log/*tmp /var/run/*tmp
    lrwxrwxrwx   1 root     root            3 May 24 05:53 /var/adm -> log/
    drwxr-xr-x   9 root     root         1024 Aug 13 23:17 /var/log/
    lrwxrwxrwx   1 root     root           11 Aug 13 23:17 /var/log/utmp -> ../run/utmp
    -rw-r--r--   1 root     root       451472 Aug 13 23:00 /var/log/wtmp
    drwxr-xr-x   2 root     root         1024 Aug 13 23:17 /var/run/
    -rw-r--r--   1 root     root          448 Aug 13 23:00 /var/run/utmp
    
    Si controlli il FSSTND (dagli archivi LDP come ftp://sunsite.unc.edu/pub/Linux/docs/fsstnd/) per la storia completa.
  14. Questo passo è opzionale. Se si ha intenzione di continuare a compilare programmi in formato a.out, questo è il momento ideale per installare libc.so 4.7 x. Lo si scompatti dalla directory root, poichè a questo punto si è senz'altro in grado di farlo senza ulteriori spiegazioni.

Fatto! Semplici test che si possono provare sono:


$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-linux/2.7.0/specs
gcc version 2.7.0
$ gcc -v -b i486-linuxaout
Reading specs from /usr/lib/gcc-lib/i486-linuxaout/2.7.0/specs
gcc version 2.7.0
$ ld -V
ld version cygnus/linux-2.5.2l.14 (with BFD cygnus/linux-2.5.2l.11)
  Supported emulations:
   elf_i386
   i386linux
   i386coff

seguiti ovviamente dal tradizionale programma ``Hello World''. Si provi con gcc e con gcc -b i486-linuxaout per verificare che sia il compilatore ELF, sia il compilatore a.out sono configurati correttamente.

2.5 Come dovrebbe sembrare (schema della struttura delle directory)

Questa è una guida deliberatamente vaga a che cosa sono i files che avete appena installato. Può essere utile per la soluzione di problemi, o per decidere cosa cancellare.

/lib

/usr/lib

/usr/lib/ldscripts

/usr/i486-linux/bin

/usr/i486-linuxaout/bin

/usr/i486-linux/lib

/usr/i486-linuxaout/lib

/usr/lib/gcc-lib/i486-linux/2.7.0

/usr/lib/gcc-lib/i486-linuxaout/2.7.0

2.6 Errori comuni (Niente Panico!)

... in grandi lettere amichevoli.

Avete spostato le cose sbagliate e non funziona nulla.

Avete ancora una shell in grado di girare, tuttavia, e con un pò di ingenuità potete fare un sacco di cose con le caratteristiche intrinseche della shell. Ricordate che echo * è un sostituto accettabile per ls, e che echo >>filename può essere usato per aggiungere linee ad un file. Inoltre non dimenticate che ldconfig è linkato staticamente. Se avete spostato, ad esempio, libc.so.4 in /lib-aout erroneamente, potete fare echo "lib-aout" >>/etc/ld.so.conf ; ldconfig -v ed essere di nuovo a posto. se avete spostato /lib/ld.so potete essere capaci di fare sln /stupido/posto/ld.so /lib/ld.so, se avete una copia di ln linkata staticamente, e probabilmente vi ritroverete con tutto a posto.

no such file or directory: /usr/bin/gcc

... quando sapete che esiste quel file. Questo solitamente significa che il loader dinamico dell'ELF /lib/ld-linux.so.1 non è installato, o non è leggibile per qualche motivo. Dovreste averlo installato al passo 2 in precedenza.

not a ZMAGIC file, skipping

dal comando ldconfig. Questo è perchè avete una vecchia versione del pacchetto ld.so, così dovete prenderne una nuova. Riguardate il passo 2dell'installazione.

bad address

tentando di far girare qualunque cosa in ELF. State usando il kernel 1.3.x, dove x<3. Fate un upgrade alla versione 1.3.3 oppure fate un downgrade a qualche versione 1.2.x

_setutent: Can't open utmp file

Questo messaggio è spesso visto in multipli di tre quando si fa partire un xterm. Andate avanti e leggete il papiro sul FSSTND verso la fine della procedura di installazione.

gcc: installation problem, cannot exec qualcosa: No such file or directory

Quando si tenta di fare una compilazione in a.out (qualcosa in genere sono cpp o cc1). Può essere sia una cosa corretta, oppure verosimilmente avete digitato

$ gcc -b -i486-linuxaout

quando avreste dovuto digitare

$ gcc -b i486-linuxaout

Notate che `i486' non inizia con un meno.


Avanti Indietro Indice