ELF
aneb
Executable and Linkable Format

Tento dokument by rad seznamil sirsi linuxovou verejnost s novym binarnim formatem pouzivanym v OS Linux

Uvod

ELF. Kdyz se toto slovo asi pred rokem objevilo ve spojitosti s Linuxem malokdo vedel, co to znamena. Nikoho to z normalnich uzivatelu ani nezajimalo dokud se nezacaly objevovat knihovny prelozene ciste jen pro ELFy. A tim zacal velky problem s kompabilitou. Najednou zacalo vadit, ze to, co si stahneme z nejakeho ftp serveru nemuzeme rozbehout, protoze je to bud a) prelozene do ELFu, nebo b) pouziva knihovnu prelozenou do ELFu. A protoze normalni uzivatel si vetsinou nerad preklada knihovnu ( v a.out formatu to je docela umeni ), tak zacal byt nespokojeny. Nevrly. A nakonec nadavajici. Tak to by bylo, to co se tyka tech starsich uzivatelu.

Tak co to vlastne je?

ELF je zkrata za slovni spojeni "Executable and Linkable Format", coz ja prekladam jako "format pro spustitelne soubory a linkovani". Byl navrzen firmou USL ( UNIX System Laboratories ) a donedavna byl pouzivan jen v OS Solaris a System V Release 4.
Neznamena to ale, ze by bylo mozno spoustet programy prelozene pro Solaris nebo SV4, ale je teoreticky mozne ( a taky se to vyuziva pomoci modulu iBCS pro programy s BSD UN*u ) spoustet programy napsane pro stejnou radu procesoru a podobne UNI*y jako Linux na Linuxu. Jeho nejvetsi vyhoda, flexibilita pri linkaci, se nejvice projevi pri vytvareni sdilenych knihoven.
Naopak se jevi ELF trochu pomalejsi pri zavadeni programu do pameti. Nekteri lide to zmerili na 2% - 5% oproti a.out formatu.
ELF samozrejme neovlivni vyslednou rychlost programu, ovlivni jen delku zavadeni kodu do pameti.

Neni nutne mit vsechny programy v ELF formatu, protoze jadro dokaze zavest jak ELFy tak a.outy. Ale je to na ukor volne pameti, protoze je nutne mit v pameti napr. C knihovny jak pro ELF, tak pro a.out format.


Jak jej pouzivat

Snad nejvetsim prinosem je velike zjednoduseni pri vytvareni sdilenych knihoven. V drivejsich dobach ( dobach a.out binarniho formatu ) se vytvareni techto knihoven dostavalo do oblasti carovani ( aspon tak mi to pripadalo ). Kdo se chce dozvedet jak se to delalo tak at klikne zde.
Zato dnes staci udelat jen par veci:
  1. Prekompilovat zdrojaky, ktere se maji stat sdilenou knihovnou s prepinacem -fPIC. To znamena, ze kod bude generovan jako pozicne nezavisly, vhodny pro dynamicke linkovani, i presto, ze skoky jsou velmi vzdalene.
  2. provest linkaci tak, jak je napsano v nasledujicim prikladu:
    gcc -shared -Wl,-soname,libfoo.so.x -o libfoo.so.x.y objectfiles
    vysledna knihovna se bude jmenovat libfoo.x.y, kde:
  3. foo je jmeno knihovny
  4. x je major version number
  5. y je minor version number
  6. objectfiles jsou .o soubory prelozene vyse uvedenym zpusobem
A co dal? Kdyz chceme pouzit tuto knihovnu je mozno vyslednou prelozenou knihovnu ulozit do adresare ktery je uveden v:
  • konfiguracnim souboru /etc/ld.so.conf a pak spustit program ldconfig
  • promenne LD_LIBRARY_PATH ( ma stejny format jako napr. PATH )
  • Program, ktery ji pouziva, se musi linkovat napr. takto:
    gcc -Llibrarypath -llibraryname objectfiles -o program, kde:
  • librarypath je adresar, kde je knihovna umistena
  • libraryname jmeno knihovny bez predpony lib a pripony .so.x.y
  • objectfiles .o soubory prelozenych modulu
  • program vysledny program
  • Pak je pri behu programu knihovna automaticky zavedena do pameti.

    Jak vypada toky ELF zevnitr

    Toto by nemela byt zadna vivisekce. Veskere informace v tomto odstavci byly vypitvany z popisu ELF formatu v1.1 ( viz zde).
    tento odstavec je zatim nezpracovan


    Odkud jsem cerpal informace

    1. ELF-HOWTO ( mozno stahnout zde, popripade pokud mate nainstalovany Slackware 3.0 je mozno ho najit v adresari /usr/doc/faq/howto spolu s mnoha zajimavymi inforamcemi
    2. specifikace ELF formatu verze 1.1, mozno stahnout zde
    3. a ono se vlastne staci podivat do jadra ...

    Tento text sesmolil Radek Pospisil, mailujte mi a hlavne se podivejte na nasi linux page.