Risc-V学习日记04
Day11
交叉编译
{
构建(build)系统
主机(host)系统
目标(targt)系统
}
本地编译: build == host == target
交叉编译: build == host != target[生成的可执行文件不在主机上运行]
x86_64-linux-gnu-gcc-9
riscv64 unknown-elf-gcc
a.out[在riscv64 linux上运行]
调试器GDB:The GNU Project Debugger
gdb a.out
gdb
(ptrace系统调用)
被调试的程序
[网络]
gdbserver
(ptrace系统调用)
被调试的程序
GDB基本调试流程:
重新编译程序并在编译选项中加入"-g"
$ gcc -g test.c
运行gdb和程序
$ gdb a.out
设置断点
(gdb) b 6
运行程序
(gdb) r
程序暂停在断点处,执行查看
(gdb) p xXx
继续、单步或者恢复程序运行ris
(gdb) s/n/c
QEMU系统模拟器
User mode:直接运行应用程序。
System. mode:模拟整个计算机系统,包括中央处理器及其他周边设备。
riscv64-unknown-elf-gcc -march=rv32ima -mapi=ilp32 hello.c
**课程中这里有点小问题ubuntu 20 apt ⾃带的 riscv64-unkonwn-elf-gcc 是不能缺省搜索包含 stdio.h
安装gcc-riscv64-linux-gnu
sudo apt install gcc-riscv64-linux-gnu
Make工具
make是一种自动化工程管理工具
Makefile
描述构建工程过程中所管理的对象以及如何构造工程的过程
当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件[显式查找:-f]
target:目标,可以是 obj 文件也可以是可执行文件
prerequisites:生成 target 所需要的依赖
command:为了生成 target 需要执行的命令,可以有多条
target ...:prerequisites...
command...
...
例子{
hello:hello.c
gcc hello.c -o hello
}
规则:
例子:{
main: main.o utils.o
gcc -o main main.o utils.o
main.o: main.c
gcc -c main.c
utils.o: utils.c
gcc -c utils.c
}
我们定义了三个规则
main 规则表示构建可执行文件 "main",它依赖于 "main.o" 和 "utils.o" 这两个目标文件。当 "main.o" 或 "utils.o" 被修改后,Make 将执行后续命令(gcc 编译和链接)来生成 "main" 可执行文件。
main.o 规则表示构建目标文件 "main.o",它依赖于 "main.c" 源文件。如果 "main.c" 被修改,Make 将执行后续命令(gcc 编译)来生成 "main.o"。
utils.o 规则类似于 main.o 规则,表示构建目标文件 "utils.o",它依赖于 "utils.c" 源文件
缺省规则:不指定默认第一行为终极规则
{
.DEFAULF_GOAL:=all
all:
}
伪规则
{
.PHONY: clean test
all: program
program: main.c utils.c
gcc -o program main.c utils.c
clean:
rm -f program
test:
./program --test
通过使用.PHONY关键字,我们告诉Make这三个目标是伪规则,它们并不代表实际的构建产物。这样,当我们在命令行中运行make clean或make test时,Make会执行相应的清理或测试命令,
而不会尝试生成名为"clean"或"test"的文件。同时,all目标作为默认目标,当我们运行make时,它会构建program目标,生成program可执行文件。
}
Risc-V学习日记04
于 2023-08-01 11:58:39 首次发布