2012-03-22 12 views
5

Chciałbym wprowadzić plik obiektowy do istniejącego pliku binarnego. Metoda, którą próbuję, to:Jak przekonwertować z pliku binarnego na relokatowany obiekt z powrotem?

  • Konwertuj skompilowany plik binarny na relokowalny plik obiektu.
  • Użyj gcc/ld, aby połączyć relokowalny plik obiektowy z plikiem obiektu do osadzenia.

Biorąc pod uwagę źródło:

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

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

skompilować to host z następujących czynności:

gcc -Wall host.c -o host 

zrobić konwersję do nierelokacyjnego pliku obiektu z:

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

Następnie próbuję link z:

gcc host.o -o host 

Idealnie, to zrewolucjonizowałoby relokowalny plik obiektowy z powrotem do pliku binarnego. Dałoby to również szansę na połączenie w dowolne dodatkowe pliki obiektów. Niestety komenda daje następujący błąd:

/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 

Moje pytanie jest dlaczego ten błąd pojawiający a jak pójdę o prawidłowo relinkowania?

Coś, co próbowałem, to połączyć w innym pliku obiektowym w tym miejscu, który zawierał fikcyjną magistralę (ponieważ doszedłem do wniosku, że mógłbym ręcznie poprawić punkt wejścia później), ale stało się tak, że nowy plik binarny zdawał się przenosić stary kod w dziwny sposób z tablicą symboli całkowicie pomieszany.

dodatkowych informacji

readelf na binarnym daje następujące:

[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 

A na nierelokacyjnego pliku obiektu:

[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 

uzasadnienie

Dla zainteresowanych uzasadnienie można znaleźć here.

Odpowiedz

3

Plik wykonywalny, który nie jest PIKI, jest niemożliwy do przeniesienia. Przeprowadzono już przeniesienia, a zapis tych przeniesień został wyrzucony. Oznacza to, że przeniesienie go wymagałoby znalezienia wszystkich adresów obiektów lub funkcji wewnątrz kodu i danych binarnych, ale niemożliwe jest określenie, czy sekwencja bajtów jest adresem, czy jakimś innym rodzajem danych lub kodu.

Powinien istnieć sposób na zrobienie tego, co pierwotnie chciałeś zrobić (dodanie nowego kodu), ale podejście, które podejmujesz, jest skazane na niepowodzenie.

Powiązane problemy