Можно ли сделать жесткое кодирование с помощью команды objcopy - PullRequest
0 голосов
/ 19 февраля 2020

Я работаю над Linux, и я только что услышал, что была команда objcopy, я нашел соответствующую команду на моем x86_64 P C: x86_64-linux-gnu-objcopy.

С его помощью я могу преобразовать файл в файл obj: x86_64-linux-gnu-objcopy -I binary -O elf64-x86-64 custom.config custom.config.o

Файл custom.config - это читаемый человеком файл. Он содержит две строки:

name titi
password 123

Теперь я могу выполнить objdump -x -s custom.config.o, чтобы проверить его информацию.

custom.config.o:     file format elf64-little
custom.config.o
architecture: UNKNOWN!, flags 0x00000010:
HAS_SYMS
start address 0x0000000000000000

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .data         00000017  0000000000000000  0000000000000000  00000040  2**0
                  CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
0000000000000000 l    d  .data  0000000000000000 .data
0000000000000000 g       .data  0000000000000000 _binary_custom_config_start
0000000000000017 g       .data  0000000000000000 _binary_custom_config_end
0000000000000017 g       *ABS*  0000000000000000 _binary_custom_config_size


Contents of section .data:
 0000 6e616d65 20746974 690a7061 7373776f  name titi.passwo
 0010 72642031 32330a                      rd 123.

Как мы знаем, мы можем открыть, прочитать или записать файл, такой как custom.config в любом проекте C / C ++. Теперь я думаю, можно ли использовать этот файл obj custom.config.o немедленно в проекте C / C ++. Например, можно ли сразу прочитать содержимое файла custom.config.o без вызова функций ввода-вывода, таких как open, read или write. Если возможно, я думаю, что это может стать неким стилем жесткого кодирования и избежать вызова функций ввода / вывода?

1 Ответ

1 голос
/ 19 февраля 2020

Даже если я попробовал это на 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

...