Сделать исполняемый двоичный файл из эльфа используя 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.

Вы, вероятно, должны прочитать хороший учебник по ОС, такой как " Операционная система: три простых куска".

Другие вопросы по тегам