Встраивание двоичных двоичных объектов с использованием gcc mingw
Я пытаюсь встроить двоичные двоичные объекты в исполняемый файл. Я использую MINGW GCC.
Я делаю объектный файл так:
ld -r -b binary -o binary.o input.txt
Затем я смотрю вывод objdump, чтобы получить символы:
objdump -x binary.o
И это дает символы с именем:
_binary_input_txt_start
_binary_input_txt_end
_binary_input_txt_size
Затем я пытаюсь получить доступ к ним в моей программе на C:
#include <stdlib.h>
#include <stdio.h>
extern char _binary_input_txt_start[];
int main (int argc, char *argv[])
{
char *p;
p = _binary_input_txt_start;
return 0;
}
Затем я собираю так:
gcc -o test.exe test.c binary.o
Но я всегда получаю
undefined reference to _binary_input_txt_start
Кто-нибудь знает, что я делаю не так?
4 ответа
В вашей C-программе удалите нижнее подчеркивание:
#include <stdlib.h>
#include <stdio.h>
extern char binary_input_txt_start[];
int main (int argc, char *argv[])
{
char *p;
p = binary_input_txt_start;
return 0;
}
Компиляторы C часто (всегда?), Кажется, ставят подчеркивание extern
имена. Я не совсем уверен, почему это так - я предполагаю, что есть некоторая правда в утверждении этой статьи Википедии о том, что
Для компиляторов Си было обычной практикой ставить перед всеми внешними идентификаторами программ области видимости подчеркивание, чтобы предотвратить конфликты с вкладами из языковой поддержки во время выполнения.
Но меня поражает, что если подчеркивания были добавлены ко всем внешним элементам, то вы не слишком сильно разделяете пространство имен. Во всяком случае, это вопрос для другого дня, и дело в том, что подчеркивания добавляются.
Со страницы man ld:
--leading-подчеркивание
--no-ведущий-Подчеркивание
Для большинства целей символьный префикс по умолчанию является подчеркиванием и определяется в описании цели. С помощью этой опции можно отключить / включить префикс префикса по умолчанию.
так
ld -r -b binary -o binary.o input.txt --leading-underscore
должно быть решение.
Я проверял это в Linux (Ubuntu 10.10).
Resouce file:
input.txtgcc (Ubuntu / Linaro 4.4.4-14ubuntu5) 4.4.5 [генерирует исполняемый файл ELF для Linux]
Генерирует символ_binary__input_txt_start
,
Принимает символ_binary__input_txt_start
(с подчеркиванием).i586-mingw32msvc-gcc (GCC) 4.2.1-sjlj (mingw32-2) [создает исполняемый файл PE для Windows]
Генерирует символ_binary__input_txt_start
,
Принимает символbinary__input_txt_start
(без подчеркивания).
Очевидно, что эта функция отсутствует в ld OSX, поэтому вы должны сделать это совершенно по-другому с добавленным ими настраиваемым флагом gcc, и вы не можете напрямую ссылаться на данные, но должны выполнить некоторую инициализацию во время выполнения, чтобы получить адрес.
Так что может быть более портативным сделать исходный файл на ассемблере, который включает в себя двоичный файл во время сборки, как этот ответ.