mingw32 использует начальные подчеркивания, то есть компилятор добавляет _
(подчеркивание) к каждому символу. Часть файла описания компоновщика, который вы показываете, является частью скрипта компоновщика по умолчанию (по крайней мере, в моей установке), и для вашего кода я получаю упомянутую ошибку для
int main()
{
extern char __data_start__;
return (int) &__data_start__;
}
с -save-temps
, код ассемблера имеет
movl $___data_start__, %eax
, который имеет 3 , ведущий _
, а не только 2.
Таким образом, есть 2 решения: Вы можете посоветовать компилятору выдать __data_start__
в качестве имени сборки, которое является G CC расширением :
int main()
{
extern char some_identifier __asm("__data_start__");
return (int) &some_identifier;
}
Или вы можете использовать _data_start
:
int main()
{
extern char _data_start__;
return (int) &_data_start__;
}
Оба используют __data_start__
в сборке / объектном файле:
movl $__data_start__, %eax
i686-w64-mingw32-nm module.o
U __data_start__