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.