Вложение бинарных капель с использованием 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 <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

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

Ответ 1

В программе 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. Я не совсем уверен, почему это так - я предполагаю, что есть некоторая правда в в этой статье в википедии утверждают, что

Общепринятой практикой для компиляторов C было добавление ведущего подчеркивания ко всем внешним идентификаторам внешней области видимости для предотвращения столкновений с вкладами от поддержки языка выполнения.

Но мне кажется, что если символы подчеркивания были добавлены ко всем внешним файлам, то вы не очень сильно разделяете пространство имен. Во всяком случае, это вопрос на другой день, и факт в том, что подчеркивания действительно добавляются.

Ответ 2

Я тестировал его в 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 (без подчеркивания).

Ответ 3

Из ld man page:

- ведущий-Подчеркивание

- не ведущий-Подчеркивание

Для большинства целей по умолчанию символ-префикс является символом подчеркивания и определяется в описании цели. По этой опции можно отключить/включить префикс символа подчеркивания по умолчанию.

так

ld -r -b binary -o binary.o input.txt --leading-underscore

должно быть решением.

Ответ 4

По-видимому, эта функция отсутствует в OSX ld, поэтому вы должны сделать это совершенно по-другому с пользовательским флагом gcc, который они добавили, и вы не можете напрямую ссылаться на данные, но для получения адреса необходимо выполнить некоторую инициализацию среды выполнения.

Таким образом, может быть более переносимым сделать себе исходный файл ассемблера, который включает в себя двоичный файл во время сборки, aa этот ответ.