如何使用 MinGW 访问 C 代码中的链接器符号?

how to access linker symbol in c code with MinGW?

我正在使用 Mingw gcc 和 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__

的未定义引用

谁能帮我解决这个问题? 谢谢

mingw32 使用前导下划线,即编译器将为每个符号添加一个 _(下划线)。您显示的链接器描述文件的一部分是默认链接器脚本的一部分(至少在我的安装中),并且对于您的代码,我收到

提到的错误
int main()
{
    extern char __data_start__;
    return (int) &__data_start__;
}

-save-temps,汇编代码有

    movl    $___data_start__, %eax

其中 3 前导 _ 不只是 2.

因此,有 2 个解决方案:您可以建议编译器发出 __data_start__ 作为程序集名称,这是一个 GCC extension:

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__