Per comprendere il motivo per cui FreeBSD usa il formato elf(5), devi prima conoscere un pò i tre attuali formati eseguibili «dominanti» per UNIX®:
Il più vecchio e «classico» formato oggetto di UNIX®. Usa un'intestazione corta e compatta con un numero magico all'inizio che è spesso usato per caratterizzare il formato (vedere a.out(5) per maggiori dettagli). Contiene tre segmenti caricabili: .text, .data, e .bss più una tabella di simboli e una di stringhe.
COFF
Il formato oggetto di SVR3. Poichè l'intestazione include una porzione di tabella, puoi avere molto di più delle sole sezioni .text, .data, e .bss.
Il successore di COFF, caratterizzato da sezioni multiple e da possibili valori a 32-bit o 64-bit. Uno dei maggiori svantaggi: ELF fu progettato con l'assunzione che ci doveva essere solo un ABI per ogni tipo di architettura dei sistemi. Tale assunzione è in realtà piuttosto sbagliata, e non è vera nemmeno nel mondo commerciale di SYSV (che ha almeno tre ABI: SVR4, Solaris, SCO).
FreeBSD tenta di aggirare questo problema fornendo un utility per marchiare un eseguibile ELF con informazioni sull'ABI per il quale è stato costruito. Guarda la pagina man brandelf(1) per maggiori informazioni.
FreeBSD proviene dalla scuola «classica» e ha usato il
formato a.out(5), una tecnologia sperimentata ed utilizzata
attraverso molte generazioni delle release BSD, fino agli inizi del ramo
3.X. Sebbene fino ad allora era possibile costruire ed eseguire su
un sistema FreeBSD binari (e kernel) del formato ELF,
inizialmente FreeBSD si oppose al «salto» di cambiamento al
formato ELF come formato di default. Per quale motivo?
Dunque, quando la scuola Linux fece il suo doloroso passaggio a
ELF, questo non era sufficiente per abbandonare
il formato eseguibile a.out
a causa del loro
rigido meccanismo a salto-di-tabella basato sulla libreria condivisa, il
quale rendeva la costruzione di librerie condivise un compito molto
difficile tanto per i venditori che per gli sviluppatori. Tuttavia,
quando gli strumenti di ELF furono in grado di offrire
una soluzione al problema della libreria condivisa e quando furono visti
come «la strada imminente», il costo della migrazione
fu accettato poichè necessario e avvenne così la
transizione. Il meccanismo di libreria condivisa di FreeBSD è
basato sullo stile più restrittivo del meccanismo di libreria
condivisa degli SunOS™ di Sun, e come tale, è molto facile da
utilizzare.
Quindi, perchè ci sono così tanti formati differenti?
In passato l'hardware era semplice. Questo hardware semplice
sosteneva un sistema semplice e piccolo. Il formato
a.out
era del tutto adatto per rappresentare i binari
su questo semplice sistema (un PDP-11). Nonostante le persone fecero il
port di UNIX® da questo semplice sistema, esse mantennero il formato
a.out
poichè era sufficiente per un primo port
di UNIX® verso architetture come Motorola 68k, VAXen, ecc.
All'epoca alcuni ingegneri hardware di spicco stabilirono che se tale
formato poteva forzare il software a fare alcuni trucchi sporchi, allora
esso sarebbe stato in grado di abbattere alcune barriere di progettazione
e permettere al core della CPU di andare più veloce. Benchè
il formato a.out
fu progettato per lavorare
con questo nuovo tipo di hardware (conosciuto ai giorni d'oggi come
RISC), esso fu appena sufficiente per questo
hardware, quindi furono sviluppati altri formati per ottenere delle
prestazioni da questo hardware migliori di quelle che il limitato e
semplice formato a.out
era in grado di offrire.
Furono inventati formati come il COFF,
l'ECOFF, e alcuni altri e furono esaminate le loro
limitazioni prima che fu prodotto l'ELF.
Per di più, le dimensioni dei programmi stavano diventando
enormi e i dischi (e la memoria fisica) erano ancora relativamente
piccoli, e quindi il concetto di libreria condivisa prese piede.
Inoltre il sistema di VM (Memoria Virtuale) divenne più
sofisticato. Benchè ognuno di questi miglioramenti fu fatto
utilizzando il formato a.out
, la sua utilità
si distese sempre più con ogni nuova caratteristica. In aggiunta,
la gente voleva caricare alcune cose in modo dinamico al tempo di
esecuzione, o anche scartare parte dei loro programmi dopo l'esecuzione
del codice iniziale al fine di salvare memoria e spazio di swap.
I linguaggi divennero più sofisticati e le persone desideravano che
il codice venisse chiamato dopo il main in modo automatico. Furono
apportati molte migliorie al formato a.out
per
permettere tutte queste cose, e sostanzialmente tutto funzionò per
un dato periodo. Col passare del tempo, il formato
a.out
non fu più in grado di gestire
tutti questi problemi senza apportare dei miglioramenti al codice con
un conseguente aumento della complessità. Benchè il formato
ELF risolveva molti di questi problemi, era doloroso
migrare da un sistema che tutto sommato funzionava. Quindi il formato
ELF attese fino a quando fu meno doloroso
rimanere con il formato a.out
piuttosto che migrare
al formato ELF.
Tuttavia, il tempo passò, e gli strumenti di costruzione che FreeBSD derivò dai loro strumenti di costruzione (in particolare l'assemblatore ed il loader) evolsero in due tronconi paralleli. L'albero di FreeBSD aggiunse le librerie condivise e sistemò alcuni bug. Il popolo di GNU che in origine aveva scritto questi programmi li riscrisse e aggiunse un semplice supporto per la costruzione di compilatori cross, la possibilità di produrre formati diversi a piacimento, e così via. Da quando molte persone vollero costruire compilatori cross per FreeBSD, questi furono delusi poichè i vecchi sorgenti che FreeBSD aveva per as e ld non erano pronti per questo lavoro. La nuova serie di strumenti di GNU (binutils) supportavano la compilazione cross, ELF, le librerie condivise, le estensioni C++, ecc. Inoltre molti venditori stanno rilasciando binari ELF, ed è una buona cosa per FreeBSD eseguirli.
Il formato ELF è più espressivo di
quello a.out
e permette una maggiore
estensibilità nel sistema base. Gli strumenti di
ELF sono meglio mantenuti, e offrono un supporto alla
compilazione cross, che sta a cuore a molte persone.
ELF può essere un pò meno veloce di
a.out
, ma tentare di misurarne le prestazioni non
è molto semplice. Ci sono anche numerosi dettagli che sono diversi
tra i due formati nel modo in cui essi mappano le pagine, gestiscono il
codice iniziale, ecc. Questi dettagli non sono molto importanti, ma tra i
due esistono delle differenze. Nel tempo il supporto per il formato
a.out
verrà rimosso dal kernel
GENERIC
, e alla fine sarà rimosso
completamente dal kernel non appena non ci sarà più la
necessità di eseguire programmi con il formato
a.out
.
Questo, ed altri documenti, possono essere scaricati da ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Per domande su FreeBSD, leggi la
documentazione prima di contattare
<questions@FreeBSD.org>.
Per domande su questa documentazione, invia una e-mail a
<doc@FreeBSD.org>.