& quot; Неопределенная ссылка & quot; ошибка при использовании ассемблера для встраивания данных при использовании компиляции mingw-w64 для окон (COFF вместо ELF)

В другом Stackoverflow Q / A был пост, который показал, как встраивать произвольные данные в сборку и ссылаться на них в C ++.

Это прекрасно работает в Linux, но при компиляции для Windows (используя mingw-w64) сборка должна отличаться, потому что исполняемый файл использует формат COFF вместо ELF.

Моя текущая сборка для встраивания данных выглядит следующим образом (для COFF):

# data.asm
.section .rodata
.global data_bin
.def data_bin; .scl 2; .type 50; .endef
.align  4
data_bin:
.incbin "dataFile"data_bin_end:
.global data_bin_size
.def data_bin_size; .scl 2; .type 15; .endef
.align  8
data_bin_size:
.quad   data_bin_end - data_bin

(Я использую «.scl 2», потому что класс хранения «2», очевидно, является глобальным / внешним, и я использую «.type 50» для данных, так как «50» — это значение для массива символов, и я использую «.type 15» для data_size, так как «15» — это значение для беззнакового long (все это как указано здесь))

Я все еще использую тот же заголовочный файл для ссылки на данные:

// data.hpp
#ifndef DATA_ASM_HPP
#define DATA_ASM_HPP

extern const char data_bin[];
extern const unsigned long long data_bin_size;

#endif

Сборка компилируется нормально, как и остальная часть программы. Проблема возникает при компоновке, когда компоновщик утверждает, что data_bin и data_bin_size не определены, хотя я определил их в коде сборки (неопределенная ссылка на data_bin).

Любые идеи / решения о том, как это исправить? Я дважды проверил, и объектный файл, сгенерированный при компиляции кода сборки, включен в шаг компоновки.

1

Решение

добавлять extern "C" { } вокруг data.hpp (в linux имена переменных не искажены, но в windows они есть)

И, возможно, вам нужно добавить «_» к именам переменных в asm.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector