如何在 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
干杯
在链接描述文件中,我定义了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
干杯