CC=gcc

CFLAGS=

OBJS=test.o

all: run.static run.dynamic

run.static: static
	./static

run.dynamic: dynamic
	./dynamic

# Link against the newly built glibc.
ARCH?=$(shell arch)
GLIBC-DIR=/export/build/gnu/glibc/build-$(ARCH)-linux
ifeq (x86_64,$(ARCH))
LD-SO?=$(GLIBC-DIR)/elf/ld-linux-x86-64.so.2
RUN-LD-SO=/lib64/`basename $(LD-SO)`
else
LD-SO?=$(GLIBC-DIR)/elf/ld-linux.so.2
RUN-LD-SO=/lib/`basename $(LD-SO)`
CC+=-m32
endif
GLIBC-PATH=$(GLIBC-DIR):$(GLIBC-DIR)/math

RPATH-LINK=-rpath-link

LIBGCC-EH-SHARED=--Wl,-as-needed -lgcc_s -Wl,--no-as-needed
LIBGCC-EH-STATIC=-lgcc_eh

static: $(OBJS)
	$(CC) -static -nostdlib -nostartfiles -o $@ \
	$(GLIBC-DIR)/csu/crt1.o $(GLIBC-DIR)/csu/crti.o \
	`$(CC) --print-file-name=crtbegin.o` \
	$(OBJS) $(LIBS) \
	$(GLIBC-DIR)/libc.a  \
	-lgcc $(LIBGCC-EH-STATIC) \
	$(GLIBC-DIR)/libc.a  \
	`$(CC) --print-file-name=crtend.o` \
	$(GLIBC-DIR)/csu/crtn.o

dynamic: $(OBJS)
	$(CC) -L. -nostdlib -nostartfiles -o $@ \
	-Wl,-dynamic-linker=$(RUN-LD-SO) \
	-Wl,-z,combreloc \
	$(GLIBC-DIR)/csu/crt1.o $(GLIBC-DIR)/csu/crti.o \
	`$(CC) --print-file-name=crtbegin.o` \
	$(OBJS) $(LIBS) \
	-Wl,$(RPATH-LINK)=$(GLIBC-PATH) \
	$(LD-SO) \
	$(GLIBC-DIR)/libc.so.6 $(GLIBC-DIR)/libc_nonshared.a \
	-lgcc $(LIBGCC-EH-STATIC) `$(CC) --print-file-name=crtend.o` \
	$(GLIBC-DIR)/csu/crtn.o

clean:
	rm -f *.s *.o static dynamic
