在链接器脚本中,我定义了PROVIDE(__KERNEL_BEGIN__ = .);.
地址可以从以下地址访问:
extern uint32_t __KERNEL_BEGIN__[];
Run Code Online (Sandbox Code Playgroud)
但是,以下不起作用(给出错误的地址):
extern uint32_t * __KERNEL_BEGIN__;
Run Code Online (Sandbox Code Playgroud)
我看着集会.第一种方法__KERNEL_BEGIN__提供了确切的地址.第二个,__KERNEL_BEGIN__ = [address]在地址处查找值.
那么,一定是这样吗?我无法区分.
您需要获取extern变量的地址.它不完全直观,但在手册中有解释.
理论上,extern可以是任何原始数据类型.由于我不知道的原因,惯例是使用char:
extern char __KERNEL_BEGIN__;
Run Code Online (Sandbox Code Playgroud)
然后,要获取从链接描述文件导出的地址,请使用以下地址__KERNEL_BEGIN__:
printf("Address: %08x\n", &__KERNEL_BEGIN__);
Run Code Online (Sandbox Code Playgroud)
您可以在手册中ld阅读相关内容.
这更多地参考了 Ryan 帖子下的后续问题,但它也可能有助于回答您原来的问题。
链接描述文件中定义的“变量”与 C 中定义的“变量”的处理方式不同;它们比任何东西都更具有象征意义。访问链接描述文件中定义的这些符号时,必须使用 & 运算符。
例如,如果我们的链接器脚本中有以下部分:
.data :
{
_sdata = .;
*(.data*);
_edata = .;
} > ram AT >rom
Run Code Online (Sandbox Code Playgroud)
我们可以得到一个指向该.data部分开头的指针,如下所示:
uint8_t *data_ptr = &_sdata;
Run Code Online (Sandbox Code Playgroud)
如需进一步阅读,请尝试binutils 文档或链接器脚本的优秀入门指南
干杯