matos/Makefile
Mathieu Maret 6854ad489f Use gcc stack protector
Trick was to use the stack-protector-guard option otherwise gcc expect
the canary value to be stored on the Thread Local Storage of the current
thread.
That does not work the same way for us, so trying to access TLS at
%gs (the canonical place for the TLS), where gcc expect the canary to be
storeg, lead to system reboot as it is not setup.
2025-02-20 17:13:01 +01:00

118 lines
4.3 KiB
Makefile

# Used to generated .d file that deal with header dependencies
CPPFLAGS = -MMD
AS=nasm
ASFLAGS += -f elf32
LDFLAGS += -m elf_i386
CFLAGS += -m32 -pipe -Wall -Wextra -Werror -ffreestanding -fno-exceptions -fno-pie -fno-tree-vectorize -D__KERNEL__ -fstack-protector-all -mstack-protector-guard=global
#keep .i and .s
#CFLAGS += -save-temps -fverbose-asm
#CFLAGS += -fanalyzer -Wno-analyzer-malloc-leak -Wno-analyzer-out-of-bounds
CXXFLAGS += -m32 -Wall -Wextra -Werror -ffreestanding -fno-exceptions -fno-rtti -fno-pie
DEBUG_FLAGS += -g -Og -DDEBUG -fno-omit-frame-pointer -fno-inline
LIBGCC = $(shell $(CC) -print-libgcc-file-name $(CFLAGS))
QEMU_OPT += -hda disk.img
ARCH?=x86
SUBDIRS := core drivers tests arch/$(ARCH)
INCDIRS += $(foreach dir, $(SUBDIRS), -I$(dir))
CPPFLAGS += $(INCDIRS)
asmsrc=
asmobj=$(asmsrc:%.asm=%.o)
gasmsrc=$(wildcard arch/$(ARCH)/*.S arch/$(ARCH)/boot/*.S)
gasmobj=$(gasmsrc:%.S=%.o)
csrc=$(shell find $(SUBDIRS) -type f -name "*.c")# $(wildcard *.c)
cobj=$(csrc:%.c=%.o)
cinc=$(csrc:%.c=%.i)
deps=$(csrc:%.c=%.d) $(gasmsrc:%.S=%.d)
docsrc=$(wildcard docs/*.md)
docobj=$(docsrc:%.md=%.html)
kernel kernel.debug &: $(asmobj) $(gasmobj) $(cobj) linker.ld
$(LD) $(LDFLAGS) $(asmobj) $(gasmobj) $(cobj) -o kernel -T linker.ld $(LIBGCC) -Map kernel.map
objcopy --only-keep-debug kernel kernel.debug
objcopy --strip-debug kernel
objcopy --add-gnu-debuglink=kernel.debug kernel
fd.iso: kernel
mkdir -p isodir/boot/grub
cp $< isodir/boot/
@printf "set timeout=0\nset default=0\nmenuentry \"matos\" {\n\tmultiboot /boot/kernel\n}" > isodir/boot/grub/grub.cfg
grub-mkrescue -o $@ isodir
userspace: FORCE
$(MAKE) -C userspace
FORCE:
@
doc: $(docobj) ## generate documentation
help: ## show this help
# regex for general help
@sed -ne "s/^##\(.*\)/\1/p" $(MAKEFILE_LIST)
# regex for makefile commands (targets)
@printf "────────────────────────`tput bold``tput setaf 2` Make Commands `tput sgr0`────────────────────────────────\n"
@sed -ne "/@sed/!s/\(^[^#?=]*:\).*##\(.*\)/`tput setaf 2``tput bold`\1`tput sgr0`\2/p" $(MAKEFILE_LIST)
# regex for makefile variables
@printf "────────────────────────`tput bold``tput setaf 4` Make Variables `tput sgr0`───────────────────────────────\n"
@sed -ne "/@sed/!s/\(.*\)?=\(.*\)##\(.*\)/`tput setaf 4``tput bold`\1:`tput setaf 5`\2`tput sgr0`\3/p" $(MAKEFILE_LIST)
disk.img: disk.sfdisk userspace
qemu-img create -f raw $@ 32M
sfdisk $@ < $<
# Before having filesystem support, just dump the user prog into the first partition
strip userspace/user -o userspace/user.strip
$(eval file_size:=$(shell du -b userspace/user.strip|awk '{print $$1}' | xargs printf "%016d" )) \
sed '1s/^/$(file_size)/' userspace/user.strip | dd of=disk.img seek=34816 bs=512
# NASM without preprocessing
%.o:%.asm
$(AS) $(ASFLAGS) -o $@ $<
#GNU GAS ASM with C Preprocessing
%.o: %.S
$(CC) $(CFLAGS) $(CPPFLAGS) -c "$<" -o "$@"
%.html: %.md
markdown -o $@ $<
%.i: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -E -c "$<" -o "$@"
test: CFLAGS += -DRUN_TEST ## Run the OS on qemu with the inner test activated
test: clean kernel disk.img
qemu-system-x86_64 -kernel kernel -serial stdio -m 32M $(QEMU_OPT)
run:kernel disk.img ## Run the OS on qemu
qemu-system-x86_64 -kernel $< -serial stdio $(QEMU_OPT)
debug: CFLAGS += $(DEBUG_FLAGS) ## Run the OS on qemu and attach a debugger to it (may need a clean before to have the debug symbols)
debug: CXXFLAGS += $(DEBUG_FLAGS)
debug:kernel kernel.debug disk.img
gdb -q -x debug.gdb
isodebug: CFLAGS += $(DEBUG_FLAGS) ## Same than previous but kernel is loaded by grub. So, for example, we can access the elf debug info
isodebug: CXXFLAGS += $(DEBUG_FLAGS)
isodebug:fd.iso disk.img
gdb -q -x debug.iso.gdb
debug_test: CFLAGS += $(DEBUG_FLAGS) -DRUN_TEST
debug_test: debug
screenshot: ## Take a screenshot of the qemu window
shutter --window=qemu -o screenshot_1.png -e && zopflipng screenshot_1.png screenshot_1.png
clean:
$(RM) kernel $(asmobj) $(gasmobj) $(cobj) $(deps) $(cinc) fd.iso kernel.debug kernel.map $(docobj)
$(RM) -r isodir
$(MAKE) -C userspace clean
.PHONY:
userspace screenshot
ifneq ($(MAKECMDGOALS),clean)
-include $(deps)
endif