Překladače 9. Generování cílového kódu Obsah: object kód, linker, relokace dynamické knihovny, loader PIC, PIE, spustitelný soubor formáty souborů ELF, EXE, COM, DLL ladění, core-dump logování, trasování, profilování systémy na sledování chyb © Milan Keršláger http://www.pslib.cz/ke/slajdy 21.4.2011 http://creativecommons.org/licenses/by-nc-nd/3.0/
Generování cílového kódu poslední fáze překladu vstup: mezikód výstup: object kód dále zpracovává linker vstup: object kód výstup: knihovna, spustitelný soubor soubory obsahují metadata, strojové instrukce, data lze využít atributovou gramatiku
Object kód typicky uložen v souboru unixové systémy: *.o, *.so obsahuje strojový kód (někdy přímo spustitelný) často obsahuje doplňující metadata relokační tabulka interní a externí identifikátory funkcí a proměnných přesněji: definované, nedefinované a interní ladící informace různé formáty unixové systémy: a.out, ELF Windows: COM, EXE
Linker typicky není součástí překladače vstupem je object kód (typicky více, knihovny) výstupem je hotový spustitelný soubor (knihovna) řeší odkazy na symboly pomocí sloučení více modulů, knihoven někdy ne úplně: výjimkou jsou dynamické knihovny rozhoduje o umístění v paměti relokace na výsledné místo relokatibilita může být zachována (PIC)
Relokace přizpůsobení kódu konkrétnímu umístění strojový kód používá absolutní adresy při nahrání kódu na jinou adresu by nefungovalo modifikace absolutních adres podle relokační tabulky nebo vyřešení symbolů relokační tabulka je součástí spustitelného souboru probíhá typicky dvakrát linker – při sestavování výstupního kódu loader – při startu programu (dynamické knihovny)
Dynamické knihovny možnost relokace neví se, kde v adresním prostoru bude místo problém zejména IA-32 (jen 4, resp. 2 GiB) zavaděč rozhodne při startu programu snaha o maximalizaci sdílení knihoven nemusí být možné – kolize s knihovnou, kódem nejvýhodnější rozložení lze vypočítat Linux: prelink, Windows: Microsoft při kompilaci DLL oboje relokace na vhodnou adresy předem zrychlení startu (některých) programů
Loader zavaděč programu do paměti poměrně komplikovaná úloha zejména ve spojitosti s dynamickými knihovnami velký měnící se počet, netriviální optimalizace výsledku typicky samostatný (speciální) program kontrola oprávnění a nároků programu vyřešení nedefinovaných symbolů (+ preload) nakopírování programu a knihoven do paměti nastavení sdílené paměti pro knihovny (cizí, vlastní) předání argumentů z příkazového řádku inicializace registrů a skok na začátek (_start)
PIC a PIE Position Independent Code funguje na jakékoliv adrese nepotřebuje tedy relokaci (resp. modifikaci) vyžadována podpora instrukcí s relativní adresou v CPU využíváno u knihoven Position Independent Executable v Linuxu bezpečnostní opatření kód je nahrán na „náhodnou“ adresu na IA-32 silně omezené množství cílových adres ztěžuje některé útoky (přepsání zásobníku)
Spustitelný soubor program ve vykonatelné podobě typicky soubor se strojovým kódem různé formáty (ELF, EXE, COM, ...) též bytecode (Java) nebo skript (interpretace) specifické odlišení od ostatních souborů unixové systémy: nastaveno oprávnění „spustitelný“ Windows: přípona .EXE, .COM, ale též .DLL a další specifický obsah pro danou platformu, architekturu systémová volání, instrukční sada, metadata → ABI (binární rozhraní) → též Wine na Linuxu
ELF Executable and Linkable Format původně pro Unix System V jako definované ABI 1999 – zvoleno pro unixové systémy spustitelné soubory, sdílené knihovny, object kód, core flexibilní a rozšiřitelný formát hlavička, segmenty, sekce, data není vztažen k jedné architektuře Linux, PlayStation, Nintendo, OpenVMS, ... nástroje: readelf, objdump, file
EXE Executable (formát a přípona souboru) několik variant DOS (MZ, NE), Windows (NE, LX, PE), OS/2 (LE, LX) mnoho dalších interních variant, ale i komprimované atd. Windows EXE má na začátku MZ, který vypíše zhruba: „Tento program nelze spustit v prostředí DOSu“ kromě metadat a kódu i další data („resources“) ikony, bitmapy, fonty, HTML dokument, ... sekce pro různé platformy (viz výše) PE – Portable Executable modifikovaný unixový COFF formát
COM Command file (formát a přípona souboru) dědictví z CP/M (v DOS, Windows) tj. též formát spustitelného souboru (16bitový kód) neplést s doménou .com (např. www.google.com) závislý na NTVDM (není na 64bitových systémech) bez hlavičky, jen strojový kód a data velikost omezena na 0xFF00 (65280 bajtů) nahrán od adresy 0x0100 COMMAND.COM shell (interpret příkazového řádku) pro DOS
DLL implementace sdílených knihoven též přípony .OCX (ActiveX control), .DRV (ovladač) stejný formát, jako EXE → PE verze není součástí názvu problémy koexistence různých verzí → DLL hell Microsoft neposkytuje správu, aktualizace atd. snadno sdílitelné mezi stejnými aplikacemi nesnadno sdílitelné mezi různými aplikacemi COM model rozšiřuje koncept DLL knihoven volání funkce v DLL knihovně (jako dlopen v POSIXu) rozšířeno na volání mezi procesy nebo i mezi počítači
Ladění hledání chyb v programech (bug → debugging) testování programu (tzv. QA) ladící výpisy (doplňující hlášení programu) ladící nástroje (debugger, speciální knihovny, ...) atd. v nižších jazycích → skryté potíže přepsání části paměti → obtížná reprodukovatelnost breakpoint bod přerušení běhu programu traceback ladící výpis, vyšší jazyky odchytávání výjimek vzdálené ladění, post-mortem (core), anti- debugging
Výpis obrazu paměti tzv. core dump zachycení stavu programu v určitém okamžiku typicky při havárii včetně souvisejících údajů registry CPU, prostředí programu, stav zásobníku, ... lze však prakticky v jakémkoliv okamžiku dříve používáno pro CPU bez podpory ladění analýza speciálním nástrojem (debugger) původně jen lineární obsah paměti dnes např. formát ELF z bezpečnostních důvodů typicky vypnuto výpis paměti jádra při pádu OS – po síti
Systém pro sledování chyb typicky databáze uživatel hlásí potíže přidělení technikovi komunikace technik – uživatel forma vyřešení problému „not a bug“, „deffer“, „fixed“, „on QA“, atd. umožňuje statistické zpracování v které části programu jsou kritické chyby které chyby se změní na „vlastnosti“ někdy je odstranění chyby bolestivější, než ignorování
Logování a trasování logování záznam činnosti (pro správce systému) tedy „co program udělal“ srozumitelné bez pochopení fungování programu využívá specifický subsystém Unix: syslog, Windows: Event Logger trasování slouží k ladění a diagnostice využíváno při vývoji software (i modif. zdroj. kódu) záznam (mezi) akcí nebo okolností předpokládá přítomnost vývojáře
Profilování slouží pro optimalizaci programu využívá speciální nástroje za běhu programu analýza využití kódu nebo paměti měření doby vykonávání úseků kódu (funkcí) záznam volání knihovních funkcí (prof) vytváření grafického záznamu (grafy) instrumentace modifikování zdrojového kódu modifikace binárního tvaru
Běhové prostředí zajišťuje běh (přeloženého) programu součást spustitelného souboru např. pro Borland Pascal (pro DOS) samostatná komponenta pro komplikovanější prostředí a jazyky JRE (Java Runtime Environment) .NET, Visual Basic, … zajišťuje přetypování proměnných, ošetření výjimek (např. dělení nulou), plánování procesoru (Win16), (základní) knihovní funkce, interpretaci kódu a podobně