【问题标题】:Position independent binary for Atmel SAM Cortex-M0+Atmel SAM Cortex-M0+ 的位置无关二进制文件
【发布时间】:2019-08-12 12:43:53
【问题描述】:

我正在尝试使用 Atmel Studio 7 中包含的 ARM GNU 工具链(arm-none-eabi ?)为 Cortex-M0+ 创建与位置无关的二进制文件。我已经在很多地方寻找有关如何执行此操作的信息,但没有成功。这将有助于在低高闪存区域中为 OTA 更新创建 ping-pong 映像,而无需知道或关心更新是该单元的 ping 映像还是 pong 映像。

我有一个位于 0x0000 的 8 kB 引导加载程序,我可以通过 UART 与它通信,如果它在此处检测到二进制文件(即不是 0xFFFF 擦除闪存),它将在复位后跳转到 0x6000 (24 kB)。这个 SAM-BA 引导加载程序允许我在指定地址转储内存并使用 .bin 文件对闪存进行擦除和编程。

在应用程序项目中(简单的 LED 闪烁),除了将 -section-start=.text=0x6000 添加到链接器命令行之外什么都不做会导致 LED 闪烁代码在引导加载程序在 0x6000 处编程后工作。我还在十六进制文件中看到它从 0x6000 开始。

在尝试创建与位置无关的二进制文件时,我删除了上述链接器项,并将 -fPIC 标志添加到编译器、链接器和汇编器的命令行。但是,我想我仍然在反汇编中看到绝对分支地址,例如:

28e: d001 beq.n 294

结果是我在 0x6000 加载的 LED 闪烁二进制文件不会执行,除非我明确告诉链接器将它放在 0x6000,这违背了目的。请注意,我确实还看到了反汇编其他部分中的相对分支:

21c: 4b03 ldr r3, [pc, #12] ; (22c)

21e: 58d3 ldr r3, [r2, r3]

220: 9301 str r3,[sp,#4]

222: 4798 blx r3

SRAM 总是在同一个地址(0x20000000),我只需要能够重新定位可执行文件。我没有修改链接器命令文件,它没有 .got 部分(例如 (.got) 或类似的)。

谁能向我解释我需要对编译器/汇编器/链接器标志进行的具体更改,以在此设置中创建与位置无关的二进制文件?非常感谢。

【问题讨论】:

    标签: arm cortex-m position-independent-code


    【解决方案1】:

    您需要更仔细地查看您的反汇编。对于 0xd001,我得到这个:

     0x00000000:    d001        ..      BEQ      {pc}+0x6 ; 0x6
    

    在您的情况下,工具链已尝试提供帮助。显然,16 位操作码不能用 32 位地址空间编码绝对地址。所以你比你想象的更接近解决方案。

    【讨论】:

    • 谢谢,当它说 时,我假设 Studio 中的反汇编程序正在正确解码。 system_clock_source_get_hz 是我从中拉线的函数,我没有想到它可以将绝对地址编码为 16 位操作码。我需要再看看这个,看看是否有办法就地调试它。顺便说一句,我对如何将代码行与响应文本的其余部分分开很感兴趣。
    • 好的,取得进展。我看到引导加载程序跳转到应用程序代码,但我注意到中断向量表也不再具有绝对地址。只需在 IVT 中进行偏移,应用程序代码就会跳回引导加载程序,而不是跳转到 main()。我认为在 M0+ 中有一个向量表重定位寄存器需要由引导加载程序在跳转到应用程序 IVT 的基础之前写入。
    • 它变得更好了。 VTOR 正在由引导加载程序写入,但这只会在发生中断时影响 IVT 条目的地址。所以硬件中断会在正确的位置进入IVT,但向量本身是一个没有正确偏移的地址。对于位于 0x6000 的应用程序,所有 IVT 条目都应为 0x6xxx。但是,使用 -fPIC 标志,这些是 0x0xxx,因此执行被随机引导回引导加载程序。由于只有引导加载程序知道应用程序代码所在的位置,因此它必须在将代码写入 Flash 时即时修改 IVT 条目。
    • 是的,你在正确的轨道上。向量表是绝对地址,在这种情况下需要重写。或者,如果最终目标始终相同,您也可以预加载向量表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2021-12-18
    • 1970-01-01
    • 2021-07-04
    • 2016-06-19
    • 2011-07-26
    • 2018-07-10
    相关资源
    最近更新 更多