Для этой задачи можно использовать директиву .incbin
GAS . Вот совершенно бесплатная лицензионная библиотека, которая ее оборачивает:
https://github.com/graphitemaster/incbin
Напомним. Метод incbin такой. У вас есть файл сборки thing.s, который вы компилируете с помощью gcc -c thing.s
.section .rodata
.global thing
.type thing, @object
.align 4
thing:
.incbin "meh.bin"
thing_end:
.global thing_size
.type thing_size, @object
.align 4
thing_size:
.int thing_end - thing
В вашем коде c или cpp вы можете ссылаться на него:
extern const char thing[];
extern const char* thing_end;
extern int thing_size;
Итак, вы связываете полученный .o с остальными единицами компиляции.
Надо отдать должное @John Ripley с его ответом: C / C ++ с GCC: Статически добавлять файлы ресурсов в исполняемый файл / библиотеку
Но вышесказанное не так удобно, как то, что может дать вам incbin. Чтобы выполнить вышеизложенное с помощью incbin, вам не нужно писать никакой ассемблер. Подойдет только следующее:
#include "incbin.h"
INCBIN(thing, "meh.bin");
int main(int argc, char* argv[])
{
// Now use thing
printf("thing=%p\n", gThingData);
printf("thing len=%d\n", gThingSize);
}