Вложение бинарных капель с использованием gcc mingw

Я пытаюсь вставить двоичные капли в exe-файл. Я использую 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  #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 

Кто-нибудь знает, что я делаю неправильно?

В вашей программе 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).

  1. Файл Resouce:
    input.txt

  2. gcc (Ubuntu / Linaro 4.4.4-14ubuntu5) 4.4.5 [генерирует исполняемый файл ELF для Linux]
    Генерирует символ _binary__input_txt_start .
    Принимает символ _binary__input_txt_start (с подчеркиванием).

  3. 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 .

  • точка входа процедуры __gxx_personality_v0 не может быть расположена
  • C ++: Поймать деление на нулевую ошибку
  • Как создать протобуф Google в Windows с помощью MinGW?
  • Правильно печатать символы utf8 в консоли Windows
  • stoi и std :: to_string on mingw 4.7.1
  • Как перенаправить qDebug, qWarning, qCritical etc output?
  • Ошибка компоновщика MinGW: winsock
  • Eclipse CDT с использованием MinGW не выводится в консоли
  • wWinmain, Unicode и Mingw
  • Проблемы с std :: stoi, не работающие на MinGW GCC 4.7.2
  • Добавление ведущих символов подчеркивания к символам сборки с помощью GCC на Win32?
  • Interesting Posts

    Динамическое изменение уровня журнала log4j

    Как передать текущий элемент методу Java, нажав гиперссылку или кнопку на странице JSP?

    Как я могу получить список всех реализаций интерфейса программно в Java?

    .NET Console TextWriter, который понимает Отступ / Неподвижный / IndentLevel

    Поврежденные файлы NTFS (нет такого файла или каталога); Могу ли я исправить их под Linux?

    Реверсивный алгоритм тасования с использованием ключа

    jQueryUI droppable, прекращение распространения для перекрытого родного брата

    Потоковое аудио с URL-адреса в Android с помощью MediaPlayer?

    Android Studio: «Выполнение не выполнено для задачи»: app: mergeDebugResources «если проект создан на диске C:

    Как разместить html-div над плагином Google Планета Земля? Вовлекает wmode, я думаю

    Что такое префикс L в C ++?

    Передача массивов с помощью Intent.putExtra

    Почему и не берут размер шрифта и размер шрифта из тела?

    Преобразование общего списка в строку CSV

    Вызывается деструктор, когда объект выходит из области видимости?

    Давайте будем гением компьютера.