# Сборка материалов апокрифа 1: хуки, аудитор загрузчика, эксперимент с RPATH.
# Всё собирается без root; ничего не устанавливается в систему.

CC       ?= gcc
CFLAGS   ?= -O2 -Wall -Wextra
LDFLAGS  ?=
SRC       = src
OUT       = build
BINS      = $(OUT)/readconf $(OUT)/at_secure $(OUT)/dlopen_demo \
            $(OUT)/touchfile $(OUT)/prog_runpath $(OUT)/prog_rpath
LIBS      = $(OUT)/hide.so $(OUT)/hook.so $(OUT)/fopen_hook.so \
            $(OUT)/audit.so $(OUT)/buggy_hook.so \
            $(OUT)/lib1.so $(OUT)/lib2.so $(OUT)/a/libgreet.so $(OUT)/b/libgreet.so

.PHONY: all check clean

all: $(BINS) $(LIBS)

$(OUT):
	mkdir -p $(OUT) $(OUT)/a $(OUT)/b

$(OUT)/hide.so: $(SRC)/hide.c | $(OUT)
	$(CC) $(CFLAGS) -shared -fPIC -o $@ $< -ldl

$(OUT)/hook.so: $(SRC)/hook.c | $(OUT)
	$(CC) $(CFLAGS) -shared -fPIC -o $@ $< -ldl

$(OUT)/fopen_hook.so: $(SRC)/fopen_hook.c | $(OUT)
	$(CC) $(CFLAGS) -shared -fPIC -o $@ $< -ldl

$(OUT)/audit.so: $(SRC)/audit.c | $(OUT)
	$(CC) $(CFLAGS) -shared -fPIC -o $@ $<

$(OUT)/buggy_hook.so: $(SRC)/buggy_hook.c | $(OUT)
	$(CC) $(CFLAGS) -shared -fPIC -o $@ $< -ldl

$(OUT)/lib1.so: $(SRC)/c1.c | $(OUT)
	$(CC) $(CFLAGS) -shared -fPIC -o $@ $<

$(OUT)/lib2.so: $(SRC)/c2.c | $(OUT)
	$(CC) $(CFLAGS) -shared -fPIC -o $@ $<

$(OUT)/a/libgreet.so: $(SRC)/greet.c | $(OUT)
	$(CC) $(CFLAGS) -shared -fPIC -DLIBTAG='"a"' -Wl,-soname,libgreet.so -o $@ $<

$(OUT)/b/libgreet.so: $(SRC)/greet.c | $(OUT)
	$(CC) $(CFLAGS) -shared -fPIC -DLIBTAG='"b"' -Wl,-soname,libgreet.so -o $@ $<

$(OUT)/readconf: $(SRC)/readconf.c | $(OUT)
	$(CC) $(CFLAGS) -o $@ $<

$(OUT)/at_secure: $(SRC)/at_secure.c | $(OUT)
	$(CC) $(CFLAGS) -o $@ $<

$(OUT)/dlopen_demo: $(SRC)/dlopen_demo.c | $(OUT)
	$(CC) $(CFLAGS) -o $@ $< -ldl

$(OUT)/touchfile: $(SRC)/touchfile.c | $(OUT)
	$(CC) $(CFLAGS) -o $@ $<

# Два варианта сборки: с RUNPATH и с RPATH — для эксперимента с приоритетом.
$(OUT)/prog_runpath: $(SRC)/main.c $(OUT)/a/libgreet.so | $(OUT)
	$(CC) $(CFLAGS) -o $@ $(SRC)/main.c -L$(OUT)/a -lgreet \
	    -Wl,-rpath,'$$ORIGIN/a' -Wl,--enable-new-dtags

$(OUT)/prog_rpath: $(SRC)/main.c $(OUT)/a/libgreet.so | $(OUT)
	$(CC) $(CFLAGS) -o $@ $(SRC)/main.c -L$(OUT)/a -lgreet \
	    -Wl,-rpath,'$$ORIGIN/a' -Wl,--disable-new-dtags

check: all
	./src/audit-env.sh
	$(OUT)/at_secure
	$(OUT)/prog_runpath
	$(OUT)/prog_rpath

clean:
	rm -rf $(OUT)
