如何解决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 模拟器上不起作用,因为存储是在非法地址执行的。
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 举报,一经查实,本站将立刻删除。