Разница между использованием objcopy и xxding файла в источник переменного тока
Скажем, я хочу встроить файл с именем data
в моем C исполняемый файл.
Результатом, который приходит от Google, является эта linuxjournal страница с надписью use objdump
как это
objcopy --input binary \
--output elf32-i386 \
--binary-architecture i386 data data.o
Однако это зависит от архитектуры компьютера, например, при компиляции объекта из предыдущей команды, которую он дает. i386 architecture of input file 'data.o' is incompatible with i386:x86-64 output
и я должен изменить аргументы.
Однако с помощью инструмента unix xxd я могу просто создать исходный код переменного тока с данными в массиве без знака и целое число с его длиной и получить тот же результат с помощью команд компиляции, не зависящих от устройства.
data.o: data.c
gcc -c data.c
data.c: data
xxd -i data > data.c
Какой метод предпочтительнее и почему?
1 ответ
xxd
не является стандартным инструментом UNIX. На самом деле он является частью VIM и используется для реализации его шестнадцатеричной функции редактора. VIM является дополнительным инструментом и не всегда доступен.
GNU objcopy
с другой стороны, является частью GNU binutils и, как правило, предустановлен во всех системах GNU.
В общем, когда нужно включить двоичный файл в программу, что-то простое (как вы делаете с xxd
) является предпочтительным по сравнению с objcopy
, Главным образом, по той простой причине, что objcopy
сильно недооценен и оставляет впечатление неполированного интерфейса BFD
, лежащая в основе библиотека binutils. Другая причина в том, что наряду с .c
файл, вы также можете создать .h
файл, и сделать сгенерированные файлы неотъемлемой частью вашего проекта.
Статья, на которую вы ссылаетесь, уже содержит ряд примеров, как этого добиться. Вероятно, самым популярным инструментом для этой цели является hexdump
предустановлен буквально на всех системах. Например, от макушки головы:
# .c
echo 'char data[] = {' > data.c
hexdump -v -e '1/1 "0x%02X,"' < data.bin >> data.c
echo >> data.c
echo '};' >> data.c
echo 'size_t data_size = sizeof(data);'
# .h
echo 'extern char data[];' > data.h
echo 'extern size_t data_size;' >> data.h