2012-03-22 21 views
5

Deseo insertar un archivo de objeto en un archivo binario existente. El método que intento es:¿Cómo convertir de archivo binario a objeto reubicable y viceversa?

  • Convierta un binario compilado en un archivo de objeto reubicable.
  • Utilice gcc/ld para vincular el archivo de objeto reubicable con el archivo de objeto que se va a incrustar.

Dada la fuente:

#include <stdlib.h> 
#include <stdio.h> 

int main(void) 
{ 
    puts("main"); 
    return EXIT_SUCCESS; 
} 

puedo compilar este a host con lo siguiente:

gcc -Wall host.c -o host 

hago la conversión a archivo de objeto reubicable con:

objcopy -B i386 -I binary -O elf64-x86-64 host host.o 

Luego intento un enlace con:

gcc host.o -o host 

Idealmente, esto volvería a vincular el archivo de objeto reubicable a un archivo binario. Esto también daría la posibilidad de vincular cualquier archivo de objeto adicional. Por desgracia, el comando da el siguiente error:

/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: ld returned 1 exit status 

Mi pregunta es por qué está apareciendo este error y cómo hago para volver a vincular adecuadamente?

Algo que probé era vincular en otro archivo de objeto en este punto que contenía un dummy main (porque pensé que podía parchear manualmente el punto de entrada más tarde), pero lo que sucedió fue que el nuevo binario parecía reubicarse el viejo código de una manera extraña con la tabla de símbolos completamente en mal estado.

Información adicional

readelf en el binario se obtiene la siguiente:

[email protected]:~/Desktop/inject-obj$ readelf -h host 
ELF Header: 
    Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF64 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        EXEC (Executable file) 
    Machine:       Advanced Micro Devices X86-64 
    Version:       0x1 
    Entry point address:    0x400410 
    Start of program headers:   64 (bytes into file) 
    Start of section headers:   4424 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   56 (bytes) 
    Number of program headers:   9 
    Size of section headers:   64 (bytes) 
    Number of section headers:   30 
    Section header string table index: 27 

Y en el fichero objeto reubicable:

[email protected]:~/Desktop/inject-obj$ readelf -h host.o 
ELF Header: 
    Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF64 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        REL (Relocatable file) 
    Machine:       Advanced Micro Devices X86-64 
    Version:       0x1 
    Entry point address:    0x0 
    Start of program headers:   0 (bytes into file) 
    Start of section headers:   8480 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   0 (bytes) 
    Number of program headers:   0 
    Size of section headers:   64 (bytes) 
    Number of section headers:   5 
    Section header string table index: 2 

Fundamento

Para los interesados, la razón se puede encontrar here.

Respuesta

3

Un archivo ejecutable que no es PIE es imposible de reubicar. Las reubicaciones ya se han realizado y el registro de esas reubicaciones fue desechado. Es decir, reubicarlo requeriría encontrar todas las direcciones de objetos o funciones dentro del código y los datos del binario, pero es imposible determinar si una secuencia de bytes es una dirección u otro tipo de datos o códigos.

Debe haber una manera de hacer lo que originalmente quería hacer (agregar un nuevo código), pero el enfoque que está tomando está condenado al fracaso.

Cuestiones relacionadas