Assembly 叮当声/臂总成-绝对分支被误解

Assembly 叮当声/臂总成-绝对分支被误解,assembly,gcc,arm,clang,Assembly,Gcc,Arm,Clang,我正在从事一个项目,其中代码链接到现有的静态链接二进制文件中。因此,有必要使用带有绝对分支的代码: .arm .globl TestThunk TestThunk: mov r0, #0 b 0x01001234 gcc输出: 00000000 <TestThunk>: 0: e3a00000 mov r0, #0 4: eafffffe b 1001234 <*ABS*0x1001234>

我正在从事一个项目,其中代码链接到现有的静态链接二进制文件中。因此,有必要使用带有绝对分支的代码:

.arm

.globl TestThunk
    TestThunk:
    mov     r0, #0
    b       0x01001234
gcc输出:

00000000 <TestThunk>:
   0:   e3a00000    mov r0, #0
   4:   eafffffe    b   1001234 <*ABS*0x1001234>
叮当声输出:

00000000 <TestThunk>:
   0:   e3a00000    mov r0, #0
   4:   ea40048d    b   1001240 <TestThunk+0x1001240>
正如您所看到的,gcc发出了一个绝对的重新定位,就像我想要的那样。 叮当声会发出相对于对象文件本身的重新定位,这是错误的

我可以强制clang使用特定的编译器标志或汇编指令发出绝对重定位吗


我知道我可以为现有二进制文件创建带有符号的链接器脚本,但我不想为现有代码库创建链接器脚本。

我想这可能是clang内置汇编程序中的一个错误。您可以使用
-fno integrated as
来使用系统的汇编程序,而不是使用clang的汇编程序。它们是两种不同的工具,因此根据定义,有两种不同的汇编语言,因此都是正确的。(汇编语言由工具而不是目标定义)。如果您想使用gcc的汇编语言,那么就使用gcc。gcc的汇编程序将该常量视为地址,而clangs将该常量视为偏移量。这两种语言在它们的汇编语言中都是正确的。如果您想要一个绝对地址(这是gcc解释该值的方式),则只需分支到该地址,而不要混淆汇编语言的细微差别ldr r3,=0x1001234;bx r3或更便携的ldr r3,myadd;bx-r3;myadd:.word 0x1001234,对汇编语言/汇编语言进行了适当的调整(因为没有一些汇编语言的细微差别,这当然无法实现),我可以问一下这是什么基于arvm6的mpcore吗?我想我是唯一一个使用基于armv6的mpcore的人(NDS2D也有一个)。注意,arm没有记录到一个过早执行的bug。如果这真的是基于armv6而不是基于armv7的mpcore,那么使用-march=armv4t构建以避免落入陷阱(或者使用mmu保护您可以从地址空间中的随机地址获取/读取的内容,并确保外围设备不会对读取进行操作)。我想这可能是clang内置汇编程序中的一个错误。您可以使用
-fno integrated as
来使用系统的汇编程序,而不是使用clang的汇编程序。它们是两种不同的工具,因此根据定义,有两种不同的汇编语言,因此都是正确的。(汇编语言由工具而不是目标定义)。如果您想使用gcc的汇编语言,那么就使用gcc。gcc的汇编程序将该常量视为地址,而clangs将该常量视为偏移量。这两种语言在它们的汇编语言中都是正确的。如果您想要一个绝对地址(这是gcc解释该值的方式),则只需分支到该地址,而不要混淆汇编语言的细微差别ldr r3,=0x1001234;bx r3或更便携的ldr r3,myadd;bx-r3;myadd:.word 0x1001234,对汇编语言/汇编语言进行了适当的调整(因为没有一些汇编语言的细微差别,这当然无法实现),我可以问一下这是什么基于arvm6的mpcore吗?我想我是唯一一个使用基于armv6的mpcore的人(NDS2D也有一个)。注意,arm没有记录到一个过早执行的bug。如果这真的是基于armv6而不是基于armv7的mpcore,那么使用-march=armv4t构建以避免落入陷阱(或者使用mmu保护您可以从地址空间中的随机地址获取/读取的内容,并确保外围设备不会对读取采取行动)。
00000000 <TestThunk>:
   0:   e3a00000    mov r0, #0
   4:   ea40048d    b   1001240 <TestThunk+0x1001240>
clang --target=armv6k-none-eabihf -mcpu=mpcore -mtune=mpcore -x assembler-with-cpp -c test.s -o test_clang.o