【发布时间】:2019-10-04 19:00:00
【问题描述】:
在使用 C 代码进行嵌入式开发方面,我了解当程序被编译和链接时,会生成一个在目标上执行的二进制或 ELF 文件。 ELF 文件将包含(以及许多其他内容)全局变量的地址或地址偏移量。
现在,当 C 启动代码首先执行时,如果要在整个程序中修改这些数据,它可以将非常量数据/变量从闪存复制到 RAM。
这会改变系统上变量的内存地址吗?这是否会更新 ELF 文件以更改此数据的地址?
【问题讨论】:
-
embedded ... ELF- 请定义嵌入式。是否嵌入了树莓派? atmega 是嵌入式的吗?您是在询问裸机目标吗?因为它们不“执行 ELF 文件”,所以它们执行机器代码。if it is to be modified- 我不明白,为什么要修改 C 启动代码?ELF file will contain .. the addresses or address offsets of global variables- 这是一种奇怪的说法。 ELF 文件最重要的是包含标题和机器代码。它不包含“偏移量”,不包含变量,它包含部分。你这是什么意思? -
@KamilCuk 二进制文件,ELF(例如,如果在 Linux 上使用 Rasberry Pi 等),或者如果用于纯裸机目标,则为普通二进制文件。这些文件包含不同的部分:.text .data。 .bss 等。现在,.data 部分将包含初始化的全局变量,对吧?当 .text 区域中的代码访问这些全局变量时,它会这样做,因为它知道它们的地址。 C 启动代码最初可以将变量从 Flash 复制到 RAM 的事实,我假设这些变量的地址会因此改变?在这种情况下,二进制文件是否会使用新地址进行更新?
-
地址将如何变化?例如,如果您为 stm32 进行编译,您就会知道 ram 从地址 0x8000000 开始。所以第一个全局变量位于地址 0x8000... 哦,也许是这样。 C 启动代码不会复制“变量”。机器代码中没有“变量”。 C 启动代码将 .data 部分中的所有数据复制到 ram 中,逐字节复制字节。 “变量”一直在 ram 中,只是 crt0 将它们初始化为起始值。变量的初始“值”在 .data 中,而不是“变量”本身。 “变量”一直在内存中(或在寄存器中)。
-
@KamilCuk 只读数据可能会保留在闪存中吗?
-
好的,所以在二进制文件中,.bss 和 .data 部分中的数据包含变量,它们在复制后将位于 RAM 中的地址?
标签: c linker embedded startup elf