2009-04-30 15 views
8

¿Hay alguna manera de encontrar los archivos objeto a partir de los cuales se genera el ejecutable actual en Linux (RHEL es específico). Entiendo que uno puede usar "nm" para encontrar los símbolos exportados, "ldd" para encontrar el objeto compartido dependiente.Archivos de objeto en un archivo ejecutable en Linux

Pero no pude encontrar el comando para averiguar el nombre de los archivos de objeto (.o) de los que se compone el ejecutable. ¿Es posible?

Respuesta

6

Si se ha compilado con información de depuración, sí. Use gdb (man gdb) para encontrar la información.

Si no se ha compilado sin información de depuración. Estás fuera de suerte.

1

Además de NullPtr, "objetos compartidos" se refiere a otras bibliotecas compartidas (vinculado), no a los objetos originales (no ligado)

1

Puede también utilizar objdump (siempre y cuando el ejecutable y los objetos fueron compilados con información de depuración):

# gcc -g -c -o /tmp/some_object.o /tmp/some_object.c 
# gcc -g -o /tmp/file /tmp/file.c /tmp/some_object.o 
# objdump -g /tmp/file | awk 'BEGIN{out=0} /Directory Table/{out=1} /Line Number Statements/{out=0} {if(out){print $0}}' 
The Directory Table (offset 0x1b): 
    1  /tmp 

The File Name Table (offset 0x21): 
    Entry Dir  Time Size Name 
    1  1  0  0  file.c 

The Directory Table (offset 0x5a): 
    1  /tmp 

The File Name Table (offset 0x60): 
    Entry Dir  Time Size Name 
    1  1  0  0  some_object.c 

awk se utiliza sólo para extraer la información relevante (si no se utiliza, se obtendrá la información de depuración completa en el ejecutable y objetos).

4

Los nombres originales de los archivos de objeto no se almacenan en la información de depuración de DWARF.

Cada archivo de objeto tiene una entrada DW_TAG_compile_unit en la sección .debug_info. Esta entrada contiene una referencia al "archivo fuente principal del cual se derivó la unidad de compilación", pero no el nombre del archivo objeto. The DWARF standard contiene una lista de los atributos que se pueden almacenar para cada unidad de compilación (sección 3.1.1, página número 44, pdf página 58).

Puede consultar la información que se almacena con el siguiente comando:

$ readelf --debug-dump=info --dwarf-depth=1 hw 

Salida:

Contents of the .debug_info section: 
<some compilation units removed>  
    Compilation Unit @ offset 0x133: 
    Length:  0x8b (32-bit) 
    Version:  4 
    Abbrev Offset: 0x64 
    Pointer Size: 4 
<0><13e>: Abbrev Number: 1 (DW_TAG_compile_unit) 
    <13f> DW_AT_producer : (indirect string, offset: 0x131): GNU C11 5.3.0 -mtune=generic -march=pentiumpro -g 
    <143> DW_AT_language : 12  (ANSI C99) 
    <144> DW_AT_name  : (indirect string, offset: 0x163): hw.c 
    <148> DW_AT_comp_dir : (indirect string, offset: 0x168): /home/mikel/src/hw 
    <14c> DW_AT_low_pc  : 0x80483db 
    <150> DW_AT_high_pc  : 0x2e 
    <154> DW_AT_stmt_list : 0xea 
<1><158>: ... 
<some compilation units removed> 
1

un fichero objeto se traduce en un archivo ejecutable después del enlace. Si se comparte el enlace, puede obtenerlo a través de bibliotecas compartidas (ldd). Sin embargo, si el enlace es estático, solo hay forma, es decir, a través de la información de depuración. Puede instalar paquetes de debuginfo en RHEL (o Fedora para el caso). Aquí están las instrucciones

y luego usar GDB info sources como se describe aquí:

Esto le daría un l ist de Archivos de origen. Pero para obtener realmente los archivos de objeto, necesita profundizar en las herramientas de compilación (rpmbuild).Y realmente ejecutar rpmbuild que se necesita el paquete RPM fuente, que se puede obtener utilizando las instrucciones detalladas aquí:

Ahora puede crear los mismos paquetes y diseccionar el que .o archivo resultó en el ejecutable.

Espero que ayude.

Cuestiones relacionadas