微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RISC V 程序集中的全局变量访问

如何解决RISC V 程序集中的全局变量访问

file.c 包含以下代码

unsigned long int a = 0;
unsigned long int b = 0;
unsigned long int c = 0;
unsigned long int d = 0;

void _start() {
    
    a = 1;
    b = 2;
    c = 3;
    d = 4;

    return;
}

如果我在 Ubuntu 18.04 版本中使用此命令行反汇编 file.c:

/opt/riscv/bin/riscv64-unkNown-elf-gcc -march=rv32i -mabi=ilp32 -O0 -nostdlib -S file.c -o file.s

我得到这个输出

    .file   "quattrovariabili.c"
    .option nopic
    .attribute arch,"rv32i2p0"
    .attribute unaligned_access,0
    .attribute stack_align,16
    .text
    .globl  a
    .section    .sbss,"aw",@nobits
    .align  2
    .type   a,@object
    .size   a,4
a:
    .zero   4
    .globl  b
    .align  2
    .type   b,@object
    .size   b,4
b:
    .zero   4
    .globl  c
    .align  2
    .type   c,@object
    .size   c,4
c:
    .zero   4
    .globl  d
    .align  2
    .type   d,@object
    .size   d,4
d:
    .zero   4
    .text
    .align  2
    .globl  _start
    .type   _start,@function

_start:

    addi    sp,sp,-16
    sw  s0,12(sp)
    addi    s0,16
    
    lui a5,%hi(a)
    li  a4,1
    sw  a4,%lo(a)(a5)
    
    lui a5,%hi(b)
    li  a4,2
    sw  a4,%lo(b)(a5)
    
    lui a5,%hi(c)
    li  a4,3
    sw  a4,%lo(c)(a5)
    
    lui a5,%hi(d)
    li  a4,4
    sw  a4,%lo(d)(a5)
    
    nop
    
    lw  s0,12(sp)
    addi    sp,16
    jr  ra
    .size   _start,.-_start
    .ident  "GCC: (GNU) 10.2.0"

如果我在 file.elf 中编译 file.c,然后在 file.s 中反汇编 file.elf 我得到:

quattrovariabili.elf:     file format elf32-littleriscv


disassembly of section .text:

00010074 <_start> (File Offset: 0x74):
_start():
   10074:   ff010113            addi    sp,-16
   10078:   00812623            sw  s0,12(sp)
   1007c:   01010413            addi    s0,16
   10080:   000117b7            lui a5,0x11
   10084:   00100713            li  a4,1
   10088:   0ae7ac23            sw  a4,184(a5) # 110b8 <__DATA_BEGIN__> (File Offset: 0x10b8)
   1008c:   000117b7            lui a5,0x11
   10090:   00200713            li  a4,2
   10094:   0ae7ae23            sw  a4,188(a5) # 110bc <b> (File Offset: 0x10bc)
   10098:   00300713            li  a4,3
   1009c:   80e1a423            sw  a4,-2040(gp) # 110c0 <c> (File Offset: 0x10c0)
   100a0:   00400713            li  a4,4
   100a4:   80e1a623            sw  a4,-2036(gp) # 110c4 <d> (File Offset: 0x10c4)
   100a8:   00000013            nop
   100ac:   00c12403            lw  s0,12(sp)
   100b0:   01010113            addi    sp,16
   100b4:   00008067            ret

disassembly of section .sbss:

000110b8 <a> (File Offset: 0xb8):
__bss_start():
   110b8:   0000                    unimp
    ...

000110bc <b> (File Offset: 0xbc):
   110bc:   0000                    unimp
    ...

000110c0 <c> (File Offset: 0xc0):
   110c0:   0000                    unimp
    ...

000110c4 <d> (File Offset: 0xc4):
   110c4:   0000                    unimp
    ...

disassembly of section .comment:

00000000 <.comment> (File Offset: 0xb8):
   0:   3a434347            fmsub.d ft6,ft6,ft4,ft7,rmm
   4:   2820                    fld fs0,80(s0)
   6:   29554e47            fmsub.s ft8,fa0,fs5,ft5,rmm
   a:   3120                    fld fs0,96(a0)
   c:   2e30                    fld fa2,88(a2)
   e:   2e32                    fld ft8,264(sp)
  10:   0030                    addi    a2,8

disassembly of section .riscv.attributes:

00000000 <.riscv.attributes> (File Offset: 0xca):
   0:   1b41                    addi    s6,s6,-16
   2:   0000                    unimp
   4:   7200                    flw fs0,32(a2)
   6:   7369                    lui t1,0xffffa
   8:   01007663            bgeu    zero,a6,14 <_start-0x10060> (File Offset: 0xde)
   c:   0011                    c.nop   4
   e:   0000                    unimp
  10:   1004                    addi    s1,32
  12:   7205                    lui tp,0xfffe1
  14:   3376                    fld ft6,376(sp)
  16:   6932                    flw fs2,12(sp)
  18:   7032                    flw ft0,44(sp)
  1a:   0030                    addi    a2,8

为什么以下部分不同? elf 文件在我的 ISA 模拟器上不起作用,因为存储是在非法地址执行的。

从第一个 s 文件

lui a5,%hi(c)
li  a4,3
sw  a4,%lo(c)(a5)

lui a5,%hi(d)
li  a4,4
sw  a4,%lo(d)(a5)

来自第二个 s 文件

   10098:   00300713            li  a4,-2036(gp) # 110c4 <d> (File Offset: 0x10c4)

解决方法

在命令行中添加 -mno-relax 可以解决此问题。 有关放松的更多信息,请阅读this Sifive blog post

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。