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 <[email protected]>.
Per domande su questa documentazione, invia una e-mail a <[email protected]>.