aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArve Hjønnevåg <arve@android.com>2015-10-01 20:29:07 -0700
committerArve Hjønnevåg <arve@android.com>2017-09-19 16:01:17 -0700
commit83bc2e44670db88d5dc95f2c9466ff19c310eefb (patch)
tree051892f26ce4463114dc6e0ae0bfec681d16bc24
parent7e618e1e4b6c5290bf5f01d5b013c83597c77e8e (diff)
downloadcommon-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.mk1
-rw-r--r--include/lk/init.h4
-rw-r--r--make/build.mk2
-rw-r--r--make/module.mk19
4 files changed, 25 insertions, 1 deletions
diff --git a/engine.mk b/engine.mk
index b4fb647e..1fc01198 100644
--- a/engine.mk
+++ b/engine.mk
@@ -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 :=