您的问题含糊不清,因此不可能提供完整/准确的示例。
历史上共有三个主要部分,分别命名为 .text、.data、.bss,尽管任何特定的工具链都可以随意调用它们,甚至不必使用“部分”一词。
.text 是代码(并且取决于指令集一些只读数据和/或基于工具链和程序员的所有只读数据)(代码加池)。
.data 是我想说的初始化的全局变量或局部全局变量
int x=5;
...
int fun ( void )
{
static int y=3;
以及在调用编译代码入口点之前读/写和初始化的任何其他项。
.bss 被归零的全局变量
int z;
int more_fun ( void )
...
MCU 通常意味着有一个非易失性存储器(rom/flash/eeprom/...)和一些 ram 以及处理器和外围设备。
当我们在计算机上运行程序时,操作系统会将我们的程序加载到内存中,并且可以选择让加载程序将这些项目提取到正确的位置,或者可以构建二进制文件以便操作系统加载程序简单地复制图像到 ram 并运行它。
在 MCU 或其他类似的裸机系统上,代码本身必须初始化 ram。如果程序员希望使用这些类型的全局信息,那么在他们期望该信息可用之前,需要放置它。非易失性存储器是...非易失性的...因此需要存储.data 和有关.bss 的信息。不需要将所有的 .bss 零存储在闪存上,您只需要存储起始地址和字节数。
程序员通过链接和引导程序(一对紧密结合)(在这种情况下,引导程序是在编译代码运行之前发生的基于汇编的代码,它准备系统运行编译代码)将 .data 和 .bss 信息放入在某处闪现。引导程序中的一些代码获取闪存偏移量、内存偏移量和 .data 的字节数并复制这些字节。同样,引导程序采用 ram 中的地址和 .bss 的字节数并将该数据归零。
调试不是二进制文件的要求,它是可选的。通常它不会放在闪存上,它是某些文件格式的二进制文件(例如.elf),但闪存上的字节通常是可加载的部分。调试器将读取匹配的 elf 文件和/或下载/刷新并运行/重置以知道它匹配,然后使用文件中的字符串和其他信息使单步执行代码等更加用户友好。
当然,二进制文件可能有一个 rom 监视器或其他属于调试类别的东西。错误调试不是典型/必需的。
根据工具链,您可能有一个不属于 .text 的只读 .rodata(gnu 在较新版本上执行此操作)。同样,.text、.data、.bss 等名称更多地是一种习惯,而不是硬性要求。不使用这些名称会给有经验的用户造成混淆,并且可能会对您的产品产生负面看法,因此我怀疑大多数人只是使用这些名称。
这个 ROM Copy table,听起来像是二进制文件的生成方式,在继续执行之前需要将信息从 rom 复制到 ram。