GNU/Linux >> Linux Esercitazione >  >> Linux

Spiegazione del comando objdump di Linux per principianti (7 esempi)

Se ti piace programmare su Linux e il tuo lavoro ruota attorno ai compilatori, ci sono alcune utilità da riga di comando di cui dovresti essere a conoscenza. Uno di questi strumenti è objdump . In questo tutorial, discuteremo le basi di questo comando usando alcuni esempi di facile comprensione.

Ma prima di farlo, vale la pena ricordare che tutti gli esempi qui presenti sono stati testati su una macchina Ubuntu 20.04 LTS e su Debian 10.

Comando Linux objdump

Il comando objdump in Linux, come suggerisce il nome, visualizza le informazioni dai file oggetto. Di seguito è riportata la sintassi dello strumento:

objdump OPZIONI objfile ...

Ed ecco cosa dice la pagina man a riguardo:

objdump visualizza le informazioni su uno o più file oggetto. Le opzioni controllano quali particolari 
informazioni visualizzare. Queste informazioni sono utili principalmente ai programmatori che stanno lavorando sugli
strumenti di compilazione, al contrario dei programmatori che vogliono semplicemente che il loro programma venga compilato e funzioni.

objfile... sono i file oggetto da essere esaminato. Quando specifichi gli archivi, objdump mostra
informazioni su ciascuno dei file oggetto membro.

Di seguito sono riportati alcuni esempi in stile domande e risposte che dovrebbero darti un'idea ancora migliore di come funziona objdump.

Q1. Come fare in modo che objdump visualizzi il contenuto dell'intestazione del file?

Questo può essere fatto usando l'opzione della riga di comando -f.

Ad esempio:

objdump -f /bin/ls

Ed ecco l'output del comando precedente:

/bin/ls:    formato file elf64-x86-64
architettura:i386:x86-64, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
indirizzo iniziale 0x00000000000067d0

Quindi puoi vedere il contenuto dell'intestazione di 'ls' visualizzato nell'output.

Q2. Come fare in modo che objdump visualizzi il contenuto dell'intestazione del file in formato oggetto specifico?

Questo può essere fatto usando l'opzione della riga di comando -p. Ad esempio, il comando seguente:

objdump -p /bin/ls

Ha prodotto il seguente output:

; flags r-x
interp off 0x00000000000238 vadddr 0x00000000000238 paddr 0x0000000000000238 allinea 2 ** 0
filesz 0x000000000000001c memsz 0x00000000000000 filesz 0x000000000001e6e8 memsz 0x000000000001e6e8 bandiere r-x
LOAD off 0x000000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 allineamento 2 ** 21
filesz 0x0000000000001278 memsz 0x0000000000002570 bandiere rw-
DYNAMIC off 0x000000000001fa38 vaddr 0x000000000021fa38 paddr 0x000000000021fa38 allineamento 2 ** 3
         filesz 0x0000000000000200 memsz 0x00000000000000200 flag rw-
    NOTA off    0x00000000000000254 vaddr 0x 0000000000000254 paddr 0x0000000000000254 align 2 ** 2
filesz 0x0000000000000044 memsz 0x0000000000000044 bandiere r--
EH_FRAME off 0x000000000001b1a0 vaddr 0x000000000001b1a0 paddr 0x000000000001b1a0 align 2 ** 2
filesz 0x0000000000000884 memsz 0x0000000000000884 bandiere r -
STACK off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 allineamento 2 ** 4
filesz 0x0000000000000000 memsz 0x0000000000000000 bandiere rw-
RELRO off 0x000000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 allineamento 2 ** 0
filesz 0x0000000000001010 memsz 0x0000000000001010 bandiere R--

Sezione dinamica:
necessario libinux.so.1
necessario libc.so.6
init 0x0000000000003758
FINI 0x0000000001636C
INIT_ARRAY           0x000000000021eff0
  INIT_ARRAYSZ         0x00000000000000008
  FINI_ARRAY           0x000000000021eff8

FINI_ARRAYSZ 0x0000000000000008 GNU_HASH 0x0000000000000298

STRTAB 0x0000000000001180 SYMTAB 0x0000000000000388

STRSZ 0x0000000000000682 SYMENT 0x0000000000000018

DEBUG 0x0000000000000000 PLTGOT 0x000000000021fc38
Pltrelsz 0x0000000000000a68
PLTREL 0x00000000000007
JMPrel 0x0000000000002CF0
RelA 0x000000000019a0
RelAsz 0x0000000000 Verneednum 0x0000000000000001
Versym 0x0000000000001802
Relacount 0x000000000000c1

Referenze della versione:
richiesto da Libc.so 0,6:
0x06969194 0x00 07 GLIBC_2.14
0x0d696914 0x00 06 GLIBC_2.4
0x06969197 0x00 05 GLIBC_2.17
0x09691974 0x00 04 GLIBC_2.3.4
0x09691a75 0x00 03 GLIBC_2.2.5
    0x0d696913 0x00 02 GLIBC_2.3

T3. Come fare in modo che objdump visualizzi i contenuti delle intestazioni delle sezioni?

Questo può essere fatto usando l'opzione della riga di comando -h. Ad esempio, il comando seguente:

objdump -h /bin/ls

prodotto il seguente output sul mio sistema:

 /bin /ls:formato file elf64-x86-64 

sezioni:
Nome idx VMA LMA File off Algn
. *0
Contenuto, alloc, caricamento, readonly, dati
1 .note.abi-tag 00000020 000000000000000254 0000000000000254 00000254 2 ** 2
Contenuto, alloc, caricamento, readonly, data
2 .note.gnu.build-ID 00000024 0000000000000274 0000000000000274 00000274 2 ** 2
Contenuto, alloc, carico, readonly, dati
3 .gnu.hash 000000c 0000000000000 00000000000000 00000298 2 *** /> Contenuto, alloc, caricamento, readonly, dati
4 .dynsym 00000df8 0000000000000388 0000000000000388 00000388 2 ** 3
contenuto, alloc, caricamento, readonly, dati
5 .dynstr 2**0
                 CONTENUTI, ALLOC , Caricamento, readonly, dati
6 .gnu.version 0000012a 0000000000001802 000000000000001802 00001802 2 ** 1
contenuto, alloc0000000000000019301930 000000001930 000000000000000000001930 ** 3
Contenuto, alloc, caricamento, readonly, dati
8 .rela.dyn 00001350 0000000000000019A0 00000000000019A0 000019A0 2 ** 3
Contenuto, alloc, caricamento, readonly, dati
9 .rela.plt 00000A68 0000000000002CF0 0000000000002CF0 00002CF0 2 ** 3
Contenuto, alloc, caricamento, readonly, dati
10 .init 00000017 0000000000000000000000000000003758 00003783** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 *** 2 **>**. , Readonly, codice
11 .plt 00000700 000000000000370 000000000000003770 00003770 2 ** 4
contenuto, alloc, carico, readonly, codice
12 .plt.got 00000018 0000000000003E70 000000003e70 br />                 CONTENUTO, ALLOC, LOAD, READONLY, CODICE
13 .text 000124d9 0000000000003e90 0000000000003e90 00003e90 2 ** 4
CONTENUTO, ALLOC, LOAD, READONLY, CODICE
14 .fini 00000009 000000000001636c 000000000001636c 0001636c 2 * *2
Contenuto, alloc, caricamento, readonly, codice
15 .rodata 00004e1d 0000000000016380 0000000000016380 00016380 2 ** 5
Contenuto, alloc, caricamento, readonly, dati
16 .eh_frame_hdr 00000884 000000000001B1A0 000000000001B1A0 0001B1A0 2 ** 2
Contenuto, alloc, caricamento, readonly, dati
17 .eh_frame 00002cc0 000000000001Ba28 000000000001Ba28 0001Ba28 2 18 .Init_array 00000008 000000000021EFF0 000000000021EFF0 0001EFF0 2 ** 3
Contenuto, alloc, carico, dati
19 .fini_array 00000008 00000000000021eff8 000000000021eff8 0001ff8 2 ** 3
Contenuto, alloc, caricamento, dati
20 .data.rel.ro 00000A38 000000000021F000 000000000021f000 0001f000 2 ** 5
contenuto, alloc, carico, dati
21.dynamic 0000000 0000000000000021FA38 000000000021FA38 001FA38 *3
Contenuto, alloc, carico, dati
22 .got 000003c8 000000000021fc38 000000000021fc38 0001fc38 2 ** 3
contenuto, alloc, carico, dati
23 .data 00000268 0000000000000000000000 000000 000000 000000 000000 0000000 000000 0000000 000000 0000000 000000 0000000 000000 0000000 000000 0000000 000000 0000000 00020000 2 ** 5
CONTENUTO, ALLOC, LOAD, DATI
24 .bss 000012e0 0000000000220280 0000000000220280 00.020.268 2 ** 5

ALLOC 25 .gnu_debuglink 00.000.034 0000000000000000 0000000000000000 00.020.268 2 ** 2
                  CONTENUTI, SOLO LETTURA

Q4. Come fare in modo che objdump visualizzi tutte le intestazioni?

Per fare in modo che objdump visualizzi tutte le intestazioni, usa l'opzione della riga di comando -x.

objdump -x /bin/ls

Di seguito è riportato l'output prodotto da questo comando sul mio sistema:

/bin/ls:     formato file elf64-x86-64
/bin/ls
architettura:i386:x86-64, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
Indirizzo di avvio 0x00000000005850

Intestazione del programma:
PHDR OFF 0x0000000000000040 VADDR 0x0000000000000040 Paddr 0x0000000000000238 Allinea 2 ** 0
filesz 0x000000000000001c Memsz 0x000000000000001c Flags r--
caricamento 0x0000000000000000000000000000000000000000000000000000000000000000000000000000 a a a a a al agra a al alorare 0x000000 /BLURSZ0000000000000000000000000000000000000000000000000000 off 0x000000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 allineamento 2 ** 21
filesz 0x0000000000001278 memsz 0x0000000000002570 bandiere rw-
DYNAMIC off 0x000000000001fa38 vaddr 0x000000000021fa38 paddr 0x000000000021fa38 un lign 2 ** 3
filesz 0x0000000000000200 MEMSZ 0x00000000000200 Flags RW-
NOTA OFF 0x0000000000000254 vadddr 0x00000000000254 Paddr 0x000000000000000254 Allinea 2 **
Filesz 0 0x000000000001b1a0 vaddr 0x000000000001b1a0 paddr 0x000000000001b1a0 allineamento 2 ** 2
filesz 0x0000000000000884 memsz 0x0000000000000884 bandiere r--
STACK off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 allineamento 2 ** 4
filesz 0x0000000000000000 memsz 0x0000000000000000 bandiere rw-
relro off 0x0000000001eff0 vadddr 0x0000000021eff0 paddr 0x00000000000021eff0 allinea 2 ** 0
filesz 0x00000000001010 memsz 0x00000000001010 flags r--
/>  NECESSARIO              libc.so.6
  INIT                 0x0000000000003758
  FINI                0x000000000001636c
 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
pltrelsz 0x000000000000000a68
pltrel 0x00000000000000 /> Flags 0x0000000000000008
flags_1 0x0000000008000001
Verneed 0x0000000000001930
Verneednum 0x00000000000001
Versymymy 0x000000000000001802
Relacount 0x000000000000c1

Riferimenti della versione:
Richiesto da libc.so.6:
0x06969194 0x00 07 GLIBC_2.14
0x0d696914 0x00 06 GLIBC_
    0x06969197 0x00 05 GLIBC_2.17
    0x09691974 0x00 04 GLIBC_2.3.4
    0x09691a75 0x00 03 GLIBC_2.2.5
    0x0d69690 /br.
IDX Nome Dimensione VMA LMA FILE OFF ALGN
0 .Interp 0000001C 000000000000000238 0000000000000238 00000238 2 ** 0
Contenuto, alloc, caricamento, readonly, dati
1 .note.abi- TAG 00000020 0000000000000254 0000000000000254 00000254 2 ** 2
Contenuto, alloc, carico, readonly, dati
2 .note.gnu.build-ID 00000024 00000000000000000 00000000000000274 0000, Alloc, Alloc, Alloc. , CARICA, SOLA LETTURA, DATI
  3 .gnu.hash     000000ec  00000000000000298  00000000000000298  00000298  2**3, alloc, caricamento, lettura, dati
4 .dynsym 00000df8 0000000000000388 0000000000000388 00000388 2 ** 3
contenuto, alloc, carico, readonly, dati
5 .dynstr 00001180 2; /> 7 .Gnu.Version_R 00000070 00000000001930 0000000000001930 00001930 2 ** 3
contenuti, alloc, caricamento, readonly, dati
8 .rela.dyn 00001350 00000000000019A0 00000000000000 000019A0 , Alloc, caricamento, readonly, dati
9 .rela.plt 00000a68 000000000000002cf0 0000000000002cf0 00002cf0 2 ** 3
contenuto, alloc, caricamento, readonly, dati
10 .init 00000017 000000000000000000000000000000000000000000 a acmonti 00003758 2 ** 2
Contenuto, alloc, caricamento, lettura, codice
11 .plt 00000700 0000000000003770 0000000000003770 0000003770 2 ** 4
Contenuto, alloc, caricamento, lettura, codice
12 .plt.got 00000018 0000000000003E70 0000000000003E70 00003E70 2 ** 3
Contenuto, alloc, caricamento, readonly, codice
13 .text 000124d9 0000000000000000 00000000000000003e90 00003e90
14 .fini 00000009 000000000001636c 000000000001636c 0001636c 2 ** 2
contenuto, alloc, caricamento, lettura, codice
15 .rodata 00004e1d 00000000000000016380 00000000016380 00016380> Contenuto, alloc, caricamento, readonly, dati
16 .eh_frame_hdr 00000884 000000000001B1A0 000000000001B1A0 0001B1A0 2 ** 2
Contenuto, alloc, carico, readonly, dati
17 .eh_frame 00002cc0 0000000001Ba28 0001Ba28 2 ** 3
Contenuto, alloc, caricamento, lettura, dati
18 .init_array 00000008 000000000021EFF0 000000000021EFF0 0001EFF0 2 ** 3
Contenuto, Alloc, carico, dati
CONTENUTO, ALLOC, LOAD, DATI
20 .data.rel.ro 00000a38 000000000021f000 000000000021f000 0001f000 2 ** 5
CONTENUTO, ALLOC, LOAD, Dati
21 .dynamic 00000200 000000000021FA38 000000000021FA38 0001FA38 2 ** 3
contenuto, alloc, carico, dati
22 .got 000003c8 000000000000000000000000 00000000000021FC38 0001FC38 0001BC. Carico, dati
23 .data 00000268 000000000020000 0000000000200000000 00020000 2 ** 5
Contenuto, alloc, carico, dati
24 .bss 000012e0 000000000000220280 000000000000220280 00020268 2 **** /BB />         ALLOC
 25 .gnu_debuglink 00000034  00000000000000000  0000000000000000  00020268  2**2
                 INDICE, SOLO LETTURA
br /> simboli pretabella

Q5. Come fare in modo che objdump visualizzi i contenuti dell'assembler di sezioni eseguibili?

Per questo, usa l'opzione della riga di comando -d. Ecco un esempio che mostra questa opzione in azione:

objdump -d /bin/ls

Ed ecco un estratto dall'output:

/bin/ls:     formato file elf64-x86-64


Disassemblaggio della sezione .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 <[e -mail protetto]@base+0x12>
3768:ff d0 callq *%rax
376a:48 83 c4 08              add    $0x8,%rsp
    376e:    c3                       retq   

Smontaggio della sezione .plt:

0000000000003770 <[e-mail< protected] : 37 : :FF 35 CA C4 21 00 PUSHQ 0x21C4CA (%RIP) # 21FC40 <[Email Protected]@Base+0x260>
3776:FF 25 CC CC 21 00 JMPQ *0x21C4CC (%RIP) # 21FC48 <[E -mail Protected ]@Base+0x268>
    377c:    0f 1f 40 00              nopl   0x0(%rax)
0000000000003780 <[email protected]>:
    3780:    ff 25 ca c4 21 00        jmpq   *0x21c4ca(%rip)        # 21fc50 <[email protected]_2.3>
 0 8  378 00 00           pushq  $0x0
    378b:    e9 e0 ff ff ff           jmpq   3770 <[email protected]@Base+0x18>

00000000000003790 <[email protected]> : 370 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 <[email protected]@Base+0x18>

00000000000037a0 <[email protected]>:
    37a0:   ff 25 ba c4 21 00        jmpq   *0x21c4ba(%rip)        # [21fc60
    37a6:   68 02 00 00 00           pushq  $ 0 x 2

Allo stesso modo, puoi utilizzare l'opzione della riga di comando -D per fare in modo che objdump visualizzi il contenuto dell'assembler di tutte le sezioni e l'opzione -S per assicurarti che lo strumento mescoli il codice sorgente con il disassemblaggio.

Q6. Come fare in modo che objdump visualizzi le informazioni di debug?

Ciò può essere reso possibile utilizzando l'opzione della riga di comando -S.

objdump -g /bin/ls

Di seguito è riportato un estratto dall'output prodotto da questo comando:

Contenuto della sezione .eh_frame (caricata da /bin/ls):


00000000 00000000000000014 00000000 CIE
  Versione:              1
  Aumento:          "zR"
  Fattore di allineamento del codice:1
  Fattore di allineamento dei dati:-8
  Colonna dell'indirizzo di ritorno:16
  Dati di aumento:     1b
  DW_CFA_def_cfa:r7 (rsp) ofs 8
DW_CFA_offset:R16 (rip) al CFA-8
DW_CFA_undefined:R16 (rip)

00.000.018 0000000000000014 0000001C FDE cie =00000000 pc =0000000000005850..000000000000587b
DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop

00000030 0000000000000014 00000000 CIE  Aumento:          "zR"
  Fattore di allineamento del codice:1
  Fattore di allineamento dei dati:-8
  Colonna dell'indirizzo di ritorno:16
  Dati di aumento:     1b
  DW_CFA_def_cfa:r7 ( rsp) ofs 8
  DW_CFA_offset:r16 (rip) a cfa-8

Q7. Come fare in modo che objdump visualizzi il contenuto della tabella dei simboli?

Questo può essere fatto usando l'opzione della riga di comando -t.

objdump -t /bin/ls

Conclusione

Abbiamo appena scalfito la superficie qui, poiché il comando objdump offre molte opzioni della riga di comando. Una volta che hai finito di esercitarti, puoi saperne di più sullo strumento andando alla sua pagina man.


Linux
  1. Comando dir Linux per principianti (10 esempi)

  2. Spiegazione del comando di incollaggio Linux per principianti (5 esempi)

  3. Spiegazione del comando Linux wc per principianti (6 esempi)

  4. Spiegazione del comando di Linux unexpand per principianti (con esempi)

  5. Spiegazione del comando di uscita di Linux per principianti (con esempi)

Spiegazione del comando di taglio Linux per principianti (con esempi)

Spiegazione del comando di timeout di Linux per i principianti (con esempi)

Spiegazione del comando Linux dd per principianti (8 esempi)

Spiegazione del comando Linux mv per principianti (8 esempi)

Spiegazione del comando Linux md5sum per principianti (5 esempi)

Spiegazione del comando host Linux per principianti (8 esempi)