GNU/Linux >> Tutoriales Linux >  >> Linux

Comando objdump de Linux explicado para principiantes (7 ejemplos)

Si le gusta programar en Linux y su trabajo gira en torno a los compiladores, hay un puñado de utilidades de línea de comandos que debe tener en cuenta. Una de estas herramientas es objdump. . En este tutorial, discutiremos los conceptos básicos de este comando utilizando algunos ejemplos fáciles de entender.

Pero antes de hacerlo, vale la pena mencionar que todos los ejemplos aquí se han probado en una máquina con Ubuntu 20.04 LTS y en Debian 10.

Comando Linux objdump

El comando objdump en Linux, como sugiere su nombre, muestra información de archivos de objetos. La siguiente es la sintaxis de la herramienta:

objdump OPCIONES objfile...

Y esto es lo que dice la página del manual al respecto:

objdump muestra información sobre uno o más archivos de objetos. Las opciones controlan qué información particular 
mostrar. Esta información es principalmente útil para los programadores que están trabajando en las
herramientas de compilación, a diferencia de los programadores que solo quieren que su programa se compile y funcione.

objfile... son los archivos objeto para ser examinado. Cuando especifica archivos, objdump muestra
información sobre cada uno de los archivos de objetos miembros.

Los siguientes son algunos ejemplos de preguntas y respuestas que le darán una idea aún mejor de cómo funciona objdump.

P1. ¿Cómo hacer que objdump muestre el contenido del encabezado del archivo?

Esto se puede hacer usando la opción de línea de comando -f.

Por ejemplo:

objdump -f /bin/ls

Y aquí está el resultado del comando anterior:

/bin/ls:    formato de archivo elf64-x86-64
arquitectura:i386:x86-64, indicadores 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
dirección de inicio 0x00000000000067d0

Entonces puede ver que el contenido del encabezado de 'ls' se mostró en la salida.

P2. ¿Cómo hacer que objdump muestre contenido de encabezado de archivo específico en formato de objeto?

Esto se puede hacer usando la opción de línea de comandos -p. Por ejemplo, el siguiente comando:

objdump -p /bin/ls

Produjo el siguiente resultado:

 /bin /ls:formato de archivo ELF64-X86-64 

Encabezado del programa:
PHDR OFF 0x000000000000000040 VADDR 0X000000000000000040 PADRO 0x00000000000000000040 ALIEGN 2 ** 3
FILEZA 0X00000000001F8 MOMESZ 0X00000000000000000000000000001FFLA 0XSZ 0XSZ 0XSZ 0XSZ 0XSZ 0X000000001FF800001FN FLAGS R-X
Interp Off 0x0000000000000238 Vaddr 0x000000000000000238 Paddr 0x000000000000000238 Alinear 2 ** 0
Filesz 0x00000000000000001C MEMSZ filesz 0x000000000001e6e8 memsz banderas 0x000000000001e6e8 r-x
carga fuera 0x000000000001eff0 vaddr 0x000000000021eff0 PADDR 0x000000000021eff0 align 2 ** 21
filesz 0x0000000000001278 memsz 0x0000000000002570 banderas rw-
DINÁMICO fuera 0x000000000001fa38 vaddr 0x000000000021fa38 PADDR 0x000000000021fa38 align 2 ** 3
         filesz 0x0000000000000200 memsz 0x0000000000000200 flags rw-
    NOTA desactivada    0x0000000000000254 vaddr 0x 0000000000000254 PADDR 0x0000000000000254 align 2 ** 2
filesz 0x0000000000000044 memsz 0x0000000000000044 banderas r--
EH_FRAME fuera 0x000000000001b1a0 vaddr 0x000000000001b1a0 PADDR 0x000000000001b1a0 align 2 ** 2
filesz 0x0000000000000884 memsz 0x0000000000000884 banderas R -
PILA fuera 0x0000000000000000 vaddr 0x0000000000000000 PADDR 0x0000000000000000 align 2 ** 4
filesz 0x0000000000000000 memsz 0x0000000000000000 banderas rw-
RELRO fuera align 2 ** 0 banderas
filesz 0x0000000000001010 memsz 0x0000000000001010 0x000000000001eff0 vaddr 0x000000000021eff0 PADDR 0x000000000021eff0 R--

Sección dinámica:
Libselinux.so.1
necesario libc.so.6
init 0x00000000003758
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 0x0000000000000A68
PLTREL 0x000000000000000007
JMPREL 0x000000000000002CF0
RELA 0x000000000000000019A0
RATASZ 0x000000000000001350
RELA 0X00000000000018 Verneed 0x000000000000001930
verNeednum 0x000000000000000001
versym 0x000000000000001802
relaScount 0x0000000000000000C1

Referencias de versión:
requerido de libc.soSo .6:
0x06969194 0x00 07 glibc_2.14
0x0d696914 0x00 06 glibc_2.4
0x0696919197 0x00 05 glibc_2.17
0x09691974 0x00 04 glibc_2.3.4     0x0d696913 0x00 02 GLIBC_2.3

P3. ¿Cómo hacer que objdump muestre el contenido de los encabezados de las secciones?

Esto se puede hacer usando la opción de línea de comando -h. Por ejemplo, el siguiente comando:

objdump -h /bin/ls

produjo el siguiente resultado en mi sistema:

 /bin /ls:formato de archivo ELF64-X86-64 

Secciones:
IDX Tamaño de nombre VMA LMA Archivo ALGN
0.interp 0000001C 0000000000000238 00000000000000000238 00000238 2** *0
contenido, asignación, carga, lectura, datos
1 .note.abi-tag 00000020 000000000000000254 0000000000000254 00000254 2 ** 2
contenido, asignación, carga, lectura, datos
2 .note.gnu.build-id 0000000024 0000000000000274 000000000000000274 00000274 2 ** 2
contenido, alloc, load, readonly, datos
3 .gnu.hash 000000eC 0000000000000298 00000000000298 00000298 /> Contenido, Alloc, Load, Readonly, Data
4 .Dynsym 00000DF8 000000000000000388 000000000000000388 00000388 2 ** 3
Contenido, Alloc, Load, Readonly, Data
5 .Dynstr 00000682 0000000000180 000000000011801801818 2**0
                  CONTENIDO, ASIGNACIÓN , Cargar, Readonly, Data
6 .Gnu.Version 0000012A 000000000000001802 000000000000001802 00001802 2 ** 1
Contenido, Alloc, Load, ReadOnly, Data
7 .Gnu.Version_R 000070 0000000000001930 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 MENTALES MENTALES 001930ATRAS ** 3
contenido, asignación, carga, lectura, datos
8 .rela.dyn 00001350 0000000000000019A0 00000000000019A0 000019A0 2 ** 3
Contenido, Alloc, Load, Readonly, datos
9 .rela.plt 00000A68 0000000000002CF0 0000000000002CF0 00002CF0 2 ** 3
Contenido, Alloc, Load, Readonly, Data
10 .init 00000017 0000000000003758 00000000003758 00003758 2 ** 2 << 11 .plt 00000700 0000000000003770 000000000000003770 00003770 2 ** 4
Contenido, Alloc, Load, Readonly, Code
12 .Plt.got 00000018 00000000003E70 00000000003E70 br />                 Contenido, Alloc, Load, Readonly, Code
13 .Text 000124D9 0000000000003E90 0000000000003E90 00003E90 2 ** 4
Contenido, Alloc, Load, Readonly, Código
14. *2
Contenido, Alloc, Carga, Readonly, Code
15 .Rodata 00004E1D 00000000000000016380 0000000000016380 00016380 2 ** 5
Contenido, asignación, carga, lectura, datos
16 .EH_frame_HDRDR 00000884 000000000001b1a0 000000000001b1a0 0001b1a0 2 ** 2
CONTENIDO, ALLOC, LOAD, READONLY, DATOS
17 .eh_frame 00002cc0 000000000001ba28 000000000001ba28 0001ba28 2 ** 3
CONTENIDO, ALLOC, LOAD, READONLY, DATA
18 .init_array 00000008 000000000021eff0 00000000000021EFF0 0001EFF0 2 ** 3
Contenido, Alloc, carga, datos
19 .fini_array 00000008 000000000021Eff8 0000000021eff8 0001eff8 2 ** 3
> Contenidos, Alloc, la carga, DATOS
20 .data.rel.ro 00000a38 000000000021f000 000000000021f000 0001f000 2 ** 5
CONTENIDO, ALLOC, LOAD, DATOS
21 .dynamic 00000200 000000000021fa38 000000000021fa38 0001fa38 2 * *3
Contenido, Alloc, carga, datos
22 .GOT 000003C8 00000000000021FC38 00000000000021FC38 0001FC38 2 ** 3
Contenido, Alloc, carga, datos
23 .DATA 00000268 000000000002000000000000000000000000000000000000000000 2 ** 5
CONTENIDO, ALLOC, LOAD, DATOS
24 .bss 000012e0 0000000000220280 0000000000220280 00020268 2 ** 5
ALLOC
25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 00020268 2 ** 2
                  CONTENIDO, SOLO LECTURA

P4. ¿Cómo hacer que objdump muestre todos los encabezados?

Para hacer que objdump muestre todos los encabezados, use la opción de línea de comando -x.

objdump -x /bin/ls

El siguiente es el resultado que este comando produjo en mi sistema:

/bin/ls:     formato de archivo elf64-x86-64
/bin/ls
arquitectura:i386:x86-64, indicadores 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
Dirección de inicio 0x000000000000005850

Encabezado del programa:
PHDR OFF 0x000000000000000040 VADDR 0X0000000000000040 PADDR 0X0000000000000040 ALINE Paddr 0x000000000000000238 Alinee 2 ** 0
Archivosz 0x00000000000000001C MEMSZ 0x0000000000000000001C FLAGS R--
Carga 0x000000000000000000 VDDR 0x0000000000000000000000000000XESTO MEMPLACIMOS ALIFER Apagado 0x000000000001F0 Vaddr 0x000000000021eff0 Paddr 0x00000000000021EFF0 Alinear 2 ** 21
Filesz 0x000000000000001278 MEMSZ 0x000000000000002570 FLAGS RW-
DYNAME OFF 0X0000000000000001FA38 88888000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ATROMENTOS Lign 2 ** 3
Filesz 0x0000000000000200 MEMSZ 0x000000000000000200 FLAGS RW-
Nota apagado 0x0000000000000254 VADDR 0X000000000000000254 PADDR 0X0000000000000254 ALEGN 2 ** 2
FILEZSZ 0X000044 MEMACI 0x000000000001b1a0 vaddr 0x000000000001b1a0 PADDR 0x000000000001b1a0 align 2 ** 2
filesz 0x0000000000000884 memsz 0x0000000000000884 banderas r--
STACK fuera 0x0000000000000000 vaddr 0x0000000000000000 PADDR 0x0000000000000000 align 2 ** 4
filesz 0x0000000000000000 memsz 0x0000000000000000 banderas rw-
RELRRO OFF 0x00000000000001EFF0 VADDR 0X000000000021EFF0 PADRO 0X00000000000021EFT0 ALIGN 2 ** 0
FILEZ 0X000000000000001010 MEMSZ 0X000000000000001010 FLAGS R--

Sección dinámica:
Libselinux. />  NECESARIO               libc.so.6
  INIT                 0x000000000003758
  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
DEBUGA 0X0000000000000000
PLTGOT 0x00000000000021FC38
pltrelsz 0x0000000000000A68 <> pLtrel 0x00000000000000000007
JMPR 0x00000000000000000000
RELA 0X000000000000000UN /> Flags 0x000000000000000008
flags_1 0x000000000800000001
verneed 0x0000000000001930
verneednum 0x0000000000000001
versym 0x000000000000001802
Relacount 0x00000000000000C1

Referencias de versión:
Requerido desde libc.so.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
    0x0d6969_2.
Sección 0x0BC0:

IDX Nombre Tamaño de nombre VMA LMA OFF ALGN
0 .Interp 0000001C 000000000000000238 000000000000000238 00000238 2 ** 0
Contenido, Alloc, Load, Readonly, Data
1 .note.abi-- Etiqueta 00000020 000000000000000254 0000000000000254 00000254 2 ** 2
Contenido, Alloc, Load, Readonly, Data
2 .note.gnu.Build-ID 0000000024 0000000000000274 0000000000274 00000274 2 ** 2
Contentos,> Contentos,> contenidos, contenidos, sí , CARGAR, SOLO LECTURA, DATOS
  3 .gnu.hash     000000ec  0000000000000298  0000000000000298  00000298  2**3
Contenido, Alloc, Load, Readonly, Data
4 .dynsym 00000df8 000000000000000388 000000000000000388 00000388 2 ** 3
Contenido, Alloc, Load, Readonly, Data
5 .Dynstr 00000682 00000000001180 00000000000018 00001180 2 ** 0
contenido, asignación, carga, lectura, datos
6 .gnu.version 0000012a 000000000000001802 0000000000001802 00001802 2 ** 1
contenido, asign, carga, lectura, datos 7 .Gnu.Version_R 00000070 0000000000001930 000000000000001930 0000001930 2 ** 3
Contenido, Alloc, Load, Readonly, Data
8 .Rela.dyn 00001350 00000000000019A0 00000000000019A0 000019A , ALLOC, LOAD, READONLY, DATOS
9 .rela.plt 00000a68 0000000000002cf0 0000000000002cf0 00002cf0 2 ** 3
CONTENIDO, ALLOC, LOAD, READONLY, DATOS
10 .init 00000017 0000000000003758 0000000000003758 00003758 2 ** 2
Contenido, Alloc, Load, Readonly, Code
11 .PLT 00000700 000000000000003770 00000000003770 00003770 2 ** 4
Contenido, Alloc, Carga, Readonly, Code
12 .plt.got 00000018 0000000000003E70 0000000000003E70 00003E70 2 ** 3
Contenido, Alloc, Load, Readonly, Code
13 .Text 000124D9 0000000000003E90 00000000003E90 00003E9090 2 ** 4 CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES, CONTENTES. , READONLY, CÓDIGO
14 .fini 00000009 000000000001636c 000000000001636c 0001636c 2 ** 2
CONTENIDO, ALLOC, LOAD, READONLY, CÓDIGO
15 .rodata 00004e1d 0000000000016380 0000000000016380 00016380 2 ** 5
Contenido, Alloc, Load, Readonly, Data
16 .EH_Frame_HDR 00000884 00000000000001B1A0 000000000001B1A0 0001B1A0 2 ** 2
Contenido, asignación, carga, lectura, datos
17 .Eh_frame 00002CC0 0000000000000000001BA28 00000 000000000001BA28 0001BA28 2 ** 3
Contenido, asignación, carga, readonly, datos
18 .init_array 00000008 000000000021EFF0 000000000021EFF0 0001EFF0 2 ** 3
Contenido, Alloc, carga, datos
19 19 19 19 19 19 19 .fini_array 00000008 000000000021eff8 000000000021eff8 0001eff8 2 ** 3
CONTENIDO, ALLOC, LOAD, DATOS
20 .data.rel.ro 00000a38 000000000021f000 000000000021f000 0001f000 2 ** 5
CONTENIDO, ALLOC, LOAD, Datos
21 .Dynamic 00000200 000000000021FA38 00000000000021FA38 0001FA38 2 ** 3
contenido, Alloc, carga, datos
22 .GOT 000003C8 000000000021FC38 000000000021FC38 0001FC38 2 ALLOC, Carga, datos
23 .Data 00000268 0000000000220000 0000000000220000000020000 2 ** 5
Contenido, Alloc, carga, datos
24 .BSS 000012E0 0000000000220280 00000000220280 00020268 2 ** 5
         ALLOC
 25 .gnu_debuglink 00000034  0000000000000000  0000000000000000  00020268  2**2
                  CONTENIDO, SOLO LECTURA
SÍMBOLO TABLA:
sin símbolos

P5. ¿Cómo hacer que objdump muestre el contenido del ensamblador de las secciones ejecutables?

Para ello, utilice la opción de línea de comando -d. Aquí hay un ejemplo que muestra esta opción en acción:

objdump -d /bin/ls

Y aquí hay un extracto de la salida:

/bin/ls:     formato de archivo elf64-x86-64


Desmontaje de la sección .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 <[Correo electrónico protegido]@base+0x12>
3768:ff d0 callq *%rax
376a:48 83 c4 c4 08              add    $0x8,%rsp
    376e:    c3                       retq   

Desmontaje de la sección .plt:

000000000003770 <[email :
 7> :FF 35 CA C4 21 00 Pushq 0x21C4CA (%RIP) # 21FC40 <[Correo electrónico protegido]@base+0x260>
3776:FF 25 CC C4 21 00 JMPQ *0x21C4CC (%RIP) # 21FC48 <[Correo electrónico protegido ]@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 068:00 00           pushq  $0x0
    378b:    e9 e0 ff ff ff           jmpq   3770 <[correo electrónico protegido]@Base+0x18>

0000000000003790 <[correo electrónico protegido]  :
9:
9 FF 25 C2 C4 21 00 JMPQ *0X21C4C2 (%RIP) # 21FC58 <[Correo electrónico protegido] _2.2.5>
3796:68 01 00 00 00 PUSHQ $ 0X1
379B:E9 D0 FF FF FF JMPQ 3770 <[correo electrónico protegido]@Base+0x18>

00000000000037a0 <[correo electrónico protegido]>:
    37a0:    ff 25 ba c4 21 00        jmpq   *0x21c4ba(%rip)        # <[21fc60 email protected]_2.2.5>
    37a6:    68 02 00 00 00           pushq  $0x2

De manera similar, puede usar la opción de línea de comando -D para hacer que objdump muestre el contenido del ensamblador de todas las secciones, y la opción -S para asegurarse de que la herramienta mezcle el código fuente con el desensamblado.

P6. ¿Cómo hacer que objdump muestre información de depuración?

Esto puede hacerse posible usando la opción de línea de comando -S.

objdump -g /bin/ls

El siguiente es un extracto de la salida producida por este comando:

Contenido de la sección .eh_frame (cargado desde /bin/ls):


00000000 0000000000000014 00000000 CIE
  Versión:               1
  Aumento:          "zR"
  Factor de alineación de código:1
  Factor de alineación de datos:-8
  Columna de dirección de retorno:16
  Datos de aumento:     1b
  DW_CFA_def_cfa:r7 (rsp) ofs 8
Dw_cfa_offset:R16 (rip) en CFA-8
DW_CFA_UNDEFINED:R16 (RIP)

00000018 000000000000000014 000000001C FDE CIE =0000000000 PC =00000000005850 ..0000000000587B
DW_CFAY> DWF /> DWF /> DWFA_CFA DWFA_CFA DWFA_CFA DWFA_CFA DWFA_CFA DWFA_CFA DWFA_CFA DWFA_CFA DWFA_CFA DWF /> dW_CFAY> />  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop

00000030 0000000000000014 00000000 CIE
  Aumento:          "zR"
  Factor de alineación de código:1
  Factor de alineación de datos:-8
  Columna de dirección de retorno:16
  Datos de aumento:     1b
  DW_CFA_def_cfa:r7 ( rsp) de 8
  DW_CFA_offset:r16 (rip) en cfa-8

P7. ¿Cómo hacer que objdump muestre el contenido de la tabla de símbolos?

Esto se puede hacer usando la opción de línea de comando -t.

objdump -t /bin/ls

Conclusión

Acabamos de arañar la superficie aquí, ya que el comando objdump ofrece muchas opciones de línea de comandos. Una vez que haya terminado de practicar estos, puede obtener más información sobre la herramienta dirigiéndose a su página de manual.


Linux
  1. Comando dir de Linux para principiantes (10 ejemplos)

  2. Comando de pasta de Linux explicado para principiantes (5 ejemplos)

  3. Comando wc de Linux explicado para principiantes (6 ejemplos)

  4. Comando de desexpansión de Linux explicado para principiantes (con ejemplos)

  5. Comando de salida de Linux explicado para principiantes (con ejemplos)

Comando de corte de Linux explicado para principiantes (con ejemplos)

Comando de tiempo de espera de Linux explicado para principiantes (con ejemplos)

Comando Linux dd explicado para principiantes (8 ejemplos)

Comando mv de Linux explicado para principiantes (8 ejemplos)

Comando Linux md5sum explicado para principiantes (5 ejemplos)

Comando host de Linux explicado para principiantes (8 ejemplos)