【发布时间】:2020-01-23 19:54:59
【问题描述】:
我正在使用 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__的引用
谁能帮我解决这个问题? 谢谢
【问题讨论】:
-
一些 ABI 要求符号前导 _(下划线),例如int foo() 将给出符号 _foo;因此,对于 mingw32,定义
___data_start(3 个前导 _'s)可能会奏效。 -
感谢您的建议,但不幸的是这也不起作用。
-
当您与
-Wl,-Map,x.map链接时,您会在地图文件中看到这些符号,即在x.map中? -
是的,我可以看到地图文件中的符号。
-
奇怪,那么链接器应该能够解决它们。您还可以将
-save-temps添加到gcc选项并检查它定义了相应符号的程序集文件 (*.s)。这些符号也在目标文件 (*.o) 中,并由nm显示。在某些全局优化的情况下,gcc将 module.c 中的符号设为本地。在这种情况下,您可以使用__attribute__((__externally_visible__))声明它。