build system: add PIE build option

diff --git a/Makefile.flags b/Makefile.flags
index 9525889..1cfda26 100644
--- a/Makefile.flags
+++ b/Makefile.flags
@@ -50,17 +50,31 @@
 CFLAGS += $(call cc-option,-g)
 endif
 
+# If arch/$(ARCH)/Makefile did not override it (with, say, -fPIC)...
+ARCH_FPIC ?= -fpic
+ARCH_FPIE ?= -fpie
+ARCH_PIE ?= -pie
+
 ifeq ($(CONFIG_BUILD_LIBBUSYBOX),y)
 # on i386: 14% smaller libbusybox.so
 # (code itself is 9% bigger, we save on relocs/PLT/GOT)
-CFLAGS += -fpic
+CFLAGS += $(ARCH_FPIC)
 # and another 4% reduction of libbusybox.so:
 # (external entry points must be marked EXTERNALLY_VISIBLE)
 CFLAGS += $(call cc-option,-fvisibility=hidden)
 endif
 
 ifeq ($(CONFIG_STATIC),y)
-LDFLAGS += -static
+CFLAGS_busybox += -static
+endif
+
+ifeq ($(CONFIG_PIE),y)
+CFLAGS_busybox += $(ARCH_PIE)
+CFLAGS += $(ARCH_FPIE)
+# No switch() jump tables. Code growth +1k, binary size down -12k
+# due to reduced number of code pointers.
+# (TODO: make overridable: some arches may want to not do this)
+CFLAGS += $(call cc-option,-fno-jump-tables)
 endif
 
 LDLIBS += m crypt
@@ -81,8 +95,6 @@
 LDLIBS += dmalloc
 endif
 
-#LDFLAGS += -nostdlib
-
 LDFLAGS_ELF2FLT = -Wl,-elf2flt
 ifneq (,$(findstring $(LDFLAGS_ELF2FLT),$(LDFLAGS)))
 SKIP_STRIP = y