2012-02-02 2 views
2

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

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

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

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

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

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

(1) Встроенная сборка. Добавьте непосредственно инструкции asm к файлам «pure c» или «C++», некоторые составители компиляторов, такие как Borland, MS, GNU, имели определенную форму.

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

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

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

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

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

Спасибо.

+0

Этот ответ может содержать необходимую информацию: http://stackoverflow.com/a/4158997/12711 Один метод работает только для инструментальной цепочки GCC, но другой метод работает с любым компилятором C. Чтобы позволить общей библиотеке читать данные, вам нужно иметь некоторый методd, чтобы получить указатель на данные в общую библиотеку (легко сделать с помощью функции, если это выполнимо для вас). –

ответ

2

Возможно, это немного уродливо, но вот одна вещь, которую вы можете сделать, которая должна быть относительно переносимой: Храните все содержимое ваших данных в виде массива 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 
    ... 
}; 

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

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

+0

Использование маркера начала и маркера завершения. Третий, альтернативный, но практический путь. Я подумаю об этом. Благодарю. – umlcat

2

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

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

Простые и довольно портативные.

+1

+1. Вот как работают большинство однопоточных установщиков. –

+0

Я также проверю эту альтернативу. Благодарю. – umlcat

Смежные вопросы