| Запись бинарных данных в секцию ELF | [исправить] | 
| Стоит задача - в программе запрятать бинарные данные. Допустим архив. 
Создаём файл data.cpp для включения запланированных для добавления данных:
   volatile char a[DATASIZE] __attribute__((section(".her"))) = {0xfa};
Таким образом мы обозначаем намерения создать переменную в отдельной секции.
Далее компилируем data.cpp в object-файл data.o:
   g++ -c -g data.cpp
Смотрим shed-адрес секции. И производим заливку согласно предустановленному
размеру переменной "a". На моём компьютере это выглядит так:
   dd if=out.tar of=data.o bs=1 count= seek=52 conv=notrunc
Архив, либо бинарник конечно предварительно может быть зашифрован, дабы
избежать лишних посягательств. Дальнейшую сборку программы можно сделать Make
файлом, но я решил написать командами для наглядности процесса:
   g++ -c -g main.cpp
   g++ -g -o test main.o data.o
Альтернативный вариант от посетителя maneken:
   __asm(
   ".global data_file\n"
   ".global _data_file\n"
   "data_file:\n"
   "_data_file:\n"
   ".incbin \"data.zip\"\n"
   ".global data_file_len\n"
   ".global _data_file_len\n"
   "data_file_len:\n"
   "_data_file_len:\n"
   ".int .-data_file \n"
   );
   extern void * data_file;
   extern void * data_file_len;
   unsigned char * data =(unsigned char *)&data_file;
   int * datalen =(int *) &data_file_len;
 | 
|  | 
| 
 | 
 | | Раздел:    Корень / Программисту и web-разработчику / C/C++, сборка, отладка | 
| 
 | 1.2, maneken (?), 05:49, 20/01/2016  [ответить] | +/– |  |  А так чем плохо? Ничего дополнительно делать не надо. __asm(
 ".global data_file\n"
 ".global _data_file\n"
 "data_file:\n"
 "_data_file:\n"
 ".incbin \"data.zip\"\n"
 ".global data_file_len\n"
 ".global _data_file_len\n"
 "data_file_len:\n"
 "_data_file_len:\n"
 ".int .-data_file \n"
 );
 extern void * data_file;
 extern void * data_file_len;
 unsigned char * data =(unsigned char *)&data_file;
 int * datalen =(int *) &data_file_len;
 
 |  |  | 
 
 
|  | |  | | 3.6, a (??), 18:17, 20/01/2016 [^] [^^] [^^^] [ответить] | +/– |  | Делается один раз: dd bs=10m count=1 if=/dev/random of=random.bin
1+0 records in
 1+0 records out
 10485760 bytes transferred in 0.636338 secs (16478287 bytes/sec)
 time xxd -i random.bin > random.c
real	0m1.997s
 user	0m1.935s
 sys	0m0.057s
 time gcc -c random.c
real	0m9.414s
 user	0m8.947s
 sys	0m0.350s
 
 |  |  | 
 | 
 | 
 
 | 1.7, Аноним (-), 23:23, 24/01/2016  [ответить] | +1 +/– |  | А не проще volatile char a[DATASIZE] = {бинарь}? 
 |  |  | 
 
|  | | 2.8, Andrey Mitrofanov (?), 10:05, 25/01/2016 [^] [^^] [^^^] [ответить] | +/– |  | > А не проще volatile char a[DATASIZE] = {бинарь}? Двоичные патчОры ещё не открыли для себя генерацию программ, здесь - хексов в Си. Бинарное программирование оно такое -- сложное и малодоступное. 
 |  |  | 
 | 
 
 
 
 |