Хранить сборку данных только для чтения и C ++ - PullRequest
2 голосов
/ 02 февраля 2012

Я разрабатываю какой-то кроссплатформенный инструмент и хочу хранить некоторые данные только для чтения, данные о типах ресурсов (изображения или строки или информацию «Произведено ...» или информацию о версии файла).

Я пытаюсь закодировать инструмент, «чистый c» или «c ++».

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

Данные также могут быть прочитаны, кроме того, самой программой при выполнении.

Данные будут записаны только один раз, когдакод скомпилирован.

Я нашел 2 возможных способа сделать это.

(1) Встроенная сборка.Добавление инструкций asm напрямую в файлы "чистого c" или "c ++", некоторые компиляторы, такие как Borland, MS, GNU, имели некоторую форму этого.

(2) Генерация кода и кода сборкив отдельных файлах и используйте инструмент компилятора, такой как компоновщик, сборку или компилятор, чтобы скомпилировать все вместе.

Я не хочу хранить инструкции ассемблера, только данные.

Я нацеливаюсь на x86-32-битные процессоры, Windows, Linux и BSD, но, если возможно, может быть расширен на другие платформы или архитектуры.

Я знаю, что Windows & Linuxиспользовать разные форматы файлов, такие как PE, COFF или ELF.

Какие-нибудь дополнительные или альтернативные идеи?Любые предложения, руководства, ссылки, как это сделать?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Один из способов сделать это - добавить данные, которые вы хотите сохранить, в конец вашего скомпилированного двоичного файла (возможно, на этапе после компиляции) и сразу после данных сохранить размер в 32-битном или 64-битном целом числе..

Затем, чтобы вывести данные, в своем коде откройте () ваш двоичный файл, ищите до конца, прочитайте размер, затем прочитайте в обратном направлении, пока не получите все данные.1005 *

Простой и достаточно портативный.

2 голосов
/ 02 февраля 2012

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

например,

char data[]={
    't','h','e','_','s','t','a','r','t',0,
    // resource data here
    ....
    't','h','e','_','e','n','d',0,
    // maybe a checksum here
    ...
};

На всех платформах, с которыми я знаком, эти байты будут храниться в файле непрерывно (который вы можете сканировать на наличие сигнатур для загрузкиресурсы).И, конечно же, данные будут непрерывно храниться в памяти во время работы программы (и будут доступны как «данные»).

Если что-то подобное не подходит, вам, вероятно, потребуется больше узнать о вашемФормат исполняемого файла ОС.

...