Gcc 如何使用MinGW访问c代码中的链接器符号?
我正在使用mingwgcc和ld为windows生成一个可执行文件。 我想访问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__ = . ; *
.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__