Как встроить файл в исполняемый файл?

У меня две проблемы, первая из них решена .

Текущая проблема
Если я встраиваю файл, для загрузки которого требуется библиотека, например изображение в формате jpeg или музыка в формате mp3, мне нужно будет использовать этот файл в качестве входных данных для библиотеки. Однако каждая библиотека отличается и использует способ получения файла в качестве входных данных, входом может быть имя файла или указатель FILE * (из файлового интерфейса libc).

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

Если show_file (const char * name) - это функция из библиотеки, мне понадобится строка для открытия файла.
Я видел эти вопросы:
Как получить файловый дескриптор буфера в памяти?
Получение имени файла из файлового дескриптора в C

и следующий код - мое решение. Это хорошее решение? Это неэффективно?

# include 
# include 

extern char _binary_data_txt_start;
extern const void* _binary_data_txt_size;
const size_t len = (size_t)&_binary_data_txt_size;

void show_file(const char* name){
    FILE* file = fopen(name, "r");
    if (file == NULL){
        printf("Error (show_file): %s\n", name);
        return;
    }

    while (true){
        char ch = fgetc(file);
        if (feof(file) )
            break;
        putchar( ch );
    }
    printf("\n");

    fclose(file);
}

int main(){

    int fpipe[2];
    pipe(fpipe);

    if( !fork() ){
        for( int buffsize = len, done = 0; buffsize>done; ){
            done += write( fpipe[1], &_binary_data_txt_start + done, buffsize-done );
        }
        _exit(0);
    }

    close(fpipe[1]);
    char name[200];
    sprintf(name, "/proc/self/fd/%d", fpipe[0] );

    show_file(name);

    close(fpipe[0]);
}

Другая проблема (решена)
Я попытался встроить файл в Linux с помощью GCC, и это сработало. Однако я попытался сделать то же самое в Windows с помощью Mingw, и он не компилировался.

Код:

# include 

extern char _binary_data_txt_start;
extern char _binary_data_txt_end;

int main(){
    for (char* my_file = &_binary_data_txt_start; my_file <= &_binary_data_txt_end; my_file++)
        putchar(*my_file);
    printf("\n");
}

Команды компиляции:

objcopy --input-target binary --output-target elf32-i386 --binary-architecture i386 data.txt data.o
g++ main.cpp data.o -o test.exe

В Windows я получаю следующую ошибку компилятора:

undefined reference to `_binary_data_txt_start'
undefined reference to `_binary_data_txt_end'

Я попытался заменить elf32-i386 на i386-pc-mingw32 , но все равно получаю ту же ошибку.

16
задан Community 23 May 2017 в 11:52
поделиться