Ios LLVM ARM64程序集:获取符号/标签地址?

Ios LLVM ARM64程序集:获取符号/标签地址?,ios,llvm,arm64,Ios,Llvm,Arm64,我正在将一些32位ARM代码移植到64位,在确定此指令的64位版本时遇到问题: ldr r1, =_fns 其中_fns是在项目其他地方的一些C源文件中定义的符号 我尝试了以下方法,但都出现了错误: adr x1, _fns <== "error: unknown AArch64 fixup kind!" adrl x1, _fns <== "error: unrecognized instruction mnemonic" adr-x1,_-fns exte

我正在将一些32位ARM代码移植到64位,在确定此指令的64位版本时遇到问题:

ldr  r1, =_fns
其中_fns是在项目其他地方的一些C源文件中定义的符号

我尝试了以下方法,但都出现了错误:

adr  x1, _fns     <== "error: unknown AArch64 fixup kind!"
adrl  x1, _fns    <== "error: unrecognized instruction mnemonic"
adr-x1,_-fns

extern char ar[];

char *f()
{
  return ar;
}
在这个过程中,我得到:

针对ARM AArch64的编译器输出

    .text
    .file   "/tmp/webcompile/_3793_0.c"
    .globl  f
    .align  2
    .type   f,@function
f:                                      // @f
// BB#0:                                // %entry
    adrp    x0, ar
    add x0, x0, :lo12:ar
    ret
.Lfunc_end0:
    .size   f, .Lfunc_end0-f


    .ident  "ecc 0.1.13 based on clang version 3.7.0 (trunk) (based on LLVM 3.7.0svn)"
    .section    ".note.GNU-stack","",@progbits
adrp指令将ar的“页面”地址输入x0。adrp的symbol参数转换为相对于符号所在4K页面的21位PC相对偏移量。该偏移量被添加到PC以获得页面的实际开始。add指令将符号地址的低位12位相加,以获得实际符号地址。 此指令序列允许加载PC+/-4GB范围内的符号地址。 据我所知,似乎没有一种方法可以获得与C.I汇编语言中32位ARM的“=ar”类似的功能。它看起来可以工作:

        .text
        .file   "atest.s"
        .globl  f
        .align  2
f:
        ldr     x0, p
        ret
        .align  3
p:
        .xword  _fns
这与32位臂在引擎盖下的功能非常相似。 我开始使用C版本的唯一原因是为了说明我通常是如何处理这样的问题的,特别是如果我对目标汇编语言不太熟悉的话

extern char ar[];

char *f()
{
  return ar;
}
在这个过程中,我得到:

针对ARM AArch64的编译器输出

    .text
    .file   "/tmp/webcompile/_3793_0.c"
    .globl  f
    .align  2
    .type   f,@function
f:                                      // @f
// BB#0:                                // %entry
    adrp    x0, ar
    add x0, x0, :lo12:ar
    ret
.Lfunc_end0:
    .size   f, .Lfunc_end0-f


    .ident  "ecc 0.1.13 based on clang version 3.7.0 (trunk) (based on LLVM 3.7.0svn)"
    .section    ".note.GNU-stack","",@progbits
adrp指令将ar的“页面”地址输入x0。adrp的symbol参数转换为相对于符号所在4K页面的21位PC相对偏移量。该偏移量被添加到PC以获得页面的实际开始。add指令将符号地址的低位12位相加,以获得实际符号地址。 此指令序列允许加载PC+/-4GB范围内的符号地址。 据我所知,似乎没有一种方法可以获得与C.I汇编语言中32位ARM的“=ar”类似的功能。它看起来可以工作:

        .text
        .file   "atest.s"
        .globl  f
        .align  2
f:
        ldr     x0, p
        ret
        .align  3
p:
        .xword  _fns
这与32位臂在引擎盖下的功能非常相似。
我开始使用C版本的唯一原因是为了说明我通常如何处理这样的问题,特别是如果我对目标汇编语言不太熟悉的话。

这对我来说很好,xcode7.1 LLVM7.0 IOS9.1

在32位arm中
ldr r9,=跳线表

更改为64位arm

adrp x9,JumpTab@PAGE
加上x9,x9,JumpTab@PAGEOFF


顺便说一句,您需要关心寄存器的编号,有些寄存器在arm64中有特定的用途。这对我来说很好,xcode7.1 LLVM7.0 IOS9.1

在32位arm中
ldr r9,=跳线表

更改为64位arm

adrp x9,JumpTab@PAGE
加上x9,x9,JumpTab@PAGEOFF


顺便说一句,您需要注意寄存器的编号,一些寄存器在arm64中具有特定的有用性,通过比较,对于大多数等效A64“加载立即值”伪运算是,呃,
ldr x1,=\u fns
。我听说LLVM集成汇编程序非常有限,从adrl判断,我猜它仍然不支持伪操作。苹果是否还包括带有XCode的binutils,以便您可以使用外部汇编程序?(我自己在几年内没有接触过Mac…)通过比较,对于大多数等效的A64“加载立即值”伪操作是,呃,
ldr x1,=\u fns
。我听说LLVM集成汇编程序非常有限,从adrl判断,我猜它仍然不支持伪操作。苹果是否还包括带有XCode的binutils,以便您可以使用外部汇编程序?(几年来我自己都没碰过Mac…)事实上,
adrl
pseudo op确实是
adrp
/
add
对的捷径,但并不是所有东西都支持它。@Notlikethat:谢谢你指出这一点。此外,clang的汇编程序还支持“ldr x0,=_fns”,至少在我的TOT编译版本中是这样。我喜欢你分解C等价物的方法,我应该考虑这样做:-)事实上,
adrl
伪op是
adrp
/
add
对的捷径,但并不是所有的东西都支持它。@Notlikethat:谢谢你指出这一点。此外,clang的汇编程序还支持“ldr x0,=\u fns”,至少在我的TOT编译版本中是这样。我喜欢你分解C等价物的方法,我应该考虑这样做:-)