我正在修改一个汇编器/链接器来添加一个ARM 7a后端。为了与一个调用(BL)交互工作,有BLX,所以如果我看到一个设置了位0的全局符号,我知道要将BL切换到BLX指令。
但是对于分支,没有BX可用于立即数(相对位移),只有寄存器定位地址。
我没有看到一个单一的指令替代,所以我使用单板-分支到一个LDR r0, [pc + offset]
,它加载的符号地址从一个.word
,然后BX r0
。
但我不相信这对于一个非常常见的操作来说是真的必要的--分支到一个碰巧用thumb代码编写的函数。链接器必须以某种方式处理包含泛型B指令的目标代码,这些指令最终被指定用于thumb模式代码。
所以我的问题是:链接器是如何处理的呢?
1条答案
按热度按时间eqqqjvef1#
因此C:
x.s:
构建和反汇编:
如果我用--use-blx链接
我现在没有一个带链接器的llvm,它需要很长的时间来构建。我认为它是类似的。
我认为正如评论中所回答的那样,ABI为这样的事情保留了一个寄存器。
如果我没记错的话,blx在早期的内核中有问题,所以工具没有使用它。
我在这台机器上完成了armv 4 t的clang构建。
为了得到一个好的llvm链接器,你需要构建一个交叉工具,而不仅仅是为你的平台预先构建。最近几个主要的版本在交叉构建时遇到了问题,所以我求助于gcc风格的构建来构建一个特定的架构,这解决了我的很多clang/llvm问题。除了必须为每个版本构建和构建所需的时间。
所以我还没有为llvm构建过armv7-a。我想你会得到同样的结果。注意,我也没有为上面的gcc构建armv 7a。在某种程度上,链接器是做什么的,正如你所看到的,你自己也可以很容易地做到这一点。但是正如评论中所回答的,它生成了一个蹦床,或者我猜人们称之为贴面。
11 vm/叮当声臂7a:
使用GNU工具-march=armv7-a: