如何使用 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__
我正在使用 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__