Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 如何使用MinGW访问c代码中的链接器符号?_Gcc_Linker_Mingw - Fatal编程技术网

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

Gcc 如何使用MinGW访问c代码中的链接器符号?,gcc,linker,mingw,Gcc,Linker,Mingw,我正在使用mingwgcc和ld为windows生成一个可执行文件。 我想访问c代码中某个部分的起始地址,但我尝试了很多方法,但没有一个有效 我的链接器脚本文件包含以下内容: .data BLOCK(__section_alignment__) : { __data_start__ = . ; *(.data) *(.data2) *(SORT(.data$*)) KEEP(*(.jcr)) __data_end__ = . ; *

我正在使用mingwgcc和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__;
并获取以下错误: 对
\u数据\u开始\u的未定义引用

有人能帮我吗?
感谢mingw32使用了前导下划线,即编译器将在每个符号中添加一个
\uu
(下划线)。您显示的链接器描述文件的部分是默认链接器脚本的一部分(至少在我的安装中是这样),对于您的代码,我得到了提到的错误

int main()
{
    extern char __data_start__;
    return (int) &__data_start__;
}
使用
-save temps
,程序集代码

    movl    $___data_start__, %eax
它有3个前导
,而不仅仅是2个

因此,有两种解决方案:您可以建议编译器将
\uuu data\u start\uu
作为程序集名称发出,这是一个:

或者您可以使用
\u data\u start

int main()
{
    extern char _data_start__;
    return (int) &_data_start__;
}
两者都在程序集/对象文件中使用
\u数据\u开始\u

    movl    $__data_start__, %eax
i686-w64-mingw32-nm模块.o

         U __data_start__

一些ABI需要符号的前导字符u(下划线),例如int foo()将给出符号foo;因此,对于mingw32定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu数据开始
(3个前导)可能会起作用。谢谢你的建议,但不幸的是,这也不起作用。当你链接到
-Wl,-map,x.map
时,你会在地图文件中看到这些符号。奇怪,然后链接器应该能够解析它们。您还可以将
-save temps
添加到
gcc
选项中,并检查其定义相应符号的程序集文件(
*.s
)。这些符号也位于对象文件(
*.o
)中,并通过
nm
显示。在全局优化的情况下,
gcc
将来自module.c的符号设置为本地符号。在这种情况下,您可以使用
\uuuuuuuuu属性((\uuuu外部\u可见\uuuuuuuuuuuuuu))
来声明它。谢谢您的帮助。我使用了第二个选项,它解决了我的错误。
         U __data_start__