From 65e069df6f864102b062fc04de8877f8230034a8 Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Mon, 8 Jun 2015 10:35:24 +0100 Subject: [PATCH] Build statically linked version of dex2oat. Change-Id: Icde39b770781095af7bd87ae6b907ad97a8a05da --- build/Android.common_build.mk | 4 +++ build/Android.executable.mk | 37 ++++++++++++++++++++----- compiler/Android.mk | 63 +++++++++++++++++++++++++++++++++++++------ dex2oat/Android.mk | 8 ++++++ runtime/Android.mk | 47 ++++++++++++++++++++++++++------ sigchainlib/Android.mk | 16 +++++++++++ 6 files changed, 153 insertions(+), 22 deletions(-) diff --git a/build/Android.common_build.mk b/build/Android.common_build.mk index 29b357359..2057679f2 100644 --- a/build/Android.common_build.mk +++ b/build/Android.common_build.mk @@ -33,6 +33,7 @@ ART_BUILD_TARGET_NDEBUG ?= true ART_BUILD_TARGET_DEBUG ?= true ART_BUILD_HOST_NDEBUG ?= true ART_BUILD_HOST_DEBUG ?= true +ART_BUILD_HOST_STATIC ?= false ifeq ($(ART_BUILD_TARGET_NDEBUG),false) $(info Disabling ART_BUILD_TARGET_NDEBUG) @@ -46,6 +47,9 @@ endif ifeq ($(ART_BUILD_HOST_DEBUG),false) $(info Disabling ART_BUILD_HOST_DEBUG) endif +ifeq ($(ART_BUILD_HOST_STATIC),true) +$(info Enabling ART_BUILD_HOST_STATIC) +endif # # Used to enable JIT diff --git a/build/Android.executable.mk b/build/Android.executable.mk index 5ed94d59c..fdb2be112 100644 --- a/build/Android.executable.mk +++ b/build/Android.executable.mk @@ -28,6 +28,7 @@ ART_EXECUTABLES_CFLAGS := # $(5): target or host # $(6): ndebug or debug # $(7): value for LOCAL_MULTILIB (empty means default) +# $(8): static or shared (empty means shared, applies only for host) define build-art-executable ifneq ($(5),target) ifneq ($(5),host) @@ -42,11 +43,12 @@ define build-art-executable art_executable := $(1) art_source := $(2) - art_shared_libraries := $(3) + art_libraries := $(3) art_c_includes := $(4) art_target_or_host := $(5) art_ndebug_or_debug := $(6) art_multilib := $(7) + art_static_or_shared := $(8) art_out_binary_name := include $(CLEAR_VARS) @@ -54,7 +56,12 @@ define build-art-executable LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $$(art_source) LOCAL_C_INCLUDES += $(ART_C_INCLUDES) art/runtime art/cmdline $$(art_c_includes) - LOCAL_SHARED_LIBRARIES += $$(art_shared_libraries) + + ifeq ($$(art_static_or_shared),static) + LOCAL_STATIC_LIBRARIES += $$(art_libraries) + else + LOCAL_SHARED_LIBRARIES += $$(art_libraries) + endif ifeq ($$(art_ndebug_or_debug),ndebug) LOCAL_MODULE := $$(art_executable) @@ -62,6 +69,10 @@ define build-art-executable LOCAL_MODULE := $$(art_executable)d endif + ifeq ($$(art_static_or_shared),static) + LOCAL_MODULE := $(LOCAL_MODULE)s + endif + LOCAL_CFLAGS := $(ART_EXECUTABLES_CFLAGS) # Mac OS linker doesn't understand --export-dynamic. ifneq ($$(HOST_OS)-$$(art_target_or_host),darwin-host) @@ -82,13 +93,26 @@ define build-art-executable else LOCAL_CFLAGS += $(ART_HOST_NON_DEBUG_CFLAGS) endif - LOCAL_LDLIBS += -lpthread -ldl + ifeq ($$(art_static_or_shared),static) + LOCAL_LDFLAGS += -static + # We need this because GC stress mode makes use of _Unwind_GetIP and _Unwind_Backtrace and + # the symbols are also defined in libgcc_eh.a(unwind-dw2.o) + # TODO: Having this is not ideal as it might obscure errors. Try to get rid of it. + LOCAL_LDFLAGS += -z muldefs + endif + LOCAL_LDLIBS += -lpthread -ldl -lrt endif + # If dynamically linked add libart by default. Statically linked executables + # needs to specify it in art_libraries to ensure proper ordering. ifeq ($$(art_ndebug_or_debug),ndebug) - LOCAL_SHARED_LIBRARIES += libart + ifneq ($$(art_static_or_shared),static) + LOCAL_SHARED_LIBRARIES += libart + endif else # debug - LOCAL_SHARED_LIBRARIES += libartd + ifneq ($$(art_static_or_shared),static) + LOCAL_SHARED_LIBRARIES += libartd + endif endif LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common_build.mk @@ -143,11 +167,12 @@ define build-art-executable # Clear out local variables now that we're done with them. art_executable := art_source := - art_shared_libraries := + art_libraries := art_c_includes := art_target_or_host := art_ndebug_or_debug := art_multilib := + art_static_or_shared := art_out_binary_name := endef diff --git a/compiler/Android.mk b/compiler/Android.mk index dd214067a..39470785a 100644 --- a/compiler/Android.mk +++ b/compiler/Android.mk @@ -181,6 +181,7 @@ LIBART_COMPILER_ENUM_OPERATOR_OUT_HEADER_FILES := \ # $(1): target or host # $(2): ndebug or debug +# $(3): static or shared (empty means shared, applies only for host) define build-libart-compiler ifneq ($(1),target) ifneq ($(1),host) @@ -195,6 +196,7 @@ define build-libart-compiler art_target_or_host := $(1) art_ndebug_or_debug := $(2) + art_static_or_shared := $(3) include $(CLEAR_VARS) ifeq ($$(art_target_or_host),host) @@ -203,17 +205,29 @@ define build-libart-compiler LOCAL_CPP_EXTENSION := $(ART_CPP_EXTENSION) ifeq ($$(art_ndebug_or_debug),ndebug) LOCAL_MODULE := libart-compiler - LOCAL_SHARED_LIBRARIES += libart + ifeq ($$(art_static_or_shared), static) + LOCAL_STATIC_LIBRARIES += libart + else + LOCAL_SHARED_LIBRARIES += libart + endif ifeq ($$(art_target_or_host),target) LOCAL_FDO_SUPPORT := true endif else # debug LOCAL_MODULE := libartd-compiler - LOCAL_SHARED_LIBRARIES += libartd + ifeq ($$(art_static_or_shared), static) + LOCAL_STATIC_LIBRARIES += libartd + else + LOCAL_SHARED_LIBRARIES += libartd + endif endif LOCAL_MODULE_TAGS := optional - LOCAL_MODULE_CLASS := SHARED_LIBRARIES + ifeq ($$(art_static_or_shared), static) + LOCAL_MODULE_CLASS := STATIC_LIBRARIES + else + LOCAL_MODULE_CLASS := SHARED_LIBRARIES + endif LOCAL_SRC_FILES := $$(LIBART_COMPILER_SRC_FILES) @@ -237,6 +251,9 @@ $$(ENUM_OPERATOR_OUT_GEN): $$(GENERATED_SRC_DIR)/%_operator_out.cc : $(LOCAL_PAT LOCAL_CFLAGS += $(ART_HOST_CFLAGS) LOCAL_ASFLAGS += $(ART_HOST_ASFLAGS) LOCAL_LDLIBS := $(ART_HOST_LDLIBS) + ifeq ($$(art_static_or_shared),static) + LOCAL_LDFLAGS += -static + endif ifeq ($$(art_ndebug_or_debug),debug) LOCAL_CFLAGS += $(ART_HOST_DEBUG_CFLAGS) else @@ -254,9 +271,17 @@ $$(ENUM_OPERATOR_OUT_GEN): $$(GENERATED_SRC_DIR)/%_operator_out.cc : $(LOCAL_PAT LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk # Vixl assembly support for ARM64 targets. ifeq ($$(art_ndebug_or_debug),debug) - LOCAL_SHARED_LIBRARIES += libvixld + ifeq ($$(art_static_or_shared), static) + LOCAL_WHOLESTATIC_LIBRARIES += libvixld + else + LOCAL_SHARED_LIBRARIES += libvixld + endif else - LOCAL_SHARED_LIBRARIES += libvixl + ifeq ($$(art_static_or_shared), static) + LOCAL_WHOLE_STATIC_LIBRARIES += libvixl + else + LOCAL_SHARED_LIBRARIES += libvixl + endif endif LOCAL_NATIVE_COVERAGE := $(ART_COVERAGE) @@ -267,7 +292,11 @@ $$(ENUM_OPERATOR_OUT_GEN): $$(GENERATED_SRC_DIR)/%_operator_out.cc : $(LOCAL_PAT include $(BUILD_SHARED_LIBRARY) else # host LOCAL_MULTILIB := both - include $(BUILD_HOST_SHARED_LIBRARY) + ifeq ($$(art_static_or_shared), static) + include $(BUILD_HOST_STATIC_LIBRARY) + else + include $(BUILD_HOST_SHARED_LIBRARY) + endif endif ifeq ($$(art_target_or_host),target) @@ -278,20 +307,38 @@ $$(ENUM_OPERATOR_OUT_GEN): $$(GENERATED_SRC_DIR)/%_operator_out.cc : $(LOCAL_PAT endif else # host ifeq ($$(art_ndebug_or_debug),debug) - $(HOST_OUT_EXECUTABLES)/dex2oatd: $$(LOCAL_INSTALLED_MODULE) + ifeq ($$(art_static_or_shared),static) + $(HOST_OUT_EXECUTABLES)/dex2oatds: $$(LOCAL_INSTALLED_MODULE) + else + $(HOST_OUT_EXECUTABLES)/dex2oatd: $$(LOCAL_INSTALLED_MODULE) + endif else - $(HOST_OUT_EXECUTABLES)/dex2oat: $$(LOCAL_INSTALLED_MODULE) + ifeq ($$(art_static_or_shared),static) + $(HOST_OUT_EXECUTABLES)/dex2oats: $$(LOCAL_INSTALLED_MODULE) + else + $(HOST_OUT_EXECUTABLES)/dex2oat: $$(LOCAL_INSTALLED_MODULE) + endif endif endif + # Clear locally defined variables. + art_target_or_host := + art_ndebug_or_debug := + art_static_or_shared := endef # We always build dex2oat and dependencies, even if the host build is otherwise disabled, since they are used to cross compile for the target. ifeq ($(ART_BUILD_HOST_NDEBUG),true) $(eval $(call build-libart-compiler,host,ndebug)) + ifeq ($(ART_BUILD_HOST_STATIC),true) + $(eval $(call build-libart-compiler,host,ndebug,static)) + endif endif ifeq ($(ART_BUILD_HOST_DEBUG),true) $(eval $(call build-libart-compiler,host,debug)) + ifeq ($(ART_BUILD_HOST_STATIC),true) + $(eval $(call build-libart-compiler,host,debug,static)) + endif endif ifeq ($(ART_BUILD_TARGET_NDEBUG),true) $(eval $(call build-libart-compiler,target,ndebug)) diff --git a/dex2oat/Android.mk b/dex2oat/Android.mk index b4d2343cf..d27ee3efa 100644 --- a/dex2oat/Android.mk +++ b/dex2oat/Android.mk @@ -40,6 +40,7 @@ endif ifeq ($(ART_BUILD_TARGET_NDEBUG),true) $(eval $(call build-art-executable,dex2oat,$(DEX2OAT_SRC_FILES),libcutils libart-compiler libsigchain,art/compiler,target,ndebug,$(dex2oat_target_arch))) endif + ifeq ($(ART_BUILD_TARGET_DEBUG),true) $(eval $(call build-art-executable,dex2oat,$(DEX2OAT_SRC_FILES),libcutils libartd-compiler libsigchain,art/compiler,target,debug,$(dex2oat_target_arch))) endif @@ -47,7 +48,14 @@ endif # We always build dex2oat and dependencies, even if the host build is otherwise disabled, since they are used to cross compile for the target. ifeq ($(ART_BUILD_HOST_NDEBUG),true) $(eval $(call build-art-executable,dex2oat,$(DEX2OAT_SRC_FILES),libcutils libart-compiler libsigchain libziparchive-host,art/compiler,host,ndebug,$(dex2oat_host_arch))) + ifeq ($(ART_BUILD_HOST_STATIC),true) + $(eval $(call build-art-executable,dex2oat,$(DEX2OAT_SRC_FILES),libart libart-compiler libart libziparchive-host libnativehelper libnativebridge libsigchain_dummy libvixl liblog libz libbacktrace libcutils libunwindbacktrace libutils libbase,art/compiler,host,ndebug,$(dex2oat_host_arch),static)) + endif endif + ifeq ($(ART_BUILD_HOST_DEBUG),true) $(eval $(call build-art-executable,dex2oat,$(DEX2OAT_SRC_FILES),libcutils libartd-compiler libsigchain libziparchive-host,art/compiler,host,debug,$(dex2oat_host_arch))) + ifeq ($(ART_BUILD_HOST_STATIC),true) + $(eval $(call build-art-executable,dex2oat,$(DEX2OAT_SRC_FILES),libartd libartd-compiler libartd libziparchive-host libnativehelper libnativebridge libsigchain_dummy libvixld liblog libz libbacktrace libcutils libunwindbacktrace libutils libbase,art/compiler,host,debug,$(dex2oat_host_arch),static)) + endif endif diff --git a/runtime/Android.mk b/runtime/Android.mk index 19079cb92..7f103a4a7 100644 --- a/runtime/Android.mk +++ b/runtime/Android.mk @@ -369,6 +369,7 @@ endif # $(1): target or host # $(2): ndebug or debug +# $(3): static or shared (empty means shared, applies only for host) define build-libart ifneq ($(1),target) ifneq ($(1),host) @@ -383,6 +384,7 @@ define build-libart art_target_or_host := $(1) art_ndebug_or_debug := $(2) + art_static_or_shared := $(3) include $$(CLEAR_VARS) # Clang assembler has problem with macros in asm_support_x86.S, http://b/17443165, @@ -403,7 +405,12 @@ define build-libart endif LOCAL_MODULE_TAGS := optional - LOCAL_MODULE_CLASS := SHARED_LIBRARIES + + ifeq ($$(art_static_or_shared),static) + LOCAL_MODULE_CLASS := STATIC_LIBRARIES + else + LOCAL_MODULE_CLASS := SHARED_LIBRARIES + endif ifeq ($$(art_target_or_host),target) LOCAL_SRC_FILES := $$(LIBART_TARGET_SRC_FILES) @@ -431,8 +438,11 @@ $$(ENUM_OPERATOR_OUT_GEN): $$(GENERATED_SRC_DIR)/%_operator_out.cc : $(LOCAL_PAT LOCAL_LDFLAGS := $$(LIBART_LDFLAGS) ifeq ($$(art_target_or_host),target) LOCAL_LDFLAGS += $$(LIBART_TARGET_LDFLAGS) - else + else #host LOCAL_LDFLAGS += $$(LIBART_HOST_LDFLAGS) + ifeq ($$(art_static_or_shared),static) + LOCAL_LDFLAGS += -static + endif endif $$(foreach arch,$$(ART_TARGET_SUPPORTED_ARCH), \ $$(eval LOCAL_LDFLAGS_$$(arch) := $$(LIBART_TARGET_LDFLAGS_$$(arch)))) @@ -467,8 +477,12 @@ $$(ENUM_OPERATOR_OUT_GEN): $$(GENERATED_SRC_DIR)/%_operator_out.cc : $(LOCAL_PAT LOCAL_C_INCLUDES += art/sigchainlib LOCAL_C_INCLUDES += art - LOCAL_SHARED_LIBRARIES := libnativehelper libnativebridge libsigchain - LOCAL_SHARED_LIBRARIES += libbacktrace + ifeq ($$(art_static_or_shared),static) + LOCAL_STATIC_LIBRARIES := libnativehelper libnativebridge libsigchain_dummy libbacktrace + else + LOCAL_SHARED_LIBRARIES := libnativehelper libnativebridge libsigchain libbacktrace + endif + ifeq ($$(art_target_or_host),target) LOCAL_SHARED_LIBRARIES += libdl # ZipArchive support, the order matters here to get all symbols. @@ -478,9 +492,15 @@ $$(ENUM_OPERATOR_OUT_GEN): $$(GENERATED_SRC_DIR)/%_operator_out.cc : $(LOCAL_PAT # For liblog, atrace, properties, ashmem, set_sched_policy and socket_peer_is_trusted. LOCAL_SHARED_LIBRARIES += libcutils else # host - LOCAL_SHARED_LIBRARIES += libziparchive-host libz-host - # For ashmem_create_region. - LOCAL_SHARED_LIBRARIES += libcutils + ifeq ($$(art_static_or_shared),static) + LOCAL_STATIC_LIBRARIES += libziparchive-host libz + # For ashmem_create_region. + LOCAL_STATIC_LIBRARIES += libcutils + else + LOCAL_SHARED_LIBRARIES += libziparchive-host libz-host + # For ashmem_create_region. + LOCAL_SHARED_LIBRARIES += libcutils + endif endif LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common_build.mk LOCAL_ADDITIONAL_DEPENDENCIES += $$(LOCAL_PATH)/Android.mk @@ -499,7 +519,11 @@ $$(ENUM_OPERATOR_OUT_GEN): $$(GENERATED_SRC_DIR)/%_operator_out.cc : $(LOCAL_PAT endif include $$(BUILD_SHARED_LIBRARY) else # host - include $$(BUILD_HOST_SHARED_LIBRARY) + ifeq ($$(art_static_or_shared),static) + include $$(BUILD_HOST_STATIC_LIBRARY) + else + include $$(BUILD_HOST_SHARED_LIBRARY) + endif endif # Clear locally defined variables. @@ -508,15 +532,22 @@ $$(ENUM_OPERATOR_OUT_GEN): $$(GENERATED_SRC_DIR)/%_operator_out.cc : $(LOCAL_PAT ENUM_OPERATOR_OUT_GEN := art_target_or_host := art_ndebug_or_debug := + art_static_or_shared := endef # We always build dex2oat and dependencies, even if the host build is otherwise disabled, since # they are used to cross compile for the target. ifeq ($(ART_BUILD_HOST_NDEBUG),true) $(eval $(call build-libart,host,ndebug)) + ifeq ($(ART_BUILD_HOST_STATIC),true) + $(eval $(call build-libart,host,ndebug,static)) + endif endif ifeq ($(ART_BUILD_HOST_DEBUG),true) $(eval $(call build-libart,host,debug)) + ifeq ($(ART_BUILD_HOST_STATIC),true) + $(eval $(call build-libart,host,debug,static)) + endif endif ifeq ($(ART_BUILD_TARGET_NDEBUG),true) diff --git a/sigchainlib/Android.mk b/sigchainlib/Android.mk index 11f44fec8..b9e37a136 100644 --- a/sigchainlib/Android.mk +++ b/sigchainlib/Android.mk @@ -76,3 +76,19 @@ LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk LOCAL_LDLIBS = -ldl LOCAL_MULTILIB := both include $(BUILD_HOST_STATIC_LIBRARY) + +# Create a dummy version of libsigchain which expose the necessary symbols +# but throws when called. This can be used to get static binaries which don't +# need the real functionality of the sig chain but need to please the linker. +include $(CLEAR_VARS) +LOCAL_CPP_EXTENSION := $(ART_CPP_EXTENSION) +LOCAL_MODULE_TAGS := optional +LOCAL_IS_HOST_MODULE := true +LOCAL_CFLAGS += $(ART_HOST_CFLAGS) +LOCAL_CLANG = $(ART_HOST_CLANG) +LOCAL_SRC_FILES := sigchain_dummy.cc +LOCAL_MODULE:= libsigchain_dummy +LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk +LOCAL_LDLIBS = -ldl +LOCAL_MULTILIB := both +include $(BUILD_HOST_STATIC_LIBRARY) -- 2.11.0