Comando Linux objdump

Linux 命令大全Referencia completa de comandos Linux


objdump es una importante herramienta de línea de comandos del conjunto de herramientas GNU Binutils, utilizada para mostrar diversa información sobre archivos objeto (object files) y archivos ejecutables. Es una herramienta poderosa para análisis binario, ingeniería inversa y depuración en sistemas Linux.

Las principales funciones de objdump incluyen:

  • Desensamblar archivos binarios
  • Ver la información de la cabecera del archivo
  • Mostrar el contenido de las secciones (sections)
  • Ver la tabla de símbolos
  • Mostrar información de reubicación
  • Analizar la estructura del archivo

Sintaxis básica

El formato básico del comando objdump es el siguiente:

objdump [选项] 文件名

Si no se especifica ninguna opción, objdump mostrará la información de la cabecera de las secciones del archivo.


Explicación detallada de opciones comunes

Opciones relacionadas con el desensamblado

Ejemplo

-d, --disassemble        # Desensamblar las secciones que contienen código
-D, --disassemble-all    # Desensamblar todas las secciones
-S, --source             # Mostrar código fuente y ensamblador de forma mezclada (requiere usar la opción -g al compilar)
--prefix-addresses       # Mostrar direcciones completas al desensamblar
--no-addresses           # No mostrar información de direcciones

Opciones de información de secciones

Ejemplo

-h, --section-headers    # Mostrar la información de la cabecera de secciones
-j, --section=nombre# Mostrar solo el contenido de la sección especificada

Opciones de tabla de símbolos

Ejemplo

-t, --syms               # Mostrar la tabla de símbolos
-T, --dynamic-syms       # Mostrar la tabla de símbolos dinámicos

Información de la cabecera del archivo

-f, --file-headers       # 显示文件头部信息

Otras opciones útiles

Ejemplo

-l, --line-numbers       # Mostrar información de números de línea (requiere información de depuración)
-r, --reloc              # Mostrar entradas de reubicación
-R, --dynamic-reloc      # Mostrar entradas de reubicación dinámica
-s, --full-contents      # Mostrar el contenido completo de todas las secciones

Ejemplos prácticos

Ejemplo 1: Ver la estructura de un archivo ejecutable

objdump -h /bin/ls

Ejemplo de salida:

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

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .interp       0000001c  0000000000400238  0000000000400238  00000238  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.ABI-tag 00000020  0000000000400254  0000000000400254  00000254  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  ...

Ejemplo 2: Desensamblar un archivo ejecutable

objdump -d /bin/ls

Ejemplo de salida (parcial):

0000000000405a50 :
  405a50:       31 ed                   xor    %ebp,%ebp
  405a52:       49 89 d1                mov    %rdx,%r9
  405a55:       5e                      pop    %rsi
  405a56:       48 89 e2                mov    %rsp,%rdx
  405a59:       48 83 e4 f0             and    $0xfffffffffffffff0,%rsp
  ...

Ejemplo 3: Ver la tabla de símbolos

objdump -t myprogram.o

Ejemplo de salida:

myprogram.o:     file format elf64-x86-64

SYMBOL TABLE:
0000000000000000 l    df *ABS*  0000000000000000 myprogram.c
0000000000000000 l    d  .text  0000000000000000 .text
0000000000000000 g     F .text  0000000000000015 main
0000000000000000         *UND*  0000000000000000 printf

Ejemplo 4: Mostrar código fuente y ensamblador mezclados

objdump -S myprogram

Ejemplo de salida:

Ejemplo

int main() {
  400526:       55                      push   %rbp
  400527:       48 89 e5                mov    %rsp,%rbp
    printf("Hello, World!n");
  40052a:       bf d4 05 40 00          mov    $0x4005d4,%edi
  40052f:       e8 cc fe ff ff          callq  400400
    return 0;
  400534:       b8 00 00 00 00          mov    $0x0,%eax
}

Escenarios de aplicación práctica

Escenario 1: Depurar un fallo del programa

Cuando un programa falla, se puede usar objdump para ver el código cercano a la dirección del fallo:

objdump -d --start-address=0x400526 --stop-address=0x400536 myprogram

Escenario 2: Analizar llamadas a funciones de bibliotecas

Ver qué funciones de bibliotecas dinámicas llama el programa:

objdump -T myprogram | grep UND

Escenario 3: Aprender lenguaje ensamblador

Aprender lenguaje ensamblador desensamblando un programa simple en C:

Ejemplo

gcc -o simple simple.c
objdump -d simple

Precauciones

  1. Información de depuración: Para obtener información a nivel de código fuente, al compilar es necesario añadir-gopción
  2. Impacto de la optimización: La optimización del compilador afecta al código ensamblador generado; se debe tener cuidado al analizar
  3. Diferencias de arquitectura: Los códigos ensambladores difieren según la arquitectura de la CPU; asegúrese de usar las opciones de desensamblado correctas
  4. Problemas de permisos: Analizar archivos del sistema puede requerir permisos de root
  5. Formato de archivo: objdump está dirigido principalmente a archivos en formato ELF; otros formatos pueden requerir un tratamiento especial

Técnicas avanzadas

Uso combinado con otras herramientas

Ejemplo

# Usar grep para filtrar funciones específicas
objdump -d myprogram | grep -A20 "main>:"

# Calcular el tamaño de las funciones
objdump -d myprogram | awk '/^[0-9a-f]+ :/ {print $1,$2}'

Crear un script de desensamblado

Ejemplo

#!/bin/bash
# Ejemplo de script de desensamblado
if [ $# -ne 1 ]; then
    echo "Usage: $0 "
    exit 1
fi

echo "=== Información de la cabecera del archivo ==="
objdump -f $1

echo -e "n=== Información de las secciones ==="
objdump -h $1

echo -e "n=== Código de desensamblado ==="
objdump -d $1

Resumen

objdump es una potente herramienta de análisis binario en sistemas Linux. Dominarla permite:

  • Comprender en profundidad el mecanismo de ejecución de los programas
  • Localizar rápidamente problemas en los programas
  • Aprender lenguaje ensamblador y conocimientos del sistema
  • Realizar análisis básicos de ingeniería inversa

Con los usos básicos y los ejemplos prácticos presentados en este artículo, ya deberías poder comenzar a utilizar objdump para realizar análisis básicos de archivos binarios. A medida que acumules experiencia práctica, descubrirás más usos útiles de esta herramienta en la programación de sistemas y la depuración.


Linux 命令大全Referencia completa de comandos Linux

Otras extensiones