【问题标题】:How do I allocate writable memory in ARM64 assembly code? [duplicate]如何在 ARM64 汇编代码中分配可写内存? [复制]
【发布时间】:2021-05-16 16:30:12
【问题描述】:

我正在尝试学习 ARM64。我正在 Apple M1 上组装。

我正在尝试分配我可以写入的内存。我不断收到以下错误:

ld: Absolute addressing not allowed in arm64 code but used in '_main' referencing 'foo'

我的程序很简单:

// foo.s
.global _main
.align 2

_main:
  ldr x0, =foo

.data
foo: .zero 8

我正在使用这个脚本来编译它:

#!/bin/bash

as foo.s -o foo.o &&                               \
                                                   \
ld foo.o -o foo                                    \
   -arch arm64                                     \
   -syslibroot `xcrun -sdk macosx --show-sdk-path` \
   -lSystem

经过一番谷歌搜索后,我尝试为 ld 设置 -no_pie,但结果如下:

ld: warning: -no_pie ignored for arm64

我不太确定发生了什么。

谢谢

更新:有一个 SO 问题 here 可以解释问题。

我应用了该修复程序并编写了这个快速程序来测试它是否有效:

.global _main
.align 2

_main:
  // Set x0 to the memory address of foo.
  adrp x0, foo@PAGE
  add x0, x0, foo@PAGEOFF

  // Store 123 in foo.
  mov x1, 123
  str x1, [x0]

  // Load the contents of foo into x2.
  ldr x2, [x0]

  // Exit with a status code set to foo.
  mov x0, x2
  mov x16, 1
  svc 0

.data
foo: .zero 8

如我所料,它以 123 的退出状态返回。

【问题讨论】:

  • 在开始定义_main 之前不要忘记.text。它可能是默认设置,但如果您决定将数据移动到文件顶部,它将使您免于损坏。
  • 谢谢,其他 SO 问题的答案已经成功了!我一定会按照您的建议将.text 添加到我的程序中!

标签: assembly arm ld arm64


【解决方案1】:

您在.data 部分中使用.zero 分配了内存。现在你只需要加载它的地址就可以访问它了。

编写与位置无关的代码比尝试禁用它要好。因此,不要尝试加载绝对地址,而是相对于程序计数器访问它们。

在一个中等大小的程序中(小于一兆字节左右的代码加上静态数据),你可以将foo的地址加载到x0

adr x0, foo

adr 指令将立即数加到程序计数器pc 的值上,并将结果留在目标寄存器中。汇编器和链接器可以确定adr 指令的地址与foo 的地址之间的差异,并将该差异编码为adr 指令的立即数。

对于较大的程序,地址差异可能高达 4 GB 左右,您可以使用adrp 的组合来获取高位,并使用add 或带有偏移量的加载/存储。见What are the semantics of ADRP and ADRL instructions in ARM assembly?

【讨论】:

  • 谢谢 Nate,这真的很有帮助。但是,当我进行更改时,我会收到此错误:'foo.s:5:3: error: unknown AArch64 fixup kind!'。好像再也找不到那个标签名了?
  • 哦,从stackoverflow.com/questions/65351533/… 看来,在 MacOS 上,在所有情况下都必须使用带有 adrp 的“更大程序”技术。我认为这个问题可能与您的问题重复。
  • 谢谢,其他 SO 帖子已经奏效了。
猜你喜欢
  • 2019-11-30
  • 1970-01-01
  • 2016-05-08
  • 2023-03-07
  • 2021-01-19
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
相关资源
最近更新 更多