【问题标题】:Absolute address of function in object file目标文件中函数的绝对地址
【发布时间】:2025-12-19 17:30:12
【问题描述】:

我有 ARM Cortex-M 目标文件 (.o),其中包含以下代码:BL $testFunc。在同一个目标文件中,我还可以找到testFunc 的实现。我能得到程序执行期间调用的绝对地址吗?我只有目标文件

【问题讨论】:

  • 目标文件不包含绝对地址。绝对地址仅在链接后可用。
  • 实际上,@Tarik,这并不完全正确。实际上,绝对地址只能在执行时知道,因为它取决于操作系统将其加载到内存的位置。
  • @SGeorgiades 我使用的是裸机 ARM Cortex-M。不是链接描述文件定义的吗?
  • @SGeorgiades :除了这是一个 Cortex-M MCU,因此可执行文件通常由链接器显式定位并写入闪存 ROM。
  • @SGeorgiades 嗯,你说的确实是 80 年代后期学到的。我们为理论机器实现了汇编器、链接器和加载器。但是,我不愿提及运行时,因为可执行文件是从虚拟内存 0 开始加载的。我没有足够的知识来判断这是否意味着链接期间的静态地址。你怎么看?

标签: c arm cortex-m machine-code


【解决方案1】:

$testFunc 是一个未解析的链接。在确定绝对地址之前,您必须将目标文件与 C 运行时和 MCU 初始化代码以及任何其他依赖项(库单独的目标模块)链接起来。

编译器不知道目标的内存环境。链接器采用单独的目标代码模块和链接器脚本(定义内存映射)并解析链接并定位代码和数据。

链接器可以输出一个 MAP 文件,其中包含所有外部链接器代码和数据项的绝对地址。

【讨论】: