Makefile分析

1.rule.mk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# This file will be included by the build.mk.

CROSS_COMPILE = riscv64-unknown-elf-
CFLAGS = -nostdlib -fno-builtin -march=rv32g -mabi=ilp32 -g -Wall

QEMU = qemu-system-riscv32
# 不使用图形界面、一个核、虚拟平台、不用bios
QFLAGS = -nographic -smp 1 -machine virt -bios none

GDB = gdb-multiarch
CC = ${CROSS_COMPILE}gcc
OBJCOPY = ${CROSS_COMPILE}objcopy
OBJDUMP = ${CROSS_COMPILE}objdump

# 默认生成规则
.DEFAULT_GOAL := all
all:
# 指示连接器将程序从0x80000000这个地址开始加载,因为内存的地址空间的起始地址是这个
@${CC} ${CFLAGS} ${SRC} -Ttext=0x80000000 -o ${EXEC}.elf
# 将编译生成的elf文件的其他段去除,只留下指令
@${OBJCOPY} -O binary ${EXEC}.elf ${EXEC}.bin

.PHONY : run
run: all
@echo "Press Ctrl-A and then X to exit QEMU"
@echo "------------------------------------"
@echo "No output, please run 'make debug' to see details"
@${QEMU} ${QFLAGS} -kernel ./${EXEC}.elf

.PHONY : debug
debug: all
@echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU"
@echo "-------------------------------------------------------"
# -s:qemu内启动gdb-server, -S:启动qemu时暂停
@${QEMU} ${QFLAGS} -kernel ${EXEC}.elf -s -S &
# 本地启动gdb连接gdb-server
# -q:静默启动
# -x:执行启动脚本
@${GDB} ${EXEC}.elf -q -x ${GDBINIT}

.PHONY : code
code: all
# 对编译生成的文件反汇编显示
@${OBJDUMP} -S ${EXEC}.elf | less

.PHONY : hex
hex: all
@hexdump -C ${EXEC}.bin

.PHONY : clean
clean:
rm -rf *.o *.bin *.elf