Добавление данных в исполняемый файл (Windows, Unix) - PullRequest
1 голос
/ 03 января 2012

У меня есть программа, которая компилирует и запускает скрипты.

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

Это прекрасно работает.Однако у него есть некоторые недостатки:

  • буфер статичен и занимает место, если в нем нет скомпилированной программы.
  • если сценарий, который будет включен, превышает размер буфера, мне нужно создать новую версию с большим буфером.

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

Есть ли способ манипулировать exe, чтобы он был приемлем для загрузчиков (учтите, что этокроссплатформенная программа)?

Ответы [ 2 ]

0 голосов
/ 03 января 2012

Вы сказали «скрипт», так что я полагаю, у вас есть отдельный файл, содержащий скрипт (текстовый файл?).Вы можете написать простую программу, которая читает файл сценария и преобразует его в скомпилированную форму (например, источник C, содержащий инициализацию массива байтов).Есть также инструменты, которые вы можете использовать для преобразования произвольного файла в связываемый объект (.o или .obj).В прошлом я использовал команду "objcopy" из GNU bimutils.В частности, в linux:

objcopy -I binary -O elf32-i386 mydata mydata.o

Эта команда создает объект и три общедоступных символа, которые можно использовать для определения начала, конца и размера вашего блока данных:

_binary_mydata_start _binary_mydata_end_binary_mydata_size

Нечто подобное может работать и в Windows, при условии, что вы устанавливаете версию GNU binutils для Windows (например, cygwin).

0 голосов
/ 03 января 2012

будет приемлемо для загрузчиков (помните, что это кроссплатформенная программа)?

Я думаю, что это вряд ли возможно без привязки к конкретной платформе. Время для общего интерфейса с различными реализациями (поэтому код, который сохраняет / загружает сценарий, является обычным, но выполняемые манипуляции специфичны).

В Windows вы столкнетесь с проблемой того, что исполняемый файл заблокирован от изменения. Работая с копиями, это можно обойти (но единственный способ полностью переопределить переименование обратно - это выполнить перемещение при загрузке, но планирование задания может быть приемлемым).

В Windows самый простой способ добавить данные в изображение (исполняемый файл или DLL) - это использование ресурсов. Определите пользовательский тип ресурса и добавьте его в изображение (функция UpdateResource), а затем получите с помощью LoadResource.

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