GNU/Linux >> Znalost Linux >  >> Linux

Linuxový příkaz objdump vysvětlený pro začátečníky (7 příkladů)

Pokud se zabýváte programováním na Linuxu a vaše práce se točí kolem kompilátorů, existuje několik nástrojů příkazového řádku, o kterých byste měli vědět. Jedním z takových nástrojů je objdump . V tomto tutoriálu probereme základy tohoto příkazu pomocí několika snadno srozumitelných příkladů.

Ale než to uděláme, stojí za zmínku, že všechny příklady zde byly testovány na počítači Ubuntu 20.04 LTS a na Debianu 10.

Příkaz Linux objdump

Příkaz objdump v Linuxu, jak název napovídá, zobrazuje informace z objektových souborů. Následuje syntaxe nástroje:

objdump OPTIONS objfile ...

A zde je to, co o tom říká manuálová stránka:

objdump zobrazuje informace o jednom nebo více objektových souborech. Možnosti určují, jaké konkrétní 
informace se mají zobrazit. Tyto informace jsou většinou užitečné pro programátory, kteří pracují na
kompilačních nástrojích, na rozdíl od programátorů, kteří chtějí, aby jejich program pouze zkompiloval a fungoval.

objfile... jsou objektové soubory být vyšetřen. Když zadáte archivy, objdump zobrazí
informace o každém ze souborů členských objektů.

Následuje několik příkladů ve stylu otázek a odpovědí, které by vám měly poskytnout ještě lepší představu o tom, jak objdump funguje.

O1. Jak zajistit, aby objdump zobrazoval obsah záhlaví souboru?

To lze provést pomocí volby -f příkazového řádku.

Například:

objdump -f /bin/ls

A zde je výstup výše uvedeného příkazu:

/bin/ls:    formát souboru elf64-x86-64
architektura:i386:x86-64, příznaky 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
počáteční adresa 0x00000000070000

Takže můžete vidět, že obsah záhlaví 'ls' byl zobrazen ve výstupu.

O2. Jak zajistit, aby objdump zobrazoval konkrétní obsah záhlaví souboru ve formátu objektu?

To lze provést pomocí volby příkazového řádku -p. Například následující příkaz:

objdump -p /bin/ls

Vytvořil následující výstup:

/bin /ls:formát souboru elf64-x86-64

programový záhlaví:
phdr off 0x0000000000000040 vaddr 0x0000000000000040 paddr 0x0000000000000040 2 ** 3
soubory 4 ** 3
filez. Vlajky R-X
Interp Off 0x0000000000000238 Vaddr 0x00000000000238 PADDR 0X0000000000000238 Align 2 ** 0
Filesz 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000. odlehčení 0x000000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 align 2 ** 21
filesz 0x0000000000001278 memsz 0x0000000000002570 vlajky RW-
DYNAMICKÉ mimo 0x000000000001fa38 vaddr 0x000000000021fa38 paddr 0x000000000021fa38 align 2 ** 3
         filesz 0x0000000000000200 memsz 0x0000000000000200 příznaky rw-
    POZNÁMKA vypnuto    0x0000000000000254 vaddr 0x000000000000254 0000000000000254 paddr 0x0000000000000254 align 2 ** 2
filesz 0x0000000000000044 memsz 0x0000000000000044 vlajky r--
EH_FRAME mimo 0x000000000001b1a0 vaddr 0x000000000001b1a0 paddr 0x000000000001b1a0 zarovnání 2 ** 2
filesz 0x0000000000000884 memsz 0x0000000000000884 vlajky r -
STACK vypnutí 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2 ** 4
filesz 0x0000000000000000 memsz 0x0000000000000000 vlajky RW-
RELRO mimo 0x000000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 zarovnat 2 ** 0
filesz 0x0000000000001010 memsz 0x0000000000001010 vlajek R--

Dynamická sekce:
Potřebné libselinux.so.1
Potřebné libc.so.6
init 0x0000000000003758
fini 0x000000000001636C
INIT_ARRAY           0x000000000021eff0
  INIT_ARRAYSZ         0x000000000000008
  FINI_ARRAY 0      e ff 00 000 
FINI_ARRAYSZ 0x0000000000000008
GNU_HASH 0x0000000000000298
STRTAB 0x0000000000001180
SYMTAB 0x0000000000000388
STRSZ 0x0000000000000682
SYMENT 0x0000000000000018
LADÍCÍ 0x0000000000000000
PLTGOT 0x000000000021fc38
Pltrelsz 0x0000000000000a68
pltrel 0x0000000000000007
jmprel 0x0000000000002cf0
rela 0x0000000000000000000000000000000000000000000000000000000000000000001800 Verneednum 0x00000000000001
Versym 0x0000000000001802
relaccount 0x00000000000000c1

Verze Reference:
od libc.so. .6:
0x06969194 0x00 07 GLIBC_2.14
0x0d696914 0x00 06 Glibc_2.4
0x06969197 0x00 05 Glibc_2.17
0x096. GLIBC_2.2.5
    0x0d696913 0x00 02 GLIBC_2.3

O3. Jak zajistit, aby objdump zobrazoval obsah záhlaví sekcí?

To lze provést pomocí volby příkazového řádku -h. Například následující příkaz:

objdump -h /bin/ls

vytvořil v mém systému následující výstup:

/bin /ls:formát souboru elf64-x86-64

Sekce:
Idx name Velikost vM *0
Obsah, přidělení, načítání, čtení, data
1 .note.abi-tag 00000020 00000000000254 0000000000000254 00000254 2 ** 2
Obsah, přidělit, zátěž, čtení, data
2 .Note.gnu.Build-id 00000024 0000000000000274 00000000000274 00000274 2 ** 2
Obsah, přidělení, načtení, čtení, data
3 .gnu.Hash 000000 0000000000000298 0000000000000298 000S298 ​​2 ** PROST 3 PROST 3. /> Obsah, přidělení, zatížení, čtení, data
4 .Dynsym 00000DF8 0000000000000388 00000000000388 00000388 2 ** 3
Obsah, přidělení, Readonly, Data
5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5 2**0
                  OBSAH, ALLOC , Načítání, čtení, data
6.gnu.version 0000012a 0000000000001802 0000000000001802 00001802 2 ** 1
Obsah, přidělení, zátěž, readonly, data
7 .gnU.version_r 00000070 0000000000001930 0000 0000000000001930 0000 0000000000001930 000000000000001930 0000000000000019930 0000000000000019930 00000000000019930 00000000000019930 00000000000019930 00000000000019930 00000000000019930 00000000000019930 00000000000019930 ** 3
Obsah, přidělení, zatížení, čtení, data
8.rela.dyn 00001350 000000000019a0 00000000000019a0 000019a0 2 ** 3
Obsah, aloc, Readolly, Data
9.Rela.plt 00000A68 0000000000002CF0 0000000000002CF0 00002CF0 2 ** 3
Obsah, přidělení, zátěž, čtení, data
10. inTion 0000000017 00000000003758 0000000000003758 00003758 , Readonly, kód
11 .plt 00000700 0000000000003770 00000000003770 00003770 2 ** 4
Obsah, přidělení, zátěž, čtení, kód
12 .ptt.got 00000018 00000000000 000000000000 000000000000 000000000000 000000000000000 000000000000000 000000000030 000000000030 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000. br />                 Obsah, přidělení, zátěž, čtení, kód
13 .text 000124d9 0000000000003e90 0000000000003e90 00003e90 2 ** 4
Obsah, přidělení, zátěž, Readonly, kód
14 .fini 00009 000000000001636C 00000000000000161636C 000000000001616161636C 00000000 000161636C 00000000000161636C 00000000000161636C 00000000 0001636C 000000000001636C 000000000001636C 000000001636C *2
Obsah, přidělení, zátěž, readonly, kód
15.rodata 00004e1d 000000 00016380 0000000000016380 00016380 2 ** 5
Obsah, přidělení, čtení, údaje
16 .eh_frame_hd. 00000884 000000000001B1A0 000000000001B1A0 0001B1A0 2 ** 2
Obsah, Alloc, Readonly, Data
17 .eh_frame 00002cc0 000000000001Ba28 000000000001BA28 000 BR /> 18.Init_Array 00000008 000000000021EFF0 000000000021EFF0 0001EFF0 2 ** 3
Obsah, přidělení, zátěž, data
19 .fini_array 00000008 0000000021eff8 000000000021eff8 000 Obsah, přidělení, zátěž, data
20.data.rel.ro 00000a38 000000000021f000 000000000021f000 0001f000 2 ** 5
Obsah, přidělení, zátěž,
Obsah, přidělení, zatížení, data
22.got 000003C8 000000000021FC38 0000000021FC38 0000000000020000 0000000000220000 000000000000220000 000000000000220000 000000000000220000 0000000000220000 0000000000220000 0000000000220000 0000000000220000 0000000000220000 0000000000220000 0000000000220000 0000000000220000 00000000000020000 00000000000020000 00000000000020000 00000000000000 2 ** 5
OBSAH Alloc, zatížení, DATA
24 bss 000012e0 0000000000220280 0000000000220280 00020268 2 ** 5
ALLOC
25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 00020268 2 ** 2
                  OBSAH, POUZE PRO ČTENÍ

4. Jak zajistit, aby objdump zobrazoval všechna záhlaví?

Chcete-li, aby objdump zobrazoval všechna záhlaví, použijte volbu -x příkazového řádku.

objdump -x /bin/ls

Následuje výstup, který tento příkaz vytvořil v mém systému:

/bin/ls:     formát souboru elf64-x86-64
/bin/ls
architektura:i386:x86-64, příznaky 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
Počáteční adresa 0x0000000000005850

Programový záhlaví:
Phdr Off 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000. FLAGICS Filesz 0x0000000000001C MEMSZ 0x0000000000001C FLAGS R--
Filesz 0x0000000000001278 MEMSZ 0x00000000000000000 FLAGS RW-
LIGN 2 ** 3
Filesz 0x0000000000000200 MEMSZ 0x00000000000200 FLAGS RW-
Poznámka OFF 0x00000000000000000000000254 PADDR 0X0000000000000254 ALIGN 0x000000000001b1a0 vaddr 0x000000000001b1a0 paddr 0x000000000001b1a0 align 2 ** 2
filesz 0x0000000000000884 memsz 0x0000000000000884 vlajky r--
STACK z 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 Align 2 ** 4
filesz 0x0000000000000000 memsz 0x0000000000000000 vlajky RW-
relro off 0x000000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 zarovnat 2 ** 0
Filesz 0x00000000001010 MEMSZ 0x0000000000001010 FLAGS R-

Dynamické sekce:
/>  NEEDED               libc.so.6
  INIT                 0x000000000003758
  FINI                                         0 / 100 3 INIT_ARRAY 0x000000000021eff0

INIT_ARRAYSZ 0x0000000000000008 FINI_ARRAY 0x000000000021eff8

FINI_ARRAYSZ 0x0000000000000008 GNU_HASH 0x0000000000000298

STRTAB 0x0000000000001180 SYMTAB 0x0000000000000388

STRSZ 0x0000000000000682 SYMENT 0x0000000000000018
debug 0x0000000000000000
pltgot 0x000000000021fc38
pltrellsz 0x0000000000000a68
Flags 0x0000000000000008
Flags_1 0x0000000008000001
Verneed 0x0000000000001930
Verneednum 0x0000000000000001
Versym 0x0000000000001802
relaCount 0x00000000000000c1

Reference verze:
požadované od libc.so.6:
0x06969194 0x00 07 glibc_2.14
0x0d 06 glibc_2.4
    0x06969197 0x00 05 GLIBC_2.17
    0x09691974 0x00 04 GLIBC_2.3.4
    0x09691a

75 0x00 2.3 GLIBC_2.03 GLIBC_03 /2 x 03 GLIBC 03 GLIBC 03
Idx name Velikost VMA LMA Soubor OFF ALGN
0 .Interp 0000001C 0000000000000238 00000000000238 00000238 2 ** 0
Obsah, přidělení, načtení, Readonly, Data
1 .note.abi- značka 00000020 0000000000000254 0000000000000254 00000254 2 ** 2
Obsah, přidělení, načtení, čtení, data
, NAČÍST, POUZE PRO ČTENÍ, DATA
  3 .gnu.hash     000000ec  0000000000000298  000000000000298  00000298  2**3
Obsah, přidělení, zátěž, čtení, data
4 .Dynsym 00000df8 0000000000000388 00000000000388 00000388 2 ** 3
Obsah, přidělení, Readonly, Readonly, Data
5 00001180 2 ** 0
Obsah, přidělení, načítání, čtení, data
6.gnu.Version 0000012a 0000000000001802 0000000000001802 00001802 2 ** 1
Obsah, Alloc, zatížení, údaje
7.gnu.version_r 00000070 0000000000001930 00000000001930 00001930 2 ** 3
Obsah, přidělení, zátěž, readonly, data
2 *** 3;; , Aloc, zátěž, readonly, data
9.rela.plt 00000a68 00000000002cf0 00000000002cf0 00002cf0 2 ** 3
Obsah, přidělení, Readonly, Data
10 .ITIT 00000017 000000000037758 00000000003758 00000000003758 00003758 2 ** 2
Obsah, přidělení, zátěž, readonly, kód
11 .plt 00000700 00000000003770 00000000003770 00003770 2 ** 4
Obsah, aloc, Readonly, kód
12.plt.got 00000018 0000000000003E70 0000000000003E70 00003E70 2 ** 3
Obsah, přidělení, zátěž, readonly, kód
13.Text 200000124d9 00000000003E90 0000000000003E90 000030 2 ** PUTRYTUR />> , Readonly, kód
14.fini 00000009 000000000001636C 000000000001636C 0001636C 2 ** 2
Obsah, přidělení, načtení, Readonly, Kód
15. 150163016380, 1*;> Obsah, přidělení, zatížení, čtení, data
16 .eh_frame_hdr 00000884 000000000001b1a0 000000000001b1a0 0001b1a0 2 ** 2
Obsah, přidělení, čtení, data
17. 0000000001BA28 0001BA28 2 ** 3
Obsah, přidělení, zátěž, čtení, data
18.init_array 00000008 000000000021eff0 000000000021eff0 0001eff0 2 ** 3
Obsah, aloc, data
19 .fini_array 00000008 000000000021eff8 000000000021eff8 0001eff8 2 ** 3
Obsah, přidělení, zátěž, data
20. data.rel.ro 00000a38 0000000021f000 0000000021f000 000 DATA
21 .dynamic 00000200 000000000021fa38 000000000021fa38 0001fa38 2 ** 3
OBSAH Alloc, LOAD, DATA
22 .got 000003c8 000000000021fc38 000000000021fc38 0001fc38 2 ** 3
OBSAH, ALLOC, Načítání, data
23.Data 00000268 0000000000220000 00000000220000 00020000 2 ** 5
Obsah, přidělení, zátěž, data
24         ALLOC
 25 .gnu_debuglink 00000034  000000000000000  000000000000000  00020268  2, 2** symbol  BLE 
 /  SY   BLE 

O5. Jak zajistit, aby objdump zobrazoval obsah spustitelných sekcí v assembleru?

K tomu použijte volbu -d příkazového řádku. Zde je příklad ukazující tuto možnost v akci:

objdump -d /bin/ls

A zde je úryvek z výstupu:

/bin/ls:     formát souboru elf64-x86-64


Demontáž sekce .init:

0000000000003758 <[email protected]@Base> :
3758:48 83 EC 08 Sub $ 0x8,%RSP
375C:48 8B 05 7D C8 21 00 MOV 0x21C87D (%RIP),%RAX # 21ffe0 <__ GMON_START __>
3763:48 85 C0 Test%RAX,%RAX
3766:74 02 JE 376A <[chráněn e -mailem]@Base+0x12>
3768:FF D0 Callq *%RAX
376a:48 83 C4 08              přidat    $ 0x8,%rsp
    376e:    c3                                  0 retq   3 3

0 3:0 <0 7:0 7 <7> 7 . brt> 0 

3776:FF 25 C4 21 00 JMPQ *0x21C4CC (%RIP) # 21FC48 <[E -mail chráněn ]@Base+0x268>
    377c:    0f 1f 40 00              nopl   0x0(%rax)
0000000000003780 <[e-mail chráněný]>:
    3780:    ff 25 ca c4 21 00        jmpq    *0x21c4ca (% rip) ]] 0 0.8 e-mail 6 / 0 0.8 3 8 2 1 0 00 00           pushq  $ 0x0
    378b:    e9 e0 ff ff ff           jmpq   3770 <[0:chráněný e-mail]@Base:00:0
0x18> 39 <09>[09] [09] <0[09] <0[09] <00 ff 25 c2 c4 21 00 jmpq * 0x21c4c2 (% rip) # 21fc58
3796:68 01 00 00 00 pushq $ 0x1
379b:E9 d0 ff ff ff jmpq 3770 <[e-mail chráněný]@Base+0x18>

00000000000037a0 <[chráněný e-mailem]>:
    37a0:    ff 25 ba c4 21 00         #  4 ba % c   #  4 jmp 6    email protected]_2.2.5>
    37a6:    68 02 00 00 00           pushq  $ 0x2

Podobně můžete použít volbu -D příkazového řádku, aby objdump zobrazil obsah assembleru všech sekcí, a volbu -S, abyste zajistili, že nástroj propojí zdrojový kód s rozebráním.

O6. Jak zajistit, aby objdump zobrazoval ladicí informace?

Toho lze dosáhnout použitím volby příkazového řádku -S.

objdump -g /bin/ls

Následuje výňatek z výstupu vytvořeného tímto příkazem:

Obsah sekce .eh_frame (načteno z /bin/ls):


00000000 0000000000000014 00000000 CIE
  Verze:                   1            1            1            1
  Faktor zarovnání kódu:1
  Faktor zarovnání dat:-8
  Sloupec zpáteční adresy:16
  Data rozšíření:     1b
  DW_CFA_def_cfa:r7 (rsp) z 8
DW_CFA_OFFSET:R16 (RIP) na CFA-8
DW_CFA_UNDEFINEFINED:R16 (RIP)

00000018 00000000000014 0000001C FDE CIE =00000000 PC =00000000005850..0000000000

  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000>  Rozšíření:          "zR"
  Faktor zarovnání kódu:1
  Faktor zarovnání dat:-8
  Sloupec zpáteční adresy:16
  Data rozšíření:     1b
  DW_CFA_def_cfa:r7 ( rsp) z 8
  DW_CFA_offset:r16 (rip) na cfa-8

O7. Jak zajistit, aby objdump zobrazoval obsah tabulky symbolů?

To lze provést pomocí volby -t příkazového řádku.

objdump -t /bin/ls

Závěr

Právě jsme zde poškrábali povrch, protože příkaz objdump nabízí mnoho možností příkazového řádku. Jakmile je dokončíte, můžete se o tomto nástroji dozvědět více na jeho manuálové stránce.


Linux
  1. Linuxový příkaz paste vysvětlený pro začátečníky (5 příkladů)

  2. Příkaz wc pro Linux vysvětlený pro začátečníky (6 příkladů)

  3. Linux unexpand Command Vysvětlený pro začátečníky (s příklady)

  1. Linuxový příkaz dir pro začátečníky (10 příkladů)

  2. Příkaz Linux Csplit vysvětlený pro začátečníky (6 příkladů)

  3. Příkaz ukončení Linuxu vysvětlený pro začátečníky (s příklady)

  1. Linuxový příkaz dirname vysvětlený pro začátečníky (4 příklady)

  2. Linux Free Command vysvětlený pro začátečníky (6 příkladů)

  3. Příkaz Linux Head vysvětlený pro začátečníky (5 příkladů)