十六进制中的精灵表示
Elf representation in HEX
我正在努力理解嵌入式系统中的一些基本概念。我的问题类似于 understand hexedit of an elf 。
为了将编译器输出刻录到 ROM,.out 文件被转换为 HEX(比如 intel-hex)。我想知道以下信息是如何以 HEX 格式保存的:
- 节header
- 符号表、调试符号、链接器符号等
- 精灵header.
- 如果这些保存在 HEX 文件中,如何从 hex 文件中读取它们?
- 有点问题,但是启动时的微控制器如何知道 .data .bss 等在 HEX 中的位置并复制到 RAM?
其中 None 被保留。 HEX 文件仅包含原始程序和数据。 https://en.wikipedia.org/wiki/Intel_HEX
微控制器不知道 .data 和 .bss 的位置——它甚至不知道它们的存在。在调用 main()
之前执行的启动代码包含这些部分的起始地址 - 地址被硬编码到程序中。此启动代码将像其他所有内容一样位于 HEX 文件中。
第 1 点到第 3 点中的元素未包含在原始二进制文件中,因为它们在应用程序中没有任何用处;相反,它们由开发主机上的链接器和调试器使用,并且对于程序执行来说是不必要的,您只需要字节值和将它们写入的地址,这或多或少是十六进制文件包含的所有内容(也可能包含起始地址记录)。
具有动态链接或自托管调试功能的系统(例如 VxWorks)使用目标文件文件。
关于第5点,微控制器不需要知道;链接器在解析目标代码中的绝对地址和相对地址时使用该信息。一旦 filly 解析(链接),地址将直接嵌入代码中。同样,在使用动态 loading/linking 的情况下,目标文件元数据是必需的,此类系统通常不会加载原始十六进制文件或二进制文件。
我正在努力理解嵌入式系统中的一些基本概念。我的问题类似于 understand hexedit of an elf 。 为了将编译器输出刻录到 ROM,.out 文件被转换为 HEX(比如 intel-hex)。我想知道以下信息是如何以 HEX 格式保存的:
- 节header
- 符号表、调试符号、链接器符号等
- 精灵header.
- 如果这些保存在 HEX 文件中,如何从 hex 文件中读取它们?
- 有点问题,但是启动时的微控制器如何知道 .data .bss 等在 HEX 中的位置并复制到 RAM?
None 被保留。 HEX 文件仅包含原始程序和数据。 https://en.wikipedia.org/wiki/Intel_HEX
微控制器不知道 .data 和 .bss 的位置——它甚至不知道它们的存在。在调用 main()
之前执行的启动代码包含这些部分的起始地址 - 地址被硬编码到程序中。此启动代码将像其他所有内容一样位于 HEX 文件中。
第 1 点到第 3 点中的元素未包含在原始二进制文件中,因为它们在应用程序中没有任何用处;相反,它们由开发主机上的链接器和调试器使用,并且对于程序执行来说是不必要的,您只需要字节值和将它们写入的地址,这或多或少是十六进制文件包含的所有内容(也可能包含起始地址记录)。
具有动态链接或自托管调试功能的系统(例如 VxWorks)使用目标文件文件。
关于第5点,微控制器不需要知道;链接器在解析目标代码中的绝对地址和相对地址时使用该信息。一旦 filly 解析(链接),地址将直接嵌入代码中。同样,在使用动态 loading/linking 的情况下,目标文件元数据是必需的,此类系统通常不会加载原始十六进制文件或二进制文件。