Вложение бинарных капель с использованием gcc mingw
Я пытаюсь вставить двоичные капли в exe-файл. Я использую mingw gcc.
Я делаю объектный файл следующим образом:
ld -r -b binary -o binary.o input.txt
Затем я смотрю вывод objdump, чтобы получить символы:
- MinGW / CxxTest причудливые ошибки
- Включить собственные символические ссылки NTFS для Cygwin
- Как установить MinGW-w64 и MSYS2?
- CreateProcess: нет такого файла или каталога
- В объектном файле слишком много разделов
objdump -x binary.o
И он дает символы, названные:
_binary_input_txt_start _binary_input_txt_end _binary_input_txt_size
Затем я пытаюсь получить доступ к ним в моей программе на C:
#include #include 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
Кто-нибудь знает, что я делаю неправильно?
- 32-разрядная dll для интерфейса Java для 64-разрядной системы
- std :: thread не является членом пространства имен std, используя Eclipse Kepler MinGW
- to_string не является членом std, говорит g ++ (mingw)
- Как уменьшить размер исполняемого файла, созданного компилятором MinGW g ++?
- Получение Clang для работы над windowsми
- Статическое и динамическое / совместное соединение с MinGW
- что такое «выравнивание стека»?
- Из статической библиотеки MinGW (.a) в статическую библиотеку Visual Studio (.lib)
В вашей программе C удалите главное подчеркивание:
#include #include extern char binary_input_txt_start[]; int main (int argc, char *argv[]) { char *p; p = binary_input_txt_start; return 0; }
Компиляторы C часто (всегда?), Кажется, добавляют символ подчеркивания к именам extern
. Я не совсем уверен, почему это так. Я предполагаю, что есть некоторые истины в этой статье статьи википедии, что
Общепринятой практикой для компиляторов C было добавление ведущего подчеркивания ко всем внешним идентификаторам области видимости для предотвращения столкновений с вкладами от поддержки языка выполнения
Но мне кажется, что если подчеркивания были добавлены ко всем внешним текстам, то вы не очень сильно разбиваете пространство имен. Во всяком случае, это вопрос на другой день, и дело в том, что подчеркивания действительно добавляются.
Я тестировал его в Linux (Ubuntu 10.10).
-
Файл Resouce:
input.txt -
gcc (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 man :
–leading-подчеркивание
–no-ведущий-Подчеркивание
Для большинства целей по умолчанию символ-префикс является символом подчеркивания и определяется в описании цели. По этой опции можно отключить / включить префикс символа подчеркивания по умолчанию.
так
ld -r -b binary -o binary.o input.txt --leading-underscore
должно быть решением.
По-видимому, эта функция отсутствует в ld OSX, поэтому вам нужно сделать это совершенно по-другому с пользовательским флагом gcc, который они добавили, и вы не можете напрямую ссылаться на данные, но должны выполнить некоторую инициализацию среды выполнения, чтобы получить адрес.
Таким образом, может быть более портативным сделать себе исходный файл ассемблера, который включает двоичный файл во время сборки, a la this answer .