在链接描述文件中,我定义了PROVIDE(__KERNEL_BEGIN__ = .);
。
可以从以下地址访问地址:
extern uint32_t __KERNEL_BEGIN__[];
但是,以下内容不起作用(提供错误的地址):
extern uint32_t * __KERNEL_BEGIN__;
我看着集会。第一种方法__KERNEL_BEGIN__
提供了确切的地址。第二个__KERNEL_BEGIN__ = [address]
,在地址处查找值。
那么,一定是这样吗?我无法区分。
答案 0 :(得分:8)
您需要获取extern
变量的地址。它并不完全直观,但在the manual中进行了解释。
理论上,extern
可以是任何原始数据类型。由于我不知道的原因,惯例是使用char
:
extern char __KERNEL_BEGIN__;
然后,要获取从链接描述文件导出的地址,请取__KERNEL_BEGIN__
:
printf("Address: %08x\n", &__KERNEL_BEGIN__);
您可以在the manual for ld
中了解相关信息。
答案 1 :(得分:0)
这更多地是参考您在Ryan帖子下的后续问题,但是它也可能有助于回答您的原始问题。
链接脚本中定义的“变量”与C中定义的变量不同;它们比其他符号更重要。访问链接描述文件中定义的这些符号时,您必须使用&运算符。
例如,如果链接脚本中包含以下部分:
.data :
{
_sdata = .;
*(.data*);
_edata = .;
} > ram AT >rom
我们可以像这样指向.data
部分的开头:
uint8_t *data_ptr = &_sdata;
要进一步阅读,请尝试the binutils docs或this excellent primer on linker scripts
欢呼