assembly 如何声明一个变量(在数据段中)并在arm64汇编中加载变量的地址?

tzxcd3kk  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(144)

我想我知道这个,但我忘了怎么做。
在汇编程序中(在linux的arch/arm 64/kernel/head.S中),我声明了一个如下所示的变量

__INITDATA
mydata1 : .long 0x22222222

然后在__INIT部分的__primary_switch函数(即.init.text)中,我希望覆盖mydata 1中的0x 1406,

mov x27, #0x1406
adrp x25, mydata1
add x25, x25, :lo12:mydata1
str x27, [x25]
dc cvac, x25

但是当我编译它的时候,我得到了这个错误消息。

/tmp/ccy8ayvt.s: Error: .size expression for __primary_switch does not evaluate to a constant

我做错了什么?
附加:
我发现了我的错误:我把

__INITDATTA
mydata1: .long 0x22222222

在函数定义中!(就在SYM_FUNC_END(__primary_switch)语句之前..)这会导致奇怪的错误消息。

xt0899hw

xt0899hw1#

试试看?

unsigned long x=0x22222222;
void fun ( void )
{
    x=0x1406;
}

aarch64-none-elf-gcc -fno-section-anchors -O2 -c -save-temps so.c -o so.o

    .arch armv8-a
    .file   "so.c"
    .text
    .align  2
    .p2align 4,,11
    .global fun
    .type   fun, %function
fun:
    adrp    x0, x
    mov x1, 5126
    str x1, [x0, #:lo12:x]
    ret
    .size   fun, .-fun
    .global x
    .data
    .align  3
    .type   x, %object
    .size   x, 8
x:
    .xword  572662306
    .ident  "GCC: (GNU) 11.1.0"

所以

.global fun
fun:
    adrp    x0, x
    mov x1, 0x1406
    str x1, [x0, #:lo12:x]
    ret

    .data
    .global x
x:
    .xword  0x22222222

最少的链接来查看它的运行情况

Disassembly of section .text:

0000000000400000 <fun>:
  400000:   90000080    adrp    x0, 410000 <fun+0x10000>
  400004:   d28280c1    mov x1, #0x1406                 // #5126
  400008:   f9000801    str x1, [x0, #16]
  40000c:   d65f03c0    ret

Disassembly of section .data:

0000000000410010 <__data_start>:
  410010:   22222222    .inst   0x22222222 ; undefined
  410014:   00000000    udf #0

也可以这样做

.global fun
fun:
    adrp    x0, x
    add    x0,x0,#:lo12:x
    mov x1, #0x1406
    str x1, [x0]
    ret

    .data
    .global x
x:
    .xword  0x22222222

但即使我

.data
mydata1 : .long 0x22222222

.text
mov x27, #0x1406
adrp x25, mydata1
add x25, x25, :lo12:mydata1
str x27, [x25]
dc cvac, x25

aarch64-none-elf-as so.s -o so.o
aarch64-none-elf-objdump -D so.o

so.o:     file format elf64-littleaarch64

Disassembly of section .text:

0000000000000000 <.text>:
   0:   d28280db    mov x27, #0x1406                    // #5126
   4:   90000019    adrp    x25, 0 <.text>
   8:   91000339    add x25, x25, #0x0
   c:   f900033b    str x27, [x25]
  10:   d50b7a39    dc  cvac, x25

Disassembly of section .data:

0000000000000000 <mydata1>:
   0:   22222222    .inst   0x22222222 ; undefined

你使用的是什么工具(和版本),你能提供一个完整的最小的例子吗?我没有看到错误。既然它谈到了大小,那么.size在你的代码中显示了什么?为什么它不能解析?这就是你需要开始的地方

相关问题