Небольшая программа, которую я сделал, содержит множество небольших растровых изображений и звуковых клипов, которые я бы предпочел включить в сам двоичный файл (они должны быть отображены в памяти в любом случае). В стандарте MS PE/COFF существует конкретное описание того, как включать ресурсы (раздел .rsrc), который имеет хорошую иерархию файловой системы. Я не нашел ничего подобного в спецификации ELF для Linux, поэтому я предполагаю, что можно свободно включать эти ресурсы, как казалось нужным.Добавить ресурсы в объект ELF, сгруппированный в один раздел
Что я хочу достичь, так это то, что я могу включить все ресурсы только в один раздел ELF с символическим именем в начале каждого ресурса (чтобы я мог обращаться к ним из своего кода на C). То, что я делаю сейчас, используя небольшой NASM файл, который имеет следующую структуру:
SECTION .rsrc
_resource_1:
incbin "../rsrc/file_name_1"
_resource_1_length:
dw $-resource_1
_resource_2:
incbin "../rsrc/file_name_2"
_resource_2_length:
dw $-resource_2
...
Я могу легко собрать это объект ELF, который может быть связан с моим кодом C. Тем не менее, мне не нравится использование сборки, поскольку это делает мой код зависимым от платформы.
Что было бы лучшим способом добиться того же результата?
Этот вопрос уже задавался на StackOverflow, но предлагаемые решения не применимы к моему делу:
- Решение, предложенное здесь: C/C++ with GCC: Statically add resource files to executable/library Включая ресурсы, как шестигранные массивы в коде C не очень полезно, поскольку это смешивает код и данные в одном разделе. (Кроме того, это тоже не практично, поскольку я не могу просмотреть ресурсы после их преобразования в массивы)
- Использование
objcopy --add-section
на каждом ресурсе работает, но затем каждый ресурс получает свой раздел (включая заголовок и все такое). Это кажется немного расточительным, поскольку у меня есть около 120 файлов для включения (каждый из +/- 4K).
Ключевое слово GCC «__section» может использоваться с предлагаемым решением, включающим в себя шестнадцатеричные массивы. Делая «массивы» -файлы зависят от их двоичных «родителей» в вашей строительной среде, вы все равно сможете просматривать файлы. –