Я хочу внедрить объектный файл в существующий двоичный файл. Я пытаюсь использовать следующий метод:
gcc/ld
, чтобы связать перемещаемый объектный файл с встраиваемым объектным файлом.Учитывая источник:
#include
#include
int main(void)
{
puts("main");
return EXIT_SUCCESS;
}
Я компилирую это на host
со следующим:
gcc -Wall host.c -o host
Я делаю преобразование в перемещаемый объектный файл с помощью:
objcopy -B i386 -I binary -O elf64-x86-64 host host.o
Затем я пытаюсь установить связь с:
gcc host.o -o host
В идеале это перекомпонует перемещаемый объектный файл обратно в двоичный файл. Это также даст возможность связать любые дополнительные объектные файлы. К сожалению, команда выдает следующую ошибку:
/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
У меня вопрос: почему появляется эта ошибка и как мне правильно перелинковать?
Что-то, что я пробовал, заключалось в том, чтобы связать в этот момент другой объектный файл, который содержал фиктивный файл main (потому что я полагал, что смогу вручную исправить точку входа позже), но произошло то, что новый двоичный файл, похоже, переместил старый код странным образом с полностью запутанной таблицей символов.
readelf
о двоичном файле дает следующее:
mike@mike-ubuntu:~/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
И о перемещаемом объектном файле:
mike@mike-ubuntu:~/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
Те, кто заинтересован, могут найти обоснование здесь.