# IERG4130 — one demo per mitigation (builds "off" and "on" variants)
CC := gcc
CLANG := $(shell command -v clang 2>/dev/null)

.PHONY: all run msan clean
all: canary_off canary_on nx_on nx_off aslr asan_uaf ubsan

canary_off: canary.c
	$(CC) -fno-stack-protector $< -o $@
canary_on: canary.c
	$(CC) -fstack-protector-all $< -o $@
nx_on: nx.c
	$(CC) $< -o $@
nx_off: nx.c
	$(CC) -z execstack $< -o $@
aslr: aslr.c
	$(CC) $< -o $@
asan_uaf: asan_uaf.c
	$(CC) -g -fsanitize=address $< -o $@
ubsan: ubsan_overflow.c
	$(CC) -g -fsanitize=undefined $< -o $@

# MemorySanitizer is clang-only
msan: msan_example.c
ifeq ($(CLANG),)
	echo "clang not installed — skipping MSan"
else
	clang -g -fsanitize=memory -fsanitize-memory-track-origins $< -o msan
endif

run: all
	bash run_all.sh

clean:
	rm -f canary_off canary_on nx_on nx_off aslr asan_uaf ubsan msan
