如何在c中的链接描述文件中访问变量?

时间:2016-10-12 12:20:51

标签: c gcc ld

在链接描述文件中,我定义了PROVIDE(__KERNEL_BEGIN__ = .);

可以从以下地址访问地址:

extern uint32_t __KERNEL_BEGIN__[];

但是,以下内容不起作用(提供错误的地址):

extern uint32_t * __KERNEL_BEGIN__;

我看着集会。第一种方法__KERNEL_BEGIN__提供了确切的地址。第二个__KERNEL_BEGIN__ = [address],在地址处查找值。

那么,一定是这样吗?我无法区分。

2 个答案:

答案 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 docsthis excellent primer on linker scripts

欢呼