gpt4 book ai didi

gcc - 固件补丁的 ARM/Thumb 代码...如何告诉 gcc 汇编器/链接器到 BL 到绝对地址?

转载 作者:行者123 更新时间:2023-12-04 05:57:23 47 4
gpt4 key购买 nike

我正在尝试编写固件模块(针对现有固件,我没有源代码)
所有拇指代码。

有谁知道如何做到这一点,在gcc as (GAS) 汇编器:
使用BL无需手动计算偏移量,当 BL 'ing到一些现有的功能(不在我的代码中..但我知道它的地址)

目前,如果我想使用 BL ...我必须 :
- 回到我的代码
-找出并添加在我正在编写的函数中组装所有先前指令所产生的所有字节
- 将我的函数的起始地址添加到其中(我在链接器脚本中指定我正在编写的内容的起始地址)
- 然后减去我要调用的firmfunc函数的地址

这一切...只是为了计算偏移量...能够写出bl offset... 调用现有的固件函数?
如果我在那个 BL 之前更改任何代码,我必须手动重新做一遍!
见.. 这就是为什么我想学习使用BX对...而不是BL
另外,我不太了解BX。如果我使用 BX 跳转到绝对地址,当从 Thumb 代码调出 Thumb 代码时,我是否必须将实际地址增加 1(以保持 lsb 字节 1)...... CPU 会知道它是拇指代码吗?

最佳答案

大编辑:

根据我最近学到的知识和对问题的更好理解来改变答案

首先,我不知道如何告诉链接器生成一个 bl 到一个地址,该地址是一个硬编码地址,实际上不在这个代码中。您可能会尝试安装一个带有标签等但虚拟或没有代码的 elf 文件,不知道这是否会欺骗链接器。您还必须修改链接描述文件。不值得。

你的另一个问题是从这个问题中产生的:

Arm/Thumb: using BX in Thumb code, to call a Thumb function, or to jump to a Thumb instruction in another function

对于分支,这很好用:

LDR R6, =0x24000
ADD R6, #1 @ (set lsb to 1)
BX R6

或保存指令并执行此操作
LDR R6, =0x24001
BX R6

如果您想分支链接并且您知道地址并且您处于拇指模式并且想要获取拇指代码然后
  ldr r6,=0x24001
bl thumb_trampoline
;@returns here
...
.thumb_func
thumb_trampoline:
bx r6

如果您从 arm 模式开始,并且想要在您已经知道的地址获取拇指代码,则几乎完全相同。
  ldr r6,=0x24001
bl arm_trampoline
;@returns here
...
arm_trampoline:
bx r6

您必须知道您可以以这种方式丢弃 r6(确保 r6 没有保存一些被调用此代码的代码使用的值)。

很抱歉用另一个答案误导了你,我可以发誓 mov lr,pc 将 lsbit 作为一种模式拉入,但事实并非如此。

关于gcc - 固件补丁的 ARM/Thumb 代码...如何告诉 gcc 汇编器/链接器到 BL 到绝对地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9348709/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com