Risc-V学习日记04

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可执行文件。
                }
                

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值