hello.c
1 | #include <stdio.h> |
如何指定target编译
riscv64-unknown-elf-gcc -c hello.c mylib.c i2c.c
只会编译生成hello.o myprint.o i2c.o ,但不会生成.out可执行文件
1 | ``` |
1 | ``` |
如何反汇编.out文件
首先生成.out文件riscv64-unknown-elf-gcc -o hello.out hello.c
然后反汇编 riscv64-unknown-elf-objdump -d hello.out > hello_disassemble.s
即可查看反汇编代码,搜索main函数如下,当然也包括其他内置函数
1 | hello.out: file format elf64-littleriscv |
更多信息尝试riscv64-unknown-elf-objdump --help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Usage: objdump <option(s)> <file(s)>
Display information from object <file(s)>.
At least one of the following switches must be given:
-a, --archive-headers Display archive header information
-f, --file-headers Display the contents of the overall file header
-h, --[section-]headers Display the contents of the section headers
-x, --all-headers Display the contents of all headers
-d, --disassemble Display assembler contents of executable sections
-D, --disassemble-all Display assembler contents of all sections
-s, --full-contents Display the full contents of all sections requested
-G, --stabs Display (in raw form) any STABS info in the file
....
Display DWARF info in the file
-t, --syms Display the contents of the symbol table(s)
-T, --dynamic-syms Display the contents of the dynamic symbol table
....
The following switches are optional:
-b, --target=BFDNAME Specify the target object format as BFDNAME
-m, --architecture=MACHINE Specify the target architecture as MACHINE
如何指定target编译
riscv64-unknown-elf-rvgcc --target-help
显示更多指定目标编译
默认 riscv64-unknown-elf-rvgcc 会生成RV64IMADF,如果你指向生成RV32IM指令集的机器码,如下操作
rvgcc -march=rv32im -mabi=ilp32 -o b_rv32im.out b.c
注意如果用-march=rvxxxx
必须要加-mbi=xxxx
RISC-V 编译器支持多个 ABI,具体取决于 F 和 D 扩展是否存在。RV32 的 ABI 分别名
为 ilp32,ilp32f 和 ilp32d。ilp32 表示 C 语言的整型(int),长整型(long)和指针(pointer)
都是 32 位,可选后缀表示如何传递浮点参数。在 lip32 中,浮点参数在整数寄存器中传递;
在 ilp32f 中,单精度浮点参数在浮点寄存器中传递;在 ilp32d 中,双精度浮点参数也在浮点
寄存器中传递。
自然,如果想在浮点寄存中传递浮点参数,需要相应的浮点 ISA 添加 F 或 D 扩展(见
第 5 章)。因此要编译 RV32I 的代码(GCC 选项-march=rv32i),必须使用 ilp32 ABI(GCC
选项-mabi=lib32)。反过来,调用约定并不要求浮点指令一定要使用浮点寄存器,因此
RV32IFD 与 ilp32,ilp32f 和 ilp32d 都兼容。
对于C代码1
2
3
4void main(){
int val = 0xf;
val++;
}
gcc 使用rv32im,和默认64位编译的区别如下
可以看出32im的指令都是16bit, 而右边指令集有采纳C,有压缩到16bit
gdb 查看CPU寄存器
- print $x0
- p $x0
- p $pc
- info reg
- display $x0 ;每跑一步都会显示寄存器
- ni ;next inst