Как получить доступ к символу компоновщика в c код с MinGW? - PullRequest
0 голосов
/ 23 января 2020

Я использую Mingw g cc и ld для генерации исполняемого файла для windows. Я хотел бы получить доступ к начальному адресу раздела в c коде, но я пробовал много методов, и никто не работает.

Мой файл сценария компоновщика имеет следующее:

  .data BLOCK(__section_alignment__) :
  {
    __data_start__ = . ;
    *(.data)
    *(.data2)
    *(SORT(.data$*))
    KEEP(*(.jcr))
    __data_end__ = . ;
    *(.data_cygwin_nocopy)
  }

В C коде я делаю это:

extern char  __data_start__;
uint32_t  test = &__data_start__;

И получаю эту ошибку: неопределенная ссылка на __data_start__

Может ли кто-нибудь помочь мне с этим? Спасибо

1 Ответ

0 голосов
/ 27 января 2020

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