Встраивание двоичных двоичных объектов с использованием gcc mingw - PullRequest
44 голосов
/ 13 апреля 2010

Я пытаюсь встроить двоичные объекты в исполняемый файл. Я использую 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 ]

31 голосов
/ 13 апреля 2010

В вашей программе на 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 было добавление лидирующего подчеркивания квсе идентификаторы программ внешней области видимости для предотвращения столкновений с вкладами из языковой поддержки времени выполнения

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

4 голосов
/ 05 апреля 2015

Из Справочная страница ld :

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

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

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

так

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

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

4 голосов
/ 13 октября 2012

Я тестировал его в Linux (Ubuntu 10.10).

  1. Файл ресурсов:
    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 (без подчеркивания).

0 голосов
/ 26 мая 2015

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

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

...