aboutsummaryrefslogblamecommitdiff
path: root/04_dynld_nostd/Makefile
blob: 8cd9d35d672f67cd67bb278f2141303e8e0ce909 (plain) (tree)



























































                                                                                                                 
# Copyright (c) 2020 Johannes Stoelp

COMMON_CFLAGS := -g -O0 -Wall -Wextra \
                 -I../lib/include     \
                 -nostartfiles -nodefaultlibs

run: main
	./$<

main: dynld.so main.c ../lib/libcommon.a
	@# For now ew only add support for ELF hash tables (DT_HASH).
	@# Therefore we specify the `hash-style` below.
	gcc -o libgreet.so        \
	    $(COMMON_CFLAGS)      \
	    -fPIC -shared         \
	    -Wl,--hash-style=sysv \
	    libgreet.c

	@if readelf -W -S libgreet.so | grep plt >& /dev/null; then \
		echo "ERROR: libgreet.so contains PLT while we don't support relocation calls in libgreet.so!"; \
		echo "       All function calls in libgreet.so must be statically resolved!"; \
		exit 1; \
	fi

	@# For now ew only add support for ELF hash tables (DT_HASH).
	@# Therefore we specify the `hash-style` below.
	gcc -o $@                                   \
	    $(COMMON_CFLAGS)                        \
	    -L$(CURDIR) -lgreet                     \
	    -Wl,--dynamic-linker=$(CURDIR)/dynld.so \
	    -Wl,--hash-style=sysv                   \
	    -no-pie \
	    $(filter %.c %.a, $^)

	readelf -W --dynamic $@
	readelf -W --program-headers $@
	objdump --disassemble -j .plt -M intel $@
	objdump --disassemble=_start -M intel $@

dynld.so: dynld.S dynld.c ../lib/libcommon.a
	gcc -o $@                          \
	    $(COMMON_CFLAGS)               \
	    -fPIC -static-pie              \
	    -fvisibility=hidden            \
	    -Wl,--entry=dl_start           \
	    -Wl,--no-allow-shlib-undefined \
	    $^

	@if readelf -W -S $@ | grep plt >& /dev/null; then \
		echo "ERROR: $@ contains PLT while we don't support relocation calls in $@!"; \
		echo "       All function calls in $@ must be statically resolved!"; \
		exit 1; \
	fi

../lib/libcommon.a:
	make -C ../lib

clean:
	rm -f main libgreet.so
	rm -f dynld.so