ZHCU875Z August 2001 – October 2023 SM320F28335-EP
假设有一个嵌入式器件,程序的加载映像烧录到 EPROM/ROM。程序中的可变数据必须是可写入的,因此必须位于可写存储器中,通常是 RAM。但是,RAM 具有易失性,这意味着断电时其中的内容会丢失。如果此数据必须有初始值,该初始值必须存储在加载映像中的其他位置,否则在断电并重新上电时该值会丢失。在使用之前,初始值必须从非易失性 ROM 复制到它在 RAM 中的运行时位置。有关完成此操作的方法,请参阅节 8.8。
加载地址 是对象在加载映像中的位置。
运行地址 是对象在程序执行期间所处的位置。
对象是一块存储器。它代表一个段、区段、函数或数据。
对象的加载地址和运行地址可能相同。对于程序代码和只读数据(例如 .econst 段),这两个地址通常是相同的。在这种情况下,程序会直接从加载地址读取数据。没有初始值的段(例如 .ebss 段)没有加载数据,因此被视为具有相同的加载地址和运行地址。如果为未初始化的段指定不同的加载地址和运行地址,链接器会发出警告并忽略加载地址。
对象的加载地址和运行地址可能不同。对于可写入数据(例如 .data 段),通常是这种情况。将 .data 段的起始内容放入 ROM 并复制到 RAM。通常在程序启动时执行此操作,但根据对象的需求,该操作可能会延迟执行,如节 3.5所述。
汇编代码和目标文件中的符号通常是指运行地址。查看程序中的地址时,通常查看的是运行地址。加载地址很少用于初始化以外的任何其他事务。
段的加载地址和运行地址由链接器命令文件控制并记录在目标文件元数据中。
加载地址决定了加载程序将段的原始数据放在何处。对该段的任何引用(例如对其中所含标签的引用)都会引用其运行地址。应用程序在运行期间遇到符号的第一次引用时,必须将段从其加载地址复制到其运行地址;即使指定了单独的运行地址,此操作也不会 自动执行。有关指定加载地址和运行地址的示例,请参阅节 8.5.6.1。
有关说明如何在运行时移动代码块的示例,请参阅在运行时将一个函数从慢速存储器移动到快速存储器。若要创建使您可以引用加载时地址而不是运行时地址的符号,请参阅 .label 指令。若要在启动时使用复制表将对象从加载空间复制到运行空间,请参阅节 8.8。
ELF 格式可执行目标文件包含区段。有关段和区段的信息,请参阅节 2.3。COFF 格式可执行目标文件包含段。