From 3adbcb31ea78b673060522b6d59674c4e5ab84b9 Mon Sep 17 00:00:00 2001 From: Mitch Phillips Date: Thu, 17 Oct 2019 19:24:46 -0700 Subject: [PATCH] Make backend for shared library fuzzing. Additional context (for Googlers): go/android-fuzzing-shared This patch adds the Make support for automatically installing sanitized dependent shared libraries. 'make $module' will find all the shared library dependencies in soong, and create the rules to install them. We simply need to add the rule that's made by Soong as a dependency of the module's phony. We also now change 'm fuzz' to not just build the fuzz packages, but to build all fuzz targets into the respective $ANDROID_PRODUCT_OUT/data/fuzz and $ANDROID_HOST_OUT/fuzz directories. Bug: N/A Test: Build fuzz target with shared libs, note the contents of $ANDROID_PRODUCT_OUT/data/fuzz/lib and out/soong/fuzz-target-*.zip now has shared libraries. Change-Id: I74def02fee663ef788ee25ec0d5106faf474c2a6 --- core/Makefile | 15 ++++++++++++++- core/clear_vars.mk | 1 + core/soong_cc_prebuilt.mk | 6 ++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index 4798df0f3..04bd9b59b 100644 --- a/core/Makefile +++ b/core/Makefile @@ -5107,6 +5107,19 @@ ifneq ($(sdk_repo_goal),) include $(TOPDIR)development/build/tools/sdk_repo.mk endif +# ----------------------------------------------------------------- +# Soong generates the list of all shared libraries that are depended on by fuzz +# targets. It saves this list as a source:destination pair to +# FUZZ_TARGET_SHARED_DEPS_INSTALL_PAIRS, where the source is the path to the +# build of the unstripped shared library, and the destination is the +# /data/fuzz/$ARCH/lib (for device) or /fuzz/$ARCH/lib (for host) directory +# where fuzz target shared libraries are to be "reinstalled". The +# copy-many-files below generates the rules to copy the unstripped shared +# libraries to the device or host "reinstallation" directory. These rules are +# depended on by each module in soong_cc_prebuilt.mk, where the module will have +# a dependency on each shared library that it needs to be "reinstalled". +FUZZ_SHARED_DEPS := $(call copy-many-files,$(strip $(FUZZ_TARGET_SHARED_DEPS_INSTALL_PAIRS))) + # ----------------------------------------------------------------- # The rule to build all fuzz targets, and package them. # Note: The packages are created in Soong, and in a perfect world, @@ -5118,5 +5131,5 @@ endif # directory`, because kati will see 'fuzz' as being a file, not a # phony target. .PHONY: fuzz -fuzz: $(SOONG_FUZZ_PACKAGING_ARCH_MODULES) +fuzz: $(SOONG_FUZZ_PACKAGING_ARCH_MODULES) $(ALL_FUZZ_TARGETS) $(call dist-for-goals,fuzz,$(SOONG_FUZZ_PACKAGING_ARCH_MODULES)) diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 4818c0117..9ff978bee 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -106,6 +106,7 @@ LOCAL_FULL_LIBS_MANIFEST_FILES:= LOCAL_FULL_MANIFEST_FILE:= LOCAL_FULL_TEST_CONFIG:= LOCAL_FUZZ_ENGINE:= +LOCAL_FUZZ_INSTALLED_SHARED_DEPS:= LOCAL_GCNO_FILES:= LOCAL_GENERATED_SOURCES:= # Group static libraries with "-Wl,--start-group" and "-Wl,--end-group" when linking. diff --git a/core/soong_cc_prebuilt.mk b/core/soong_cc_prebuilt.mk index 20950ca21..2d5089d0e 100644 --- a/core/soong_cc_prebuilt.mk +++ b/core/soong_cc_prebuilt.mk @@ -220,3 +220,9 @@ installed_static_library_notice_file_targets := \ $(notice_target): | $(installed_static_library_notice_file_targets) $(LOCAL_INSTALLED_MODULE): | $(notice_target) + +# Reinstall shared library dependencies of fuzz targets to /data/fuzz/ (for +# target) or /data/ (for host). +ifdef LOCAL_IS_FUZZ_TARGET +$(LOCAL_INSTALLED_MODULE): $(LOCAL_FUZZ_INSTALLED_SHARED_DEPS) +endif