OS := $(shell uname -s)
- CPU_ARCH := $(shell uname -p)
+ CPU_ARCH := $(shell uname -m)
ifeq ($(OS), Darwin)
- # MacOS下安装i686-elf-*的方法: brew install i686-elf-binutils
+ # MacOS下安装i686-elf-*的方法: brew install i686-elf-binutils i686-elf-gcc
# Apple Silicon
- ifeq ($(CPU_ARCH), arm)
- CROSS_PREFIX = i686-elf-
+ ifeq ($(CPU_ARCH), arm64)
+ CROSS_PREFIX := i686-elf-
# Intel MacOS
else ifeq ($(CPU_ARCH), i386)
- CROSS_PREFIX = i686-elf-
+ CROSS_PREFIX := i686-elf-
endif
else ifeq ($(OS), Linux)
- # Apple Silicon Docker Linux
- ifeq ($(CPU_ARCH), aarch64)
- CROSS_PREFIX = x86_64-linux-gnu-
+ ifeq ($(CPU_ARCH), x86_64)
+ CROSS_PREFIX :=
+ else ifeq ($(CPU_ARCH), i686)
+ CROSS_PREFIX :=
+ else ifeq ($(CPU_ARCH), aarch64)
+ # Apple Silicon Docker Linux
+ CROSS_PREFIX := x86_64-linux-gnu-
+ else
+ $(warning "检测到未知架构 $(CPU_ARCH) 请确保已安装32位x86工具链")
+ CROSS_PREFIX :=
endif
endif
- CC = $(CROSS_PREFIX)gcc
- LD = $(CROSS_PREFIX)ld
+ CC := $(CROSS_PREFIX)gcc
+ LD := $(CROSS_PREFIX)ld
- CFLAGS = -g -c -fno-builtin -m32 -DBUILDER='"$(shell whoami)"' -std=gnu11
+ ifeq (,$(shell which $(CC) 2>/dev/null))
+ $(error "编译器 $(CC) 未找到 请安装交叉编译工具链")
+ endif
+
-CFLAGS := -g -c -fno-builtin -m32 -DBUILDER='"$(shell whoami)"'
++CFLAGS := -g -c -fno-builtin -m32 -DBUILDER='"$(shell whoami)"' -std=gnu11
# 指示编译器禁止生成位置无关代码
- CFLAGS += -fno-pic
+ CFLAGS += -fno-pic
# 指示编译器在生成目标文件时不省略函数调用栈帧指针: frame pointer
- CFLAGS += -fno-omit-frame-pointer
+ CFLAGS += -fno-omit-frame-pointer
# 禁用控制流保护: Control-Flow Enforcement Technology (CET)
- CFLAGS += -fcf-protection=none
- CFLAGS += -DNR_TTYS=3
- CFLAGS += -DFIXED_SYSENTER_ESP_MODE=1
- CFLAGS += -DENABLE_BOOT_WAIT=0
- CFLAGS += -DENABLE_CLOCK_IRQ_WAIT=0
+ CFLAGS += -fcf-protection=none
+ CFLAGS += -DNR_TTYS=3
+ CFLAGS += -DFIXED_SYSENTER_ESP_MODE=1
+ CFLAGS += -DENABLE_BOOT_WAIT=0
+ CFLAGS += -DENABLE_CLOCK_IRQ_WAIT=0
+
+ SYSTEMMAP := System.map
+ KERNELBIN := KERNEL.ELF
+ LINKSCRIPT := scripts/link.ld
- SYSTEMMAP = System.map
- KERNELBIN = KERNEL.ELF
- LINKSCRIPT = scripts/link.ld
+ LDFLAGS := -z noexecstack
+ LDFLAGS += -m elf_i386
+ LDFLAGS += -M
+ LDFLAGS += -T$(LINKSCRIPT)
- SRC_DIRS = boot mm lib fs kernel drivers
- INC_DIRS = include drivers boot mm fs
+ SRC_DIRS := boot mm lib fs kernel drivers
+ INC_DIRS := include drivers boot mm fs
CFLAGS += ${INC_DIRS:%=-I%}