PB173 - Binární programování Linux III. Binární objektové soubory Jiri Slabý Fakulta informatiky Masarykova univerzita 4. 10. 2016 Jiri Slabý (Fakulta informatiky, MU) PB173/05 4. 10. 2016 1/16 Obsah cvičení Q Objektové soubory 0 libbfd Jiri Slabý (Fakulta informatiky, MU) PB173/05 4. 10. 2016 2/16 Sekce 1 Objektové soubory Jiri Slabý (Fakulta informatiky, MU) PB173/05 4. 10. 2016 3/16 Objektové soubory • Binární soubory s kódem (a daty) • Mohou mít různý formát • Výstup překladače • gcc -c produkuje .o • Obvykle nespustitelný objekt • Výstup linkeru • Statická/dynamická knihovna • Spustitelná binárka Jiri Slabý (Fakulta informatiky, MU) PB173/05 4. 10. 2016 4/16 Obsah objektových souborů • Obvykle • Identifikace souboru • ELF, PE, ... • Informace o souboru • Cílová architektura, struktura, ... • Kód • Data • Ostatní informace potřebné k běhu/linkování • Relokace, informace o symbolech atd. 9 Ale také např. • Ladicí informace • Informace o překladači • Tyto informace bývají v oddílech - tzv. sekcích Jiri Slabý (Fakulta informatiky, MU) PB173/05 4. 10. 2016 5/16 Úkol Práce s objektovým souborem O Vyberte si nějaký objektový soubor • Např. /bin/true O Vypište si informace o souboru • objdump -f O Vypište si seznam sekcí • objdump -h Vypište si dump sekce .rodata • objdump -s -j .rodata 0 Vypište si debug info • objdump -Wi • Pravděpodobně se nevypíše nic - proč? Jiri Slabý (Fakulta informatiky, MU) PB173/05 4. 10. 2016 6/16 Formáty objektových souborů • Několik forem/standardů • a.out (UNIX/starý Linux) • ELF (Linux) • COM (DOS, čistě kód+data, nic víc) • COFF (UNIX, ELF ho převálcoval) • MZ (DOS .exe) • PE (Windows .exe, vychází z COFF) Demo: DosBox a reboot přes COM (ea f o f f 00 Jiri Slabý (Fakulta informatiky MU) PB173/05 4. 10. 2016 7/16 Úkol Objdump neumí jen ELF O Stáhněte si nějakou Windows aplikaci • Cokoliv, co je .exe (PE), např. putty O Vypište si informace o souboru • objdump -f O Vypište si informace závislé na formátu • objdump -p • Zjistěte DLL, na kterých váš program závisí O Porovnejte sekce s předchozím úkolem Jiri Slabý (Fakulta informatiky, MU) PB173/05 4. 10. 2016 8/16 Sekce 2 libbfd Jiri Slabý (Fakulta informatiky, MU) PB173/05 4. 10. 2016 9/16 libbfd • Knihovna pro práci s různými binárními formáty (bfd.h, v binutils) • a.out, ELF, PE, binární, ... • Seznam: const char **bfd_target_list() • A různými architekturami • Seznam: const char **bfd_arch_list() • Dokumentace 9 https://sourceware.org/binutils/docs/bfd/ o Některá užitečná makra bez dokumentace (jen v bf d. h) • Knihovny při překladu: gcc ... -lbfd -liberty -ldl -lz • Nutno inicializovat pomocí void bfd_init() Jiri Slabý (Fakulta informatiky MU) PB173/05 4. 10. 2016 10/16 Chyby Jak zjistit, co se stalo? Poslední Chyba:bfd_error_type bfd_get_error() • Převod na tGXt: const char *bf d_errmsg(bf d_error_type error_tag) Typicky ] if (Ibfdjunction (...) ) errx(1, "bfd_function: %s", bfd_errmsg(bfd_get_error())); I Jiri Slabý (Fakulta informatiky MU) PB173/05 4. 10. 2016 11 /16 Úkol Výpis podporovaných formátů a architektur vaší libbf d Doplňujte pbl73-bin/03/bfd.c O Zavolejte bf d_target_list O Vypište návratové hodnoty (v cyklu) • Dokud nenarazíte na null O Zavolejte bf d_arch_list O Vypište návratové hodnoty (v cyklu) • Dokud nenarazíte na null O Přeložte a spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/05 4. 10. 2016 12/16 Soubory • Otevření • bfd *bfd_openr(const char *file, const char *target) • bfd *bfd_openw(const char *file, const char *target) • Jako target používejte NULL • Návratová hodnota se používá jako držátko • Ověření • Nutné před prací se souborem 9 bfd_boolean bfd_check_format(bfd *b, bfd_format fmt) a Jako fmt používejte bfd_object • Zavření • bfd_boolean bfd_close(bfd *b) Příklad b = bfd_openr("file", NULL); if (!bfd_check_format(b, bfd_object)) warnx("Not an object!"); bfd_close(b); Jiri Slabý (Fakulta informatiky MU) PB173/05 4. 10. 2016 13/16 Úkol Doplňte otevírání souboru zadaného jako parametr programu O Zavolejte bfd.openr Q Zavolejte bf d_check_f ormat O Zavolejte bf d.ciose O Ověřujte návratové hodnoty podle manuálu • Vypisujte chyby při neúspěchu O Přeložte a spusťte Jiri Slabý (Fakulta informatiky MU) PB173/05 4. 10. 2016 14/16 Sekce • Pro každou existuje struktura asection • Jméno: bfd_get_section_name • Velikost: bf d_get/set_section_size • Obsah: bfd_get/set_section_contents • A další: f lags, vma, lma, ... • Nalezení: bfd_get_section_by_name • Iterace: bfd_map_over_sections • Háček, který se zavolá pro (skoro) každou sekci 9 Vytvoření: bf d_make_section_with_f lags • Flags: sec_has_contents, pokud má sekce i obsah Jiri Slabý (Fakulta informatiky MU) PB173/05 4. 10. 2016 15/16 Úkol Hexdump sekcí (součást domácího) O Iterujte přes sekce (bf d_map_over_sect Q Vypište údaje o každé sekci 9 Název • Velikost • Flags • Hexdump prvních 16 bytů obsahu O Přeložte O Spusťte • Pro ELF • Pro PE Jiri Slabý (Fakulta informatiky, MU) PB173/05 4.10.2016 16/16