osdev.labedz.org

Sposób użycia

Najczęściej, informacją jaką chcemy uzyskać dzięki programowi OBJDUMP jest adres symbolu funkcji bądź etykiety w programie. Dzięki takiej informacji możemy określić w jakim miejscu pamięci komputera zostanie zawarta dana zmienna lub procedura, i możemy odpowiednio ustawić parametry debuggera w celu weryfikacji poprawności działania.

Aby uzyskać adres etykiety tablicy page_dir_addr z pliku obiektowego tworzonego systemu operacyjnego kernel, należy wykonać instrukcję:

$ objdump -x kernel | grep page_dir 00000000 l df *ABS* 00000000 init_page_dir.c 00102cc0 g F .text 000000f5 init_page_dir 0010700c g O .data 00000004 page_dir 00108000 g .bss 00000000 page_dir_addr

W komendzie tej zastosowany został również program filtrujący grep. Jego zadanie polega na pobraniu ze standardowego strumienia wejściowego ciągu tekstowego i po przepuszczeniu przez filtr przesłanie go na wejście strumienia wyjściowego. W tym przypadku grep wyświetla tylko linie posiadające fragment odpowiadający masce page_dir.

Wynikiem pracy wykonanej instrukcji jest lista linii, które zawierają adres pod jakim występuje interesująca nas instrukcja, nazwa sekcji oraz inne dane. W tym przypadku wiemy, ze tablica page_dir_addr znajduje się pod adresem 0x108000 w sekcji .bss.

Innym zastosowaniem programu OBJDUMP jest disassemblacja plików obiektowych w celu zapoznaniem się z kodem interesujących nas procedur. Znajomość kodu assemblera często znacznie ułatwia orientacje podczas debuggowaniu programów.

Aby uzyskać kod assemblera pliku obiektowego sleep.o należy wykonać instrukcję:

$ objdump -d sleep.o sleep.o: file format elf32-i386 Disassembly of section .text: 00000000 <sleep>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 8b 45 08 mov 0x8(%ebp),%eax 6: 50 push %eax 7: b8 04 00 00 00 mov $0x4,%eax c: 89 c0 mov %eax,%eax e: cd 22 int $0x22 10: c9 leave 11: c3 ret

Jeżeli mamy do disassemblacji plik obiektowy, który składa się z większej ilości procedur, należy zastosować dowolny program do przeglądania plików potrafiący korzystać z danych ze strumienia wejściowego. Przykładem takiego programu może być program less.

V
>