Даже если я попробовал это на Win10 с MinGW (проект MinGW-W64, G CC 8.1.0), это должно работать для вас только с небольшими изменениями.
Как вы видите из информации objdump
дал вам, содержимое файла помещено в раздел .data
, который является общим разделом для непостоянных переменных.
И для него были определены некоторые символы. Вы можете объявить эти символы в своем C источнике.
Абсолютное значение _binary_custom_config_size
является специальным, поскольку оно помечено *ABS*
. В настоящее время я не знаю другого способа получить ее значение, кроме как объявить переменную любого типа и получить ее адрес.
Это мой show_config.c
:
#include <stdio.h>
#include <string.h>
extern const char _binary_custom_config_start[];
extern const char _binary_custom_config_size;
int main(void) {
size_t size = (size_t)&_binary_custom_config_size;
char config[size + 1];
strncpy(config, _binary_custom_config_start, size);
config[size] = '\0';
printf("config = \"%s\"\n", config);
return 0;
}
Поскольку "двоичный" Файл (фактически текст) не имеет окончательного символа '\0'
, вам нужно добавить его, чтобы получить правильно завершенную строку C.
Вы также можете объявить _binary_custom_config_end
и использовать его для вычисления размера или как предел.
Сборка все идет так (я использовал опцию -g
для отладки):
$ objcopy -I binary -O elf64-x86-64 -B i386 custom.config custom.config.o
$ gcc -Wall -Wextra -pedantic -g show_config.c custom.config.o -o show_config
И вывод показывает успех:
$ show_config.exe
config = "name titi
password 123"
Если вам нужно содержимое файла в другом разделе, вы добавите опцию переименования раздела в вызов objcopy
. Добавьте любой нужный вам флаг, в примере показано .rodata
, которое используется для данных только для чтения:
--rename-section .data=.rodata,alloc,load,readonly,data,contents