PB173 - Binární programování Linux III. Binární objektové soubory Jiri Slabý Fakulta informatiky Masarykova univerzita 8. 10. 2015 Jiri Slabý (Fakulta informatiky, MU) PB173/05 8. 10. 2015 1 /16 Obsah cvičení Q Objektové soubory Q libbfd Jiri Slabý (Fakulta informatiky, MU) PB173/05 8.10.2015 2/ 16 Sekce 1 Objektové soubory Jiri Slabý (Fakulta informatiky, MU) PB173/05 8. 10. 2015 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 8.10.2015 4/ 16 Obsah objektových souborů • Obvykle • Identifikace souboru • Informace o souboru • Cílová architektura, struktura,... • Kód • Data • Ostatní informace potřebné k běhu/linkování • Relokace, informace o symbolech atd. • 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 8. 10. 2015 5/16 Úkol Práce s objektovým souborem O Vyberte si nějaký objektový soubor • Např. /bin/true Q Vypište si informace o souboru • objdump -f O Vypište si seznam sekcí • objdump -h O Vypište si dump sekce .rodata • objdump -s -j .rodata O Vypište si debug info • objdump -Wi • Pravděpodobně se nevypíše nic - proč? Jiri Slabý (Fakulta informatiky, MU) PB173/05 8. 10. 2015 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) o 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 0 f f 00 f 0) Jiri Slabý (Fakulta informatiky, MU) PB173/05 8. 10. 2015 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 8. 10. 2015 8/16 Sekce 2 libbfd Jiri Slabý (Fakulta informatiky, MU) PB173/05 8. 10. 2015 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 • https://sourceware.org/binutils/docs/bfd/ • Některá užitečná makra bez dokumentace (jen v bfd.h) • Knihovny při překladu: gcc ... -lbf d -liberty -ldi -iz • Nutno inicializovat pomocí void bfd_init() Jiri Slabý (Fakulta informatiky, MU) PB173/05 8. 10. 2015 10/16 libbfd: chyby Jak zjistit, co se stalo? • Poslední Chyba: bfd_error_type bfd_get_error() • Převod na text: const char *bfd_errmsg(bfd_error_type error_tag) Typicky: if (Sbfdjunction (...) ) errx(1, "bfd_function: %s", bfd_errmsg(bfd_get_error())); Jiri Slabý (Fakulta informatiky, MU) PB173/05 8. 10. 2015 11/16 Úkol Výpis podporovaných formátů a architektur vaší libbf d O 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 0 Vypište návratové hodnoty (v cyklu) • Dokud nenarazíte na null Q Přeložte a spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/05 8. 10. 2015 12/16 libbfd: soubory • Otevření o bfd *bfd_openr(const char *file, const char *target) 9 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) • Jako fmt používejte bfd.object • Zavření • bfd_boolean bfd_close(bfd *b) b = bfd_openr("file'\ NULL); if (!bfd_check_format(b, bfd_object)) warnxfNot an object!"); bfd_close(b); Jiri Slabý (Fakulta informatiky, MU) PB173/05 8. 10. 2015 13/16 Úkol Doplňte otevírání souboru zadaného jako parametr programu O Zavolejte bfd.openr O 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 Q Přeložte a spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/05 8. 10. 2015 14/16 libbfd: 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í: bf d_get_section_by_name • Iterace: bfd_map_over_sections • Háček, který se zavolá pro každou sekci • 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 8. 10. 2015 15/16 Úkol Hexdump sekcí O Iterujte přes sekce (bf d_map_over_sections) O Vypište údaje o každé sekci • Název o 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 8. 10. 2015 16/16