LINUX.ORG.RU

Как «вкомпилить» произвольный файл в C++ софтину в виде некой секции данных?

 


1

4

Сделать что-то типа создания ELF-секции данных, куда вкомпиливается произвольный файл. Только как содержимое этой секции запамить на абстракцию высокого уровня, типа struct { char *p; size_t size; }?



Последнее исправление: hlamotron (всего исправлений: 1)

пишешь генератор кода, на входе произвольный файл, на выходе описание данных на С++

Harald ★★★★★
()

Как «вкомпилить» произвольный файл в C++ софтину в виде некой секции данных?

Очевидно же. Вкомпилятором.

anonymous
()
Ответ на: комментарий от Gvidon

На выходе получаешь обычный сишный массив

Да, эту штуку знаю. Думал может можно как-то через линкер, причём переносимо.

Непереносимость в том, что один линкер секцию назовёт так, другой сяк. Непоймёшь как называть extern - переменные в коде.

hlamotron
() автор топика

Влинковать. Ну еще есть конверторы бинарей в константные массивы char.

cvv ★★★★★
()

так кури маны на тему ld, а в коде явно указываешь секцию, куда твои данные пихать, через __attribute__((section ...))

demidrol ★★★★★
()

можно добавь ассемблерный файл в свою софтину

$ cat myasmfile.S
.global MyAwesomeBinary, MyAwesomeBinaryEnd

.data
.align 8
MyAwesomeBinary:
    .incbin "file.txt"
MyAwesomeBinaryEnd:
    .zero 1
$ cat file.txt
Hello, world!
// myprogram.c
#include <stdio.h>

extern char MyAwesomeBinary, MyAwesomeBinaryEnd;

int main() {
    puts(&MyAwesomeBinary);
    printf("Binary length: %i\n", &MyAwesomeBinaryEnd - &MyAwesomeBinary);
}
$ gcc myprogram.c myasmfile.S -o myprogram
$ ./myprogram
Hello, world!
Binary length: 13
anonymous
()
Ответ на: комментарий от x905

чтобы не таскать ресурсы отдельными файлами, например

next_time ★★★★★
()
Ответ на: комментарий от hlamotron

Назови хоть один недостаток вариант с xxd. Абсолютно переносимо, совместимо со всеми компиляторами, бинарные данные доступны в виде простой константной переменной.

KivApple ★★★★★
()
Ответ на: комментарий от hlamotron

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

lovesan ★★★
()
Ответ на: комментарий от lovesan

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

А медведи зубастые и когтистые.

hlamotron
() автор топика
Ответ на: комментарий от KivApple

Назови хоть один недостаток вариант с xxd. Абсолютно переносимо, совместимо со всеми компиляторами, бинарные данные доступны в виде простой константной переменной.

Генерация лишней сущности, типа исходника.

hlamotron
() автор топика
Ответ на: комментарий от KivApple

Компилятору же это все надо распарсить, а если там несколько мегабайт, то это десятки секунд могут уйти на компиляцию.

anonymous
()

у гнутого ld есть такая штука - скрипты линковки. позволяет гнуть бинарник вдоль и поперёк, даже свой формат придумать можно.

ckotinko ☆☆☆
()
Последнее исправление: ckotinko (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.