diff --git a/app-tools/Makefile b/app-tools/Makefile index beb39b817..e355e0584 100644 --- a/app-tools/Makefile +++ b/app-tools/Makefile @@ -83,6 +83,7 @@ ${TOOLOBJ}/${2}: ${1} Makefile ${TOOLOBJ} -e 's#!PLATFORM!#$(PLATFORM)#g;' \ -e 's#!CPPFLAGS!#$(BUILDRUMP_TOOL_CPPFLAGS)#g;' \ -e 's#!CFLAGS!#$(BUILDRUMP_TOOL_CFLAGS)#g;' \ + -e 's#!EXTRACCFLAGS!#$(EXTRACCFLAGS)#g;' \ -e 's#!CXXFLAGS!#$(BUILDRUMP_TOOL_CXXFLAGS)#g;' \ -e 's#!LDFLAGS_BAKE!#$(LDFLAGS_BAKE)#g;' chmod 755 $$@ diff --git a/app-tools/cc.in b/app-tools/cc.in index ef0db9a2d..4ea20a847 100644 --- a/app-tools/cc.in +++ b/app-tools/cc.in @@ -96,7 +96,7 @@ ferment) ${CC} ${CFLAGS} -no-integrated-cpp \ --sysroot !DESTDIR!/rumprun-!MACHINE_GNU_ARCH! \ -specs=!DESTDIR!/rumprun-!MACHINE_GNU_ARCH!/lib/specs-compile_or_ferment \ - -Wl,-r -Wl,-u,main \ + !EXTRACCFLAGS! -Wl,-r -Wl,-u,main \ "$@" !DESTDIR!/rumprun-!MACHINE_GNU_ARCH!/share/!TOOLTUPLE!-recipe.s ${EXTRALIBS} || die # If the presumed output file did not change, and the compiler diff --git a/app-tools/cookfs.in b/app-tools/cookfs.in index 4972b3fd8..16d8b2bc5 100644 --- a/app-tools/cookfs.in +++ b/app-tools/cookfs.in @@ -164,7 +164,7 @@ processonefile () ln -sf -- "${fabs}" ${LINKPATH} ${RUMPRUN_COOKFS_CC} !CFLAGS! !CPPFLAGS! -nostdlib \ - -Wl,-r,-b,binary -o ${TMPDIR}/d${fn}.o ${LINKPATH} + !EXTRACCFLAGS! -Wl,-r,-b,binary -o ${TMPDIR}/d${fn}.o ${LINKPATH} ${RUMPRUN_COOKFS_OBJCOPY} \ --redefine-sym ${LINKPATH_BIN}_start=${rf}_start \ @@ -233,7 +233,7 @@ exec 1>&3 3>&- unset IFS ${RUMPRUN_COOKFS_CC} !CFLAGS! !CPPFLAGS! -I${RUMPRUN_COOKFS_INCDIR} \ - -nostdlib -Wl,-r -o ${TMPDIR}/fin.o ${TMPDIR}/d*.o ${TMPDIR}/constr.c + -nostdlib !EXTRACCFLAGS! -Wl,-r -o ${TMPDIR}/fin.o ${TMPDIR}/d*.o ${TMPDIR}/constr.c ${RUMPRUN_COOKFS_OBJCOPY} ${LSYM} ${TMPDIR}/fin.o ${OUTFILE} totsize=$(${RUMPRUN_COOKFS_SIZE} ${OUTFILE} | awk 'NR == 2{print $4}') diff --git a/app-tools/rumprun-bake.in b/app-tools/rumprun-bake.in index b43195a2f..3d82bae27 100644 --- a/app-tools/rumprun-bake.in +++ b/app-tools/rumprun-bake.in @@ -397,8 +397,9 @@ done MACHINE_GNU_ARCH=${RUMPBAKE_TUPLE%%-*} + # Final link using cc to produce the unikernel image. -${runcmd} ${RUMPBAKE_BACKINGCC} ${RUMPBAKE_CFLAGS} \ +${runcmd} ${RUMPBAKE_BACKINGCC} ${RUMPBAKE_CFLAGS} !EXTRACCFLAGS! \ --sysroot ${RUMPBAKE_TOOLDIR}/rumprun-${MACHINE_GNU_ARCH} \ -specs=${RUMPBAKE_TOOLDIR}/rumprun-${MACHINE_GNU_ARCH}/lib/rumprun-${PLATFORM}/specs-bake \ -o ${OUTPUT} ${allobjs} \ diff --git a/build-rr.sh b/build-rr.sh index 82e831ba1..933525af6 100755 --- a/build-rr.sh +++ b/build-rr.sh @@ -500,6 +500,14 @@ makeconfig () else echo "CONFIG_CXX=no" >> ${1} fi + + # Check for if compiler supports -no-pie and save to EXTRACCFLAGS + gccnopie= + if [ -z "`echo 'int p=1;' | ${CC} -no-pie -S -o /dev/null -x c - 2>&1`" ]; then + gccnopie=-no-pie + fi + echo "EXTRACCFLAGS=${quote}${gccnopie}${quote}" >> ${1} + } dobuild () diff --git a/global.mk b/global.mk index 599550705..1e0ebd8cf 100644 --- a/global.mk +++ b/global.mk @@ -23,3 +23,6 @@ INSTALLDIR= ${RROBJ}/dest.stage else INSTALLDIR= ${RRDEST} endif + +cc-option = $(shell if [ -z "`echo 'int p=1;' | $(CC) $(1) -S -o /dev/null -x c - 2>&1`" ]; \ + then echo y; else echo n; fi) diff --git a/platform/hw/Makefile b/platform/hw/Makefile index 387440bde..20bb297d6 100644 --- a/platform/hw/Makefile +++ b/platform/hw/Makefile @@ -31,6 +31,10 @@ SRCS+= intr.c clock_subr.c kernel.c multiboot.c undefs.c include ../Makefile.inc include arch/${ARCHDIR}/Makefile.inc +# Disable PIE, but need to check if compiler supports it +LDFLAGS-$(call cc-option,-no-pie) += -no-pie +LDFLAGS += $(LDFLAGS-y) + OBJS:= $(patsubst %.c,${RROBJ}/platform/%.o,${SRCS}) \ $(patsubst %.S,${RROBJ}/platform/%.o,${ASMS}) @@ -54,7 +58,7 @@ ${RROBJ}/platform/%.o: %.S ${CC} -D_LOCORE ${CPPFLAGS} ${CFLAGS} -c $< -o $@ ${MAINOBJ}: ${OBJS} platformlibs - ${CC} -nostdlib ${CFLAGS} -Wl,-r ${OBJS} -o $@ \ + ${CC} -nostdlib ${CFLAGS} ${LDFLAGS} -Wl,-r ${OBJS} -o $@ \ -L${RROBJLIB}/libbmk_core -L${RROBJLIB}/libbmk_rumpuser \ -Wl,--whole-archive -lbmk_rumpuser -lbmk_core -Wl,--no-whole-archive ${OBJCOPY} -w -G bmk_* -G rumpuser_* -G jsmn_* \ diff --git a/platform/xen/Makefile b/platform/xen/Makefile index 4f074f784..28ba4c5e5 100644 --- a/platform/xen/Makefile +++ b/platform/xen/Makefile @@ -24,6 +24,10 @@ default: prepare links mini-os ${MAINOBJ} ${TARGETS} CPPFLAGS+= -isystem xen/include CPPFLAGS+= -no-integrated-cpp +# Disable PIE, but need to check if compiler supports it +LDFLAGS-$(call cc-option,-no-pie) += -no-pie +LDFLAGS += $(LDFLAGS-y) + CFLAGS += -fno-builtin rump-src-y += rumphyper_bio.c diff --git a/platform/xen/xen/Makefile b/platform/xen/xen/Makefile index 95a8ecd48..e42d3bbb6 100644 --- a/platform/xen/xen/Makefile +++ b/platform/xen/xen/Makefile @@ -33,7 +33,9 @@ LDARCHLIB := -l$(ARCH_LIB_NAME) LDSCRIPT := $(TARGET_ARCH_DIR)/minios-$(XEN_TARGET_ARCH).lds LDFLAGS_FINAL := -T $(LDSCRIPT) -LDFLAGS := -L$(abspath $(OBJ_DIR)/$(TARGET_ARCH_DIR)) +# Disable PIE, but need to check if compiler supports it +LDFLAGS-$(call cc-option,-no-pie) += -no-pie +LDFLAGS := -L$(abspath $(OBJ_DIR)/$(TARGET_ARCH_DIR)) $(LDFLAGS-y) # Prefixes for global API names. All other symbols in mini-os are localised # before linking with rumprun applications. diff --git a/platform/xen/xen/minios.mk b/platform/xen/xen/minios.mk index e6db96dce..a9b59a86a 100644 --- a/platform/xen/xen/minios.mk +++ b/platform/xen/xen/minios.mk @@ -7,8 +7,9 @@ debug = y # Define some default flags. # NB. '-Wcast-qual' is nasty, so I omitted it. DEF_CFLAGS += -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format -Wno-redundant-decls -DEF_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,) -DEF_CFLAGS += $(call cc-option,$(CC),-fgnu89-inline) +DEF_CFLAGS-$(call cc-option,-fno-stack-protector) += -fno-stack-protector +DEF_CFLAGS-$(call cc-option,-fgnu89-inline) += -fgnu89-inline +DEF_CFLAGS += $(DEF_CFLAGS-y) DEF_CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline DEF_CPPFLAGS += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)