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

pet*_*lin 4 c gcc ld

在链接器脚本中,我定义了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]在地址处查找值.

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

Rya*_*yan 9

您需要获取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阅读相关内容.


Tyr*_*tyk 6

这更多地参考了 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 文档链接器脚本的优秀入门指南

干杯