Сделать исполняемый двоичный файл из эльфа используя GNU objcopy
Я хотел бы скопировать исполняемый файл ELF через:
$ objcopy -O binary myfile.elf myfile.bin
К несчастью:
$ chmod +x myfile.bin
$ ./myfile.bin
приводит к: не может выполнить двоичный файл
Есть ли способ сохранить исполняемость файлов?
1 ответ
Чтобы быть исполняемым с помощью системного вызова execve(2), файл обычно должен быть каким-то файлом elf(5) (или каким-либо сценарием, или каким-то старым). a.out
формат). Но смотрите также binfmt_misc
Ваша команда objcopy(1) теряет основные метаданные в файле ELF. Может быть, вы хотите стриптиз (1)
Напомним, что ELF является довольно сложным и универсальным форматом, он указывает начальный адрес, интерпретатор (динамический компоновщик ld-linux(8)), несколько сегментов программы и т. Д. Все эти метаданные необходимы ядру для execve(2)
и теряется с objcopy -O binary
...
Когда вы используете objcopy -O binary, вы копируете только двоичные данные:
objcopy можно использовать для генерации необработанного двоичного файла, используя выходную цель `binary' (например, используйте -O binary). Когда objcopy генерирует необработанный двоичный файл, он, по существу, создает дамп памяти содержимого файла входных объектов. Все символы и информация о перемещении будут отброшены. Дамп памяти начнется с адреса загрузки самого нижнего раздела, скопированного в выходной файл.
В частности, вы теряете точку входа и список сегментов, указанные в исходном заголовке ELF. Ядро не может угадать их.
Я не понимаю, почему вы ожидаете результат objcopy -O binary
быть исполняемым с помощью Linux execve(2)
, Основная цель этого objcopy -O binary
Команда состоит в том, чтобы сделать встроенные программы или подобные ядру автономные (или автономные) двоичные файлы, а затем вам нужно точно понять, как они должны выглядеть (например, какова их отправная точка, как они загружаются и запускаются), и вы, вероятно, также используете некоторый очень специфический скрипт компоновщика, и, конечно, этот двоичный файл не может содержать никаких системных вызовов для ядра Linux (в частности, не может делать какой-либо ввод или вывод так, как это делает обычный исполняемый файл Linux).
Читайте также больше о ABI, x86-64 ABI, Linux Assembly HowTo, книга по расширенному программированию в Linux.
Вы, вероятно, должны прочитать хороший учебник по ОС, такой как " Операционная система: три простых куска".