Add prebuilt ELF binaries checker
This commit introduces a prebuilt ELF binaries checker. The checker will check: 1. Whether all DT_NEEDED shared libraries are specified in `shared_libs` (Android.bp) or `LOCAL_SHARED_LIBRARIES` (Android.mk). 2. Whether all undefined symbols in the prebuilt binary can be resolved to defined symbols exported by its dependencies. This ensures that prebuilt binaries won't silently become ABI incompatible. To check the prebuilt binaries, all of the dependencies must be specified in `shared_libs` (Android.bp) or `LOCAL_SHARED_LIBRARIES` (Android.mk). If your prebuilt binaries cannot be checked for some reason, you may add the following property to Android.bp: check_elf_files: false, Or, add the following setting to Android.mk: LOCAL_CHECK_ELF_FILES := false Bug: 119084334 Test: CHECK_ELF_FILES=true make check-elf-files Change-Id: I523d3083f22fd4053c096d26f61f8375800281c8
This commit is contained in:
37
core/main.mk
37
core/main.mk
@@ -786,9 +786,43 @@ ifdef HOST_CROSS_OS
|
||||
$(call resolve-shared-libs-depes,HOST_CROSS_,,true)
|
||||
endif
|
||||
|
||||
# Pass the shared libraries dependencies to prebuilt ELF file check.
|
||||
define add-elf-file-check-shared-lib
|
||||
$(1): PRIVATE_SHARED_LIBRARY_FILES += $(2)
|
||||
$(1): $(2)
|
||||
endef
|
||||
|
||||
define resolve-shared-libs-for-elf-file-check
|
||||
$(foreach m,$($(if $(2),$($(1)2ND_ARCH_VAR_PREFIX))$(1)DEPENDENCIES_ON_SHARED_LIBRARIES),\
|
||||
$(eval p := $(subst :,$(space),$(m)))\
|
||||
$(eval mod := $(firstword $(p)))\
|
||||
\
|
||||
$(eval deps := $(subst $(comma),$(space),$(lastword $(p))))\
|
||||
$(if $(2),$(eval deps := $(addsuffix $($(1)2ND_ARCH_MODULE_SUFFIX),$(deps))))\
|
||||
$(eval root := $(1)OUT$(if $(call streq,$(1),TARGET_),_ROOT))\
|
||||
$(eval deps := $(filter $($(root))/%$($(1)SHLIB_SUFFIX),$(call module-built-files,$(deps))))\
|
||||
\
|
||||
$(eval r := $(firstword $(filter \
|
||||
$($(if $(2),$($(1)2ND_ARCH_VAR_PREFIX))TARGET_OUT_INTERMEDIATES)/EXECUTABLES/%\
|
||||
$($(if $(2),$($(1)2ND_ARCH_VAR_PREFIX))TARGET_OUT_INTERMEDIATES)/NATIVE_TESTS/%\
|
||||
$($(if $(2),$($(1)2ND_ARCH_VAR_PREFIX))TARGET_OUT_INTERMEDIATES)/SHARED_LIBRARIES/%,\
|
||||
$(call module-built-files,$(mod)))))\
|
||||
\
|
||||
$(if $(r),\
|
||||
$(eval stamp := $(dir $(r))check_elf_files.timestamp)\
|
||||
$(eval $(call add-elf-file-check-shared-lib,$(stamp),$(deps)))\
|
||||
))
|
||||
endef
|
||||
|
||||
$(call resolve-shared-libs-for-elf-file-check,TARGET_)
|
||||
ifdef TARGET_2ND_ARCH
|
||||
$(call resolve-shared-libs-for-elf-file-check,TARGET_,true)
|
||||
endif
|
||||
|
||||
m :=
|
||||
r :=
|
||||
p :=
|
||||
stamp :=
|
||||
deps :=
|
||||
add-required-deps :=
|
||||
|
||||
@@ -1529,6 +1563,9 @@ findbugs: $(INTERNAL_FINDBUGS_HTML_TARGET) $(INTERNAL_FINDBUGS_XML_TARGET)
|
||||
.PHONY: findlsdumps
|
||||
findlsdumps: $(FIND_LSDUMPS_FILE)
|
||||
|
||||
.PHONY: check-elf-files
|
||||
check-elf-files:
|
||||
|
||||
#xxx scrape this from ALL_MODULE_NAME_TAGS
|
||||
.PHONY: modules
|
||||
modules:
|
||||
|
Reference in New Issue
Block a user