正如 Adam Rosenfeld 指出的那样,您需要使用链接器控制文件来为您定义位于精确正确位置的一个或多个符号。
对于 gcc 和 binutils,您将使用 ld 的链接器脚本语法。请参阅 ld 的手册,了解我在这里省略的所有细节。它有点不透明,但如果您打算在嵌入式世界中花费大量精力,则应该花一些时间在它上面。它会给你带来回报。
在链接描述文件中,您需要在 .text 段之前和之后定义一个符号。
亚当提到PROVIDE()
语法,它将起作用。但如果您可以保证您的名称是唯一的,您可能不需要将定义包装在 PROVIDE 中。请注意,这是您必须能够做出的保证,否则您以后可能会面临很多混乱的风险。
在我的脚本中,我只使用类似的东西:
__SDRAM_CS1 = 0x10000000;
使用常量地址定义符号,该地址(在本例中)引用我们决定 SDRAM 控制器将映射 SDRAM 内存的位置,在 C 中我将其声明如下:
extern unsigned char __SDRAM_CS1[];
这样它就可以用在需要知道 SDRAM 实际位置的代码中。
对于位于 .text 段末尾的符号,链接器脚本中将包含类似以下内容的内容
SECTIONS
{
...
.text {
_start_text = .;
*(.text);
...
_end_text = .;
}
...
}
并将开始和结束符号声明为
extern unsigned char _start_text[];
extern unsigned char _end_text[];
在C中。那么,起始地址就是_start_text
,文本段的长度(以字节为单位)是_end_text - _start_text
.
请注意,我遗漏了很多细节。您可能有一些名为 .text 以外的名称的节,必须将其视为位于文本段中。一个主要的例子是只读数据,通常可以安全地定位在文本段中,因为已知它是const
在嵌入式系统中,如果不需要,您宁愿不将其复制到宝贵的 RAM。此外,数据段的初始值设定项以及内部生成的全局对象构造函数列表都位于文本段附近。
是否在图像尺寸中包含这些内容是您在了解它们的用途后需要做出的设计决策。