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

How to access variable define in linker script in c?

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

地址可以访问:

extern uint32_t __KERNEL_BEGIN__[];

但是,以下内容不起作用(给出了错误的地址):

extern uint32_t * __KERNEL_BEGIN__;

我看了一下程序集。第一种方法 __KERNEL_BEGIN__ 提供了准确的地址。第二个,__KERNEL_BEGIN__ = [address],在地址中查找一个值。

那么,一定要这样吗?我无法分辨。

你需要取extern变量的地址。它并不完全直观,但在 the manual.

中有解释

理论上,extern可以是任何原始数据类型。由于我不知道的原因,惯例是使用 char:

extern char __KERNEL_BEGIN__;

然后要获取链接描述文件导出的地址,取__KERNEL_BEGIN__的地址:

printf("Address: %08x\n", &__KERNEL_BEGIN__);

您可以在 the manual for ld 中阅读相关内容。

这更多地参考了你在 Ryan post 下方的 follow-up 问题,但它也可能有助于回答你原来的问题。

链接器脚本中定义的“变量”与 C 中定义的变量不同;它们比什么都多符号。当访问链接描述文件中定义的这些符号时,您必须使用&运算符。

例如,如果我们的链接描述文件中有以下部分:

.data :
{
    _sdata = .;
    *(.data*);
    _edata = .;
} > ram AT >rom

我们可以获得指向 .data 部分开头的指针,如下所示:

uint8_t *data_ptr = &_sdata;

如需进一步阅读,请尝试 the binutils docs, or this excellent primer on linker scripts

干杯