Giriş
elf dosyasının veya .o dosyasının sembollerine objdump ile bakılabilir. Komutun bir çok seçeneği var.
Diğer Araçlar
Bu araç ile ilgili diğer araçların açıklaması şöyle.
Assembly kodunu çıkartır.elf dosyasının veya .o dosyasının sembollerine objdump ile bakılabilir. Komutun bir çok seçeneği var.
Diğer Araçlar
Bu araç ile ilgili diğer araçların açıklaması şöyle.
ar: creates static libraries.-d disassamble seçeneği
objdump: this is the most important binary tool; it can be used to display all the information in an object binary file.
strings: list all the printable strings in a binary file.
nm: lists the symbols defined in the symbol table of an object file.
ldd: lists the shared libraries on which the object binary is dependent.
strip: deletes the symbol table information.
Örnek
Şöyle yaparız.
objdump -d a.o
veya şöyle yaparızobjdump -d foo.exe
ÖrnekŞöyle derlenmiş bir .o dosyası olsun
gcc -c test.c
Bu dosyanın tamamına şöyle bakarız.objdump -D test.o
Çıktı olarak şuna benzer bir şey görürüz.0: 14 00 adc $0x0,%al
--disassembler-options seçeneğiÜretilen assembly kodunun att veya intel formatında olmasını sağlar. Bu seçenek sanırım -M intel ile aynı. Şöyle yaparız.
$ objdump -d --disassembler-options=att code.c
...
080483c4 :
80483c4: 8d 4c 24 04 lea 0x4(%esp),%ecx
80483c8: 83 e4 f0 and $0xfffffff0,%esp
80483cb: ff 71 fc pushl -0x4(%ecx)
80483ce: 55 push %ebp
80483cf: 89 e5 mov %esp,%ebp
80483d1: 51 push %ecx
80483d2: 83 ec 04 sub $0x4,%esp
80483d5: c7 04 24 b0 84 04 08 movl $0x80484b0,(%esp)
80483dc: e8 13 ff ff ff call 80482f4
80483e1: b8 00 00 00 00 mov $0x0,%eax
80483e6: 83 c4 04 add $0x4,%esp
80483e9: 59 pop %ecx
80483ea: 5d pop %ebp
80483eb: 8d 61 fc lea -0x4(%ecx),%esp
80483ee: c3 ret
80483ef: 90 nop
veya şöyle yaparız.$ objdump -d --disassembler-options=intel code.c
...
080483c4 :
80483c4: 8d 4c 24 04 lea ecx,[esp+0x4]
80483c8: 83 e4 f0 and esp,0xfffffff0
80483cb: ff 71 fc push DWORD PTR [ecx-0x4]
80483ce: 55 push ebp
80483cf: 89 e5 mov ebp,esp
80483d1: 51 push ecx
80483d2: 83 ec 04 sub esp,0x4
80483d5: c7 04 24 b0 84 04 08 mov DWORD PTR [esp],0x80484b0
80483dc: e8 13 ff ff ff call 80482f4
80483e1: b8 00 00 00 00 mov eax,0x0
80483e6: 83 c4 04 add esp,0x4
80483e9: 59 pop ecx
80483ea: 5d pop ebp
80483eb: 8d 61 fc lea esp,[ecx-0x4]
80483ee: c3 ret
80483ef: 90 nop
-f seçeneği - file-headers.so dosyasının hangi ABI türünü kullandığını gösterir.
% objdump -f /lib/ld-linux.so.2
/lib64/ld-linux-x86-64.so.2
/libx32/ld-linux-x32.so.2
/lib/ld-linux.so.2: file format elf32-i386
architecture: i386, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x00000a90
/lib64/ld-linux-x86-64.so.2: file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x0000000000000c90
/libx32/ld-linux-x32.so.2: file format elf32-x86-64
architecture: i386:x64-32, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x00000960
-S seçeneğiAçıklaması şöyle. -d seçeği ile birlikte kullanılır
>objdump --help
[...]
-S, --source Intermix source code with disassembly
-l, --line-numbers Include line numbers and filenames in output
ÖrnekŞöyle yaparız.
> objdump -d -M intel -S test.o
test.o: file format elf32-i386
Disassembly of section .text:
00000000 <main>:
#include <stdio.h>
int main(void)
{
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 83 e4 f0 and esp,0xfffffff0
6: 83 ec 10 sub esp,0x10
puts("test");
9: c7 04 24 00 00 00 00 mov DWORD PTR [esp],0x0
10: e8 fc ff ff ff call 11 <main+0x11>
return 0;
15: b8 00 00 00 00 mov eax,0x0
}
1a: c9 leave
1b: c3 ret
-t seçeneği
Sembolleri gösterir
Örnek
Şöyle yaparız
Örnek
Şöyle yaparız
objdump -t x.sm
Örnek
Elimizde şöyle bir kod olsun.
Sembollerin hangi elf bölümüne geldiği görmek için şöyle yaparız. .text ve .rodata bölümlerinde tanımlı semboller görülebilir.
Eğer bir sembol yoksa undefined olarak belirtilir.
-x seçeneğiElimizde şöyle bir kod olsun.
#include <stdio.h>
int g_a;
int g_b;
int g_c;
int main()
{
printf("Hello world\n");
return 0;
}
Şöyle yaparız.objdump -t myapp
Çıktı olarak şunu alırız.00004020 g_b
00004024 g_a
00004028 g_c
ÖrnekSembollerin hangi elf bölümüne geldiği görmek için şöyle yaparız. .text ve .rodata bölümlerinde tanımlı semboller görülebilir.
$ objdump -T /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 | grep "chrono"
00080828 g DF .text 0000002a GLIBCXX_3.4.11 _ZNSt6chrono12system_clock3nowEv
0008ae38 g DO .rodata 00000001 GLIBCXX_3.4.11 _ZNSt6chrono12system_clock12
ÖrnekEğer bir sembol yoksa undefined olarak belirtilir.
$ objdump -T myapp | grep "GLIBCXX_3.4.19"
00000000 DF *UND* 00000000 GLIBCXX_3.4.19 _ZNSt6chrono3_V212system_clock3n
Elimizde şöyle bir kod olsun.
// main.c
extern int x;
static int *y = &x;
int main() {
return *y;
}
Şöyle yaparızobjdump -x main.o
Çıktı olarak şunu alırız.RELOCATION RECORDS FOR [.data]:
OFFSET TYPE VALUE
0000000000000000 R_X86_64_64 x
Hiç yorum yok:
Yorum Gönder