Как преобразовать двоичный файл в перемещаемый объектный файл и обратно?

Я хочу внедрить объектный файл в существующий двоичный файл. Я пытаюсь использовать следующий метод:

  • Преобразование скомпилированного двоичного файла в перемещаемый объектный файл.
  • Используйте 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

Обоснование

Те, кто заинтересован, могут найти обоснование здесь.

5
задан Community 23 May 2017 в 10:33
поделиться