十六进制中的精灵表示

Posted

技术标签:

【中文标题】十六进制中的精灵表示【英文标题】:Elf representation in HEX 【发布时间】:2017-09-06 05:06:43 【问题描述】:

我正在努力理解嵌入式系统中的一些基本概念。我的问题类似于 understand hexedit of an elf 。 为了将编译器输出刻录到 ROM,.out 文件被转换为 HEX(比如 intel-hex)。我想知道以下信息如何以 HEX 格式保存:

    章节标题 符号表、调试符号、链接器符号等 精灵头。 如果这些保存在 HEX 文件中,如何从 hex 文件中读取它们? 有点问题,但是启动时的微控制器如何知道 .data .bss 等在 HEX 中的位置并复制到 RAM 中?

【问题讨论】:

你混淆了两种截然不同的东西。 “ELF 的十六进制编辑”只是将 ELF 文件的二进制内容呈现为十六进制字节以供人类查看。但英特尔 Hex 文件通常代表可编程存储器中的内容。 【参考方案1】:

这些都没有保留。 HEX 文件仅包含原始程序和数据。 https://en.wikipedia.org/wiki/Intel_HEX

微控制器不知道 .data 和 .bss 的位置 - 它甚至不知道它们的存在。在调用main() 之前执行的启动代码包含这些部分的起始地址——地址被硬编码到程序中。此启动代码将像其他所有内容一样位于 HEX 文件中。

【讨论】:

您是指隐藏链接的启动代码还是项目中包含的启动代码(例如keil)?在可见的启动代码中没有这样的 memcpy 指令等?也非常感谢任何相关的参考链接。亲切的问候 @Aimal 我不知道“隐藏”与“可见”启动代码是什么意思。此代码是高度系统特定的,但通常由编译器作为开源提供,用 asm 或 C 编写。如果您使用调试器单步执行您的程序,从上电复位开始,您将请参阅此代码。 可见代码是指这个。 github.com/hexanaft/stm32f4-discovery-keil-freertos-blink/blob/… 现在这里没有 memcpy 等指令了。 @Aimal :请注意,我指出了您的问题中的一些缺陷 - 特别是关于工具链的缺乏明确性。如果您要编辑问题以添加缺失的信息,那么回答起来会容易得多。例如对于 ARMCC(Keil ARM-MDK 的默认编译器,除非您使用 v6),详细信息位于 infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0241b/…【参考方案2】:

第 1 点到第 3 点中的元素不包含在原始二进制文件中,因为它们在应用程序中没有任何用途;相反,它们由开发主机上的链接器和调试器使用,并且对于程序执行来说是不必要的,您只需要字节值和将它们写入的地址,这或多或少是所有十六进制文件包含的(也可能包含起始地址记录)。

具有动态链接或自托管调试功能的系统(例如 VxWorks)使用目标文件文件。

关于第5点,微控制器不需要知道;链接器在解析目标代码中的绝对地址和相对地址时使用该信息。一旦完全解析(链接),地址就会直接嵌入到代码中。同样,在使用动态加载/链接的情况下,需要目标文件元数据,并且此类系统通常不会加载原始 hex 文件或二进制文件。

【讨论】:

以上是关于十六进制中的精灵表示的主要内容,如果未能解决你的问题,请参考以下文章

eclipse的内存视图中的十六进制表示错误

Python二进制八进制十六进制数字的表示和转换

HBase shell 中的十六进制数值表示

Swift iOS Sprite Kit - 将精灵从一种颜色淡化为另一种颜色[关闭]

iOS 中的特殊字面量表示方法

二进制中的符号位的区分以及表示