Динамический двоичный файл из файла - PullRequest
2 голосов
/ 06 января 2011

Это немного странная проблема.

Скажем, у меня есть код C ++, работающий на конкретной платформе. Единственная цель этого кода - запускать файлы, содержащие двоичные файлы, NATIVE для этой платформы.

Теперь - мой вопрос - КАК я мог бы получить данные из этих файлов (даже по битам, например, 1024 бита за цикл) в память машины, на которой выполняется мой код, чтобы эти данные были в исполнительной части?

Другими словами, могу ли я получить данные где-нибудь, где я могу указать указатель инструкции?

Если да, то как?

Я не против, если мне придется использовать ассемблер для этого - просто чтобы это работало.

РЕДАКТИРОВАТЬ: Извините, я не был достаточно конкретным.

В основном - данные файла, которые я хочу загрузить, не имеют такого формата, как .exe, исполняемый файл Mach-O или ELF. Это просто необработанные двоичные данные (с некоторыми пользовательскими заголовками, которые удаляет мой код). Эти двоичные данные являются машинным кодом и предназначены для процессора, работающего на текущем компьютере.

Технически это означает, что я хочу обойти обычных исполнителей ОС и загрузить двоичный файл напрямую. Я мог бы интерпретировать это, но в лучшем случае это было бы примерно в 3 раза медленнее.

Я бы вообще не возражал, если бы мне нужно было запускать данные в другом дочернем процессе - но опять же, я не могу использовать обычные средства открытия процессов, потому что данные не в каком-либо формате, который ОС могла бы запускать автоматически (опять же - как .exe, Mach-O, ELF).

Ответы [ 2 ]

4 голосов
/ 06 января 2011

Вы должны просто прочитать файл в память, пометить эту память как исполняемую (она зависит от платформы, например, VirtualProtect() для Windows) и вызвать ее как функцию: ((void(*)())ptr)();

Конечно, код в файле должен быть позиционно-независимым .

0 голосов
/ 06 января 2011

Насколько универсальным должно быть ваше решение?

Загрузчик ОС обычно знает, как обрабатывать определенные форматы файлов и как загружать их в память. Обычно вы можете использовать загрузчик ОС и вызывать точку входа, но для этого вам нужно знать, что такое точка входа, и для этого вам все равно нужно понимать формат файла. Я не могу придумать портативное решение для этого.

Если вы расскажете больше о том, что вы хотите сделать, возможно, будет возможно предложить решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...