From a98aab98c45aa7245cd235b8822de35aa6eb4fd6 Mon Sep 17 00:00:00 2001 From: Hang Lu Date: Fri, 17 Mar 2023 13:17:22 +0800 Subject: [PATCH] Enable HWASan for multiple modules in one place(Soong) Environment variables HWASAN_INCLUDE_PATHS and PRODUCT_HWASAN_INCLUDE_PATHS can be used to enable HWASan for multiple modules, by just adding the module directory to the env variable. Bug: b/271948407 Test: Set specific module directory to above env variable and check the assembly codes of output elf files after building, finding hwasan related symbols inside. Change-Id: Ic49b515830c4469ca5fa94f547b26c0fb602fc54 --- android/config.go | 7 +++++++ android/variable.go | 2 ++ cc/sanitize.go | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/android/config.go b/android/config.go index 032172d6e..f52a48fe8 100644 --- a/android/config.go +++ b/android/config.go @@ -1557,6 +1557,13 @@ func (c *config) MemtagHeapSyncEnabledForPath(path string) bool { return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path) } +func (c *config) HWASanEnabledForPath(path string) bool { + if len(c.productVariables.HWASanIncludePaths) == 0 { + return false + } + return HasAnyPrefix(path, c.productVariables.HWASanIncludePaths) +} + func (c *config) VendorConfig(name string) VendorConfig { return soongconfig.Config(c.productVariables.VendorVars[name]) } diff --git a/android/variable.go b/android/variable.go index 249d53b07..0b3111beb 100644 --- a/android/variable.go +++ b/android/variable.go @@ -306,6 +306,8 @@ type productVariables struct { MemtagHeapAsyncIncludePaths []string `json:",omitempty"` MemtagHeapSyncIncludePaths []string `json:",omitempty"` + HWASanIncludePaths []string `json:",omitempty"` + VendorPath *string `json:",omitempty"` OdmPath *string `json:",omitempty"` ProductPath *string `json:",omitempty"` diff --git a/cc/sanitize.go b/cc/sanitize.go index 45d7fab4f..7fddc1b83 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -593,6 +593,12 @@ func (sanitize *sanitize) begin(ctx BaseModuleContext) { } } + // Enable HWASan for all components in the include paths (for Aarch64 only) + if s.Hwaddress == nil && ctx.Config().HWASanEnabledForPath(ctx.ModuleDir()) && + ctx.Arch().ArchType == android.Arm64 && ctx.toolchain().Bionic() { + s.Hwaddress = proptools.BoolPtr(true) + } + // Enable CFI for non-host components in the include paths if s.Cfi == nil && ctx.Config().CFIEnabledForPath(ctx.ModuleDir()) && !ctx.Host() { s.Cfi = proptools.BoolPtr(true)