diff options
-rw-r--r-- | xen/Rules.mk | 8 | ||||
-rw-r--r-- | xen/include/xen/compiler.h | 9 |
2 files changed, 15 insertions, 2 deletions
diff --git a/xen/Rules.mk b/xen/Rules.mk index 7ab809ac9e..b3224a6afa 100644 --- a/xen/Rules.mk +++ b/xen/Rules.mk @@ -100,6 +100,8 @@ obj-y := $(patsubst %/,%/built-in.o,$(obj-y)) subdir-all := $(subdir-y) $(subdir-n) +$(filter %.init.o,$(obj-y) $(obj-bin-y)): CFLAGS += -DINIT_SECTIONS_ONLY + ifeq ($(lto),y) # Would like to handle all object files as bitcode, but objects made from # pure asm are in a different format and have to be collected separately. @@ -158,8 +160,10 @@ SPECIAL_DATA_SECTIONS := rodata $(foreach n,1 2 4 8,rodata.str1.$(n)) \ %.init.o: %.o Makefile $(OBJDUMP) -h $< | sed -n '/[0-9]/{s,00*,0,g;p}' | while read idx name sz rest; do \ case "$$name" in \ - .text|.data|.bss) test $$sz = 0 || \ - { echo "Error: size of $<:$$name is 0x$$sz" >&2; exit $$idx; };; \ + .text|.text.*|.data|.data.*|.bss) \ + test $$sz != 0 || continue; \ + echo "Error: size of $<:$$name is 0x$$sz" >&2; \ + exit $(shell expr $$idx + 1);; \ esac; \ done $(OBJCOPY) $(foreach s,$(SPECIAL_DATA_SECTIONS),--rename-section .$(s)=.init.$(s)) $< $@ diff --git a/xen/include/xen/compiler.h b/xen/include/xen/compiler.h index 909dec0bdf..23532ea331 100644 --- a/xen/include/xen/compiler.h +++ b/xen/include/xen/compiler.h @@ -14,6 +14,15 @@ #define always_inline __inline__ __attribute__ ((always_inline)) #define noinline __attribute__((noinline)) +#ifdef INIT_SECTIONS_ONLY +/* + * For sources indicated to have only init code, make sure even + * inline functions not expanded inline get placed in .init.text. + */ +#include <xen/init.h> +#define __inline__ __inline__ __init +#endif + #define __attribute_pure__ __attribute__((pure)) #define __attribute_const__ __attribute__((__const__)) |