diff options
author | Arve Hjønnevåg <arve@android.com> | 2015-10-01 20:29:07 -0700 |
---|---|---|
committer | Arve Hjønnevåg <arve@android.com> | 2017-09-19 16:01:17 -0700 |
commit | 83bc2e44670db88d5dc95f2c9466ff19c310eefb (patch) | |
tree | 051892f26ce4463114dc6e0ae0bfec681d16bc24 | |
parent | 7e618e1e4b6c5290bf5f01d5b013c83597c77e8e (diff) | |
download | common-83bc2e44670db88d5dc95f2c9466ff19c310eefb.tar.gz |
make: Add MODULE_STATIC_LIB
If a module sets MODULE_STATIC_LIB to true, that module will generate
a .a file instead of a partially linked .o file.
When WITH_LINKER_GC is enables, unreferenced code and data in c files
are dropped from the final elf file. This does not work for most
assembly files, since they put code and data directly into the .text
and .data section. If a .a file is used instead however, files that
have no external references are dropped regardless of which sections
they have.
If MODULE_STATIC_LIB is true, this change also disabled LK_INIT_HOOK*
as files using this as the only entrypoint would also be dropped.
Change-Id: I846ac1bf63018d1d713ca841e03191b1fac35bf4
-rw-r--r-- | engine.mk | 1 | ||||
-rw-r--r-- | include/lk/init.h | 4 | ||||
-rw-r--r-- | make/build.mk | 2 | ||||
-rw-r--r-- | make/module.mk | 19 |
4 files changed, 25 insertions, 1 deletions
@@ -193,6 +193,7 @@ endif CCACHE ?= CC := $(CCACHE) $(TOOLCHAIN_PREFIX)gcc LD := $(TOOLCHAIN_PREFIX)ld +AR := $(TOOLCHAIN_PREFIX)ar OBJDUMP := $(TOOLCHAIN_PREFIX)objdump OBJCOPY := $(TOOLCHAIN_PREFIX)objcopy CPPFILT := $(TOOLCHAIN_PREFIX)c++filt diff --git a/include/lk/init.h b/include/lk/init.h index 67798581..d95b7aa8 100644 --- a/include/lk/init.h +++ b/include/lk/init.h @@ -76,6 +76,9 @@ struct lk_init_struct { const char *name; }; +#if MODULE_STATIC_LIB +#define LK_INIT_HOOK_FLAGS(a,b,c,d) _Pragma("GCC error \"init hooks are not fully compatible with static libraries\"") +#else #define LK_INIT_HOOK_FLAGS(_name, _hook, _level, _flags) \ const struct lk_init_struct _init_struct_##_name __ALIGNED(sizeof(void *)) __SECTION(".lk_init") = { \ .level = _level, \ @@ -83,6 +86,7 @@ struct lk_init_struct { .hook = _hook, \ .name = #_name, \ }; +#endif #define LK_INIT_HOOK(_name, _hook, _level) \ LK_INIT_HOOK_FLAGS(_name, _hook, _level, LK_INIT_FLAG_PRIMARY_CPU) diff --git a/make/build.mk b/make/build.mk index 7c0e9130..f3424d0c 100644 --- a/make/build.mk +++ b/make/build.mk @@ -23,7 +23,7 @@ $(OUTELF): $(ALLMODULE_OBJS) $(EXTRA_OBJS) $(LINKER_SCRIPT) $(EXTRA_LINKER_SCRIP @echo linking $@ $(NOECHO)$(SIZE) -t --common $(sort $(ALLMODULE_OBJS)) $(EXTRA_OBJS) $(NOECHO)$(LD) $(GLOBAL_LDFLAGS) -dT $(LINKER_SCRIPT) $(addprefix -T,$(EXTRA_LINKER_SCRIPTS)) \ - $(ALLMODULE_OBJS) $(EXTRA_OBJS) $(LIBGCC) -Map=$(OUTELF).map -o $@ + --start-group $(ALLMODULE_OBJS) $(EXTRA_OBJS) --end-group $(LIBGCC) -Map=$(OUTELF).map -o $@ $(OUTELF).sym: $(OUTELF) @echo generating symbols: $@ diff --git a/make/module.mk b/make/module.mk index a2367fe1..b8aafa91 100644 --- a/make/module.mk +++ b/make/module.mk @@ -4,6 +4,7 @@ # args: # MODULE : module name (required) # MODULE_SRCS : list of source files, local path (required) +# MODULE_STATIC_LIB : if true generate .a instead of .o # MODULE_DEPS : other modules that this one depends on # MODULE_DEFINES : #defines local to this module # MODULE_OPTFLAGS : OPTFLAGS local to this module @@ -62,6 +63,10 @@ MODULE_DEFINES += MODULE_SRCDEPS=\"$(subst $(SPACE),_,$(MODULE_SRCDEPS))\" MODULE_DEFINES += MODULE_DEPS=\"$(subst $(SPACE),_,$(MODULE_DEPS))\" MODULE_DEFINES += MODULE_SRCS=\"$(subst $(SPACE),_,$(MODULE_SRCS))\" +ifeq (true,$(call TOBOOL,$(MODULE_STATIC_LIB))) +MODULE_DEFINES += MODULE_STATIC_LIB=1 +endif + # generate a per-module config.h file MODULE_CONFIG := $(MODULE_BUILDDIR)/module_config.h @@ -84,12 +89,25 @@ include make/compile.mk #$(info MODULE_OBJS = $(MODULE_OBJS)) # build a ld -r style combined object +ifeq (true,$(call TOBOOL,$(MODULE_STATIC_LIB))) + +MODULE_OBJECT := $(call TOBUILDDIR,$(MODULE_SRCDIR).mod.a) +$(MODULE_OBJECT): $(MODULE_OBJS) $(MODULE_EXTRA_OBJS) + @$(MKDIR) + @echo creating $@ + $(NOECHO)rm -f $@ + $(NOECHO)$(AR) rcs $@ $^ + +else + MODULE_OBJECT := $(call TOBUILDDIR,$(MODULE_SRCDIR).mod.o) $(MODULE_OBJECT): $(MODULE_OBJS) $(MODULE_EXTRA_OBJS) @$(MKDIR) @echo linking $@ $(NOECHO)$(LD) $(GLOBAL_MODULE_LDFLAGS) -r $^ -o $@ +endif + # track all of the source files compiled ALLSRCS += $(MODULE_SRCS) @@ -108,6 +126,7 @@ MODULE_SRCDIR := MODULE_BUILDDIR := MODULE_DEPS := MODULE_SRCS := +MODULE_STATIC_LIB := MODULE_OBJS := MODULE_DEFINES := MODULE_OPTFLAGS := |