Selleks et aru saada, miks FreeBSD kasutab formaati ELF, pead esiteks natuke teadma hetkel UNIX®is käibeolevast kolmest ``domineerivast'' käivitatavast formaadist:
a.out(5)
Vanim, ``klassikaline'' UNIXi objektiformaat. See kasutab lühikest ja kompaktset päist, mis algab maagilise numbriga - seda kasutatakse tihti formaadi iseloomustamiseks (detaile loe man-lehelt a.out(5)) See formaat sisaldab kolme laetud segmenti: .text, .data, ja .bss, lisaks sümbolite ja stringide tabeleid.
COFF
SVR3 objektiformaat. Päis koosneb nüüd sektsioonitabelist, nii et sinu käsutuses võib nüüd olla rohkem kui ainult sektsioonid .text, .data, ja .bss.
ELF
COFF'i järeltulija, mis sisaldab palju sektsioone ning väärtusi kas 32-bitisel või 64-bitisel kujul. Üks suur puudus on see, et ELF loodi mõttega, et ühe süsteemiarhitektuuri kohta on vaid üks ABI. See eeldus on osutunud suhteliselt valeks ja isegi kommertsiaalses SYSV maailmas (kus on vähemalt kolm ABI't: SVR4, Solaris, SCO), ei ole see tõene.
FreeBSD üritab seda probleemi lahendada nii, et pakub utiili, mis varustab teadaolevat ELF-formaadis käivitatavat faili informatsiooniga ABI kohta, millega too ühildub. Rohkem infot leiad man-lehelt brandelf(1).
FreeBSD on pärit ``klassikalisest'' koolist ning kasutas formaati a.out(5) - tehnoloogia, mida on katsetatud ja tõestatud läbi BSD mitme väljalaskepõlvkonna, kuni haru 3.X ilmumiseni. Kuigi juba natuke enne seda aega oli FreeBSD süsteemil võimalik ehitada ja jooksutada kohalikke ELF-binaare (ja kerneleid), ei soovinud FreeBSD alguses anda ``survele'' alla ning seada vaikeformaadiks ELF'i. Miks? Kui Linuxi seltskond tegi valusa ülemineku ELF-formaadile, siis mitte seepärast, et saada lahti formaadist a.out, vaid pigem oma paindumatul jump-table'il baseeruva jagatud teekide mehhanismi tõttu, mis muutis jagatud teekide loomise nii müüjatele kui arendajatele väga raskeks. Kuna saadaolevate ELF'i tööriistade abil leiti sellele probleemile lahendus ning need tundusid nii ehk nii olevat tulevikusõna, oldi nõus maksma üleminekumaksu ning üleminek sai ka teoks. FreeBSD jagatud teekide mehhanism baseerub rohkem SunOS™'i stiilis jagatud teekide mehhanismile ning on seega väga lihtne kasutada.
Oot, aga miks nii palju erinevaid formaate?
Ennevanasti, pimedal ajal oli riistvara lihtsakoeline. See lihtne riistvara toetas lihtsat, väikest süsteemi. a.out suutis täielikult sellel lihtsalt süsteemil (PDP-11'l) binaare esindada. Kui inimesed sellest lihtsast süsteemist UNIXi portisid, jätsid nad selle formaadi alles, kuna algsetele UNIXi arhitektuuri portidele a'la Motorola 68k, VAXen jm., oli see piisav.
Seejärel leidis keegi tark riistvarainsener, et kui ta saaks sundida tarkvara tegema mõnd trikki, saaks ta disaini koomale tõmmata ning tema CPU tuum jookseks kiiremini. Kui see uutsorti riistvaral (praegu tuntud kui RISC) tööle pandi, ei sobinud selle riistvaraga a.out, nii et loodi palju uusi formaate, et saada uuelt riistvaralt paremaid tulemusi, kui seda lihtne a.out-formaat pakkuda suutis. Leiutati COFF, ECOFF, ja paar teist kummalist formaati, ning avastati nende piiratus, enne kui jäädi lõplikult ELF'i juurde.
Lisaks muutusid programmid üha kolossaalsemateks ning kettad (ja füüsiline mälu) olid veel suhteliselt väiksesed, nii et sündis jagatud teekide idee. Samuti muutus VM-süsteem keerulisemaks. Kuna kõiki neid uuendusi tehti formaadi a.out abil, suurenes tema kasulikkus üha. Lisaks soovisid inimesed töötamise ajal asju dünaamiliselt laadida ja programmiosi välja visata pealse seda, kui init-kood oli juba jooksnud - seda mälu ja saaleala kokkuhoiu eesmärgil. Keeled muutusid üha keerukamaks ja inimesed tahtsid, et koodi käivitataks automaatselt enne main funktsiooni väljakutsumist. a.out-formaati häkiti kõvasti, et kõik see saaks toimuda, ning asi töötas põhimõtteliselt mingi aja jooksul. Mõne aja pärast ei tulnud a.out enam kõikide nende probleemide lahendamisega toime ilma, et oleks pikenenud kood ja kõik keerulisemaks muutunud. Kuigi ELF lahendas need probleemid, oleks olnud valulik üle kolida olukorras, kus süsteem põhimõtteliselt töötas. Niisiis pidi ELF ootama aega, mil a.out'i säilitamine sellest veelgi valulikumaks muutus.
Samal ajal arenesid ehitustööriistad, mille baasil FreeBSD oma vastavad tööriistad välja töötas (peamiselt assembler ja loader), kahe paralleelse puuna. FreeBSD puu lisas jagatud teeke ning kõrvaldas mõned vead. GNU rahvas, kes need programmid algselt kirjutas, tegi need ümber ning lisas lihtsama toe cross-kompilaatorite ehitamiseks, erinevate formaatide sisselülitamiseks jne. Paljud inimesed soovisid ehitada cross-kompilaatoreid FreeBSD suunas ning neil ei olnud õnne, sest FreeBSD vanemad as-i ja ld sortsud ei tulnud ülesandega toime. Uus gnu tööriistade kett (binutils) toetab cross-kompileerimist, ELF-i, jagatud teeke, C++'i laiendusi jne. Lisaks annavad paljud müüjad välja ELF'i binaare ning FreeBSD peal on neid mõttekas jooksutada.
ELF on väljendusjõulisem kui a.out ja lubab baassüsteemi rohkem laiendada. ELF'i tööriistu on parem hooldada ning need pakuvad cross-kompileerimise tuge, mida paljud inimesed oluliseks peavad. ELF võib olla a.out-ist aeglasem, aga samas on selle mõõtmine raske. On ka muid detaile, milles kaks formaati erinevad, näiteks lehekülgede mappimine, init-koodi käsitsemine jm. Ükski neist pole eriti oluline, kuid tegu on siiski erinevustega. a.out'i in-time tugi eemaldatakse GENERIC-kernelist ning lõpuks kogu kernelist siis, kui pole enam vajadust jooksutada minevikust päritud a.out-programme.