我正在一个项目中,代码被链接到现有的静态链接的二进制文件中。因此,这样的带有绝对分支的代码是必要的:
.arm
.globl TestThunk
TestThunk:
mov r0, #0
b 0x01001234
gcc输出:
00000000 <TestThunk>:
0: e3a00000 mov r0, #0
4: eafffffe b 1001234 <*ABS*0x1001234>
with
arm-none-eabi-gcc -march=armv6k -mtune=mpcore -x assembler-with-cpp -c test.s -o test_gcc.o
clang输出:
00000000 <TestThunk>:
0: e3a00000 mov r0, #0
4: ea40048d b 1001240 <TestThunk+0x1001240>
with
clang --target=armv6k-none-eabihf -mcpu=mpcore -mtune=mpcore -x assembler-with-cpp -c test.s -o test_clang.o
您可以看到gcc发出了绝对的重定位,就像我想要的那样。clang虽然会发出相对于目标文件本身的重定位,这是错误的。
我是否可以使用特定的编译器标志或汇编器指令来强制clang发出绝对重定位?
我知道我可以为现有二进制文件创建带有符号的链接脚本,但是我不想为现有代码库创建链接脚本。