Anketa

Ktorý návod by ste cheli ako ďalší?:

Partenské projekty

FreeBSD - Binárne formáty

Verzia pre tlačSend by emailPDF verzia

Aby sme pochopili, prečo systém FreeBSD používa formát binárnych (spustiteľných) súborov elf(5), musíme najskôr niečo vedieť o troch v súčasnosti “dominantných” spustiteľných formátoch pre UNIX®:

  • a.out(5)

    Najstarší a “klasický” objektový formát systému UNIX. Používa krátku kompaktnú hlavičku s magickým číslom na začiatku, ktoré sa často používa na charakterizovanie formátu (viď a.out(5)). Obsahuje tri načítavané segmenty: .text, .data, a .bss splu s tabuľkou symbolov a tabuľkou reťazcov.

  • COFF

    Objektový formát SVR3. V hlavičke tohto formátu sa nachádza tabuľka sekcií, takže môže obsahovať aj iné sekcie ako .text, .data, a .bss.

  • elf(5)

    Následník formátu COFF okrem viacerých sekcií umožňuje používať 32-bitové alebo 64-bitové hodnoty. Jednou nevýhodou je, že ELF bol navrhnutý s predpokladom, že môže byť len jedno ABI rozhranie v architektúre systému. Tento predpoklad sa teraz ukázal ako nesprávny, a to nie len v komerčnom SYSV svete (ktorý používa najmenej tri ABI rozhrania: SVR4, Solaris, SCO).

    Systém FreeBSD tento problém čiastočne rieši poskytnutím nástroja pre označkovanie známeho ako ELF s informáciou o rozhraní ABI. Viac informácií sa nachádza na man stránke brandelf(1).

Systém FreeBSD pochádza z “klasického” tábora a v minulosti používal formát a.out(5), ktorý bol dobre osvedčený a odskúšaný mnohými vydaniami BSD až do verzie 3.X. Pretože bolo možné zabudovať a spúšťať ELF súbory priamo v systéme (a jadrách), systém FreeBSD bol určitý čas chránený pred “nevyhnutným” prechodom na ELF. Prečo? V tom čase linuxové systémy bolestne prechádzali na formát ELF, nebolo jednoduché opustiť formát a.out, pretože mal svoju neprispôsobiteľnú tabuľku skokov založenú na mechanizme zdieľaných knižníc, ktorá veľmi sťažovala vývojárom vývoj zdieľaných knižníc. Vďaka nástrojom pre ELF sa poskytlo riešenie problému zdieľaných knižníc, ktoré umožnili “pohnúť sa vpred” a náklady na prechod sa stali akceptovateľnými. Mechanizmus zdieľaných knižníc FreeBSD je veľmi podobný mechanizmu systému SunOS™ a preto je ho možné veľmi jednoducho použiť.

Prečo existuje tak veľa rôznych formátov?

V minulosti sa používal jednoduchý hardvér. Tento jednoduchý hardvér podporovali jednoduché malé systémy. Formát a.out pre tieto jednoduché systémy úplne postačoval. Keď ľudia presunuli z týchto jednoduchých systémov na UNIX, ponechali v ňom formát a.out, pretože bol postačujúci pre skoré verzie systému UNIX pre architektúry ako Motorola 68k, VAXen, atď.

Potom nejakého hardvérového inžiniera osvietila myšlienka, že keď prinúti softvér urobiť niekoľko špinavých trikov, potom bude možné okresať návrh a umožniť jadru procesora aby fungovalo rýchlejšie. Pre tento nový druh hardvéru (známeho ako RISC) bol a.out nevhodný, preto začali vznikať nové formáty, ktoré mali poskytnúť lepší výkon na tomto hardvéri ako obmedzený formát a.out. Boli vymyslené formáty ako COFF, ECOFF a zopár ďalších, pokým sa skúmaním a objavovaním ich obmedzení nedospelo k formátu ELF.

Okrem toho sa veľkosť programov výrazne zväčšila a disky (a fyzická pamäť) zostala relatívne malá, takže sa zrodil koncept zdieľaných knižníc. Tiež systém virtuálnej pamäte sa stal sofistikovanejším. Aj napriek tomu, že všetky tieto zlepšenia boli urobené pomocou formátu a.out, jeho použiteľnosť sa s každou novou zmenou znižovala. Okrem toho ľudia chceli dynamicky načítavať veci počas behu programu alebo pripájať časti programu až po jeho inicializácii a za behu ukladať časti pamäte do swapovacieho priestoru. Programovacie jazyky sa stali komplikovanejšími a ľudia chceli volať kód ešte pred hlavným kódom. Boli používané najrôznejšie fígle pomocou formátu a.out, aby všetky tieto veci mohli fungovať a on ich v základnej forme zvládol. Časom však formát a.out prestal stačiť na vyriešenie týchto problémov bez zvýšenia režijných nákladov a zložitosti kódu. Aj keď formát ELF vyriešil mnoho týchto problémov, bolo veľmi bolestné prejsť na neho zo zatiaľ funkčného systému. Takže ELF musel počkať pokým nebolo nákladnejšie zostať pri formáte a.out než prejsť na nový formát ELF.

Ako čas plynul začali vznikať nástroje na zostavovanie kódu, od ktorých systém FreeBSD odvodil svoje nástroje (najmä assembler a zavádzač) a vznikli dve paralelné vetvy. Vetva FreeBSD pridala zdieľané knižnice a opravila niekoľko chýb. Rodina GNU, ktorá pôvodne napísala tieto programy ich prepísala a pridala podporu pre vytváranie krížových kompilátorov, pripájajúce rôzne formáty podľa potreby. Aj keď mnoho ľudí chcelo vytvárať krížové kompilátory zamerané na FreeBSD, mali smolu, pretože staršie zdrojové kódy, ktoré FreeBSD malo pre asld neboli vhodné pre túto úlohu. Nové nástroje GNU (binutils) začali podporovať krížové kompilovanie, ELF, zdieľané knižnice, rozšírenia C++, atď. Okrem toho mnoho výrobcov začalo vytvárať spustiteľné súbory vo formáte ELF a bolo dobré, že ich systém FreeBSD dokázal spúšťať.

Formát ELF dokáže viac ako a.out a umožňuje väčšiu rozšíriteľnosť v základnom systéme. Nástroje pre ELF sa ľahšie spravujú a poskytujú podporu pre krížové kompilovanie, čo je pre mnohých ľudí dôležité. ELF môže byť o niečo pomalší ako a.out, no je to takmer nemerateľné. Existuje mnoho podrobností, ktorými sa tieto formáty odlišujú ako napríklad spôsob mapovania stránok, obsluha inicializačného kódu atď. Žiadna z nich nie je veľmi podstatná, no sú v nich rozdiely. Časom sa podpora pre formát a.out odstránila z jadra GENERIC neskôr sa odstránila aj z ostatných jadier, pretože potreba spúšťania formátu a.out sa stala minulosťou.