diff --git a/cc/config/arm64_device.go b/cc/config/arm64_device.go index 9d425c124..124b12469 100644 --- a/cc/config/arm64_device.go +++ b/cc/config/arm64_device.go @@ -184,8 +184,8 @@ func (t *toolchainArm64) ToolchainClangCflags() string { return t.toolchainClangCflags } -func (toolchainArm64) AddressSanitizerRuntimeLibrary() string { - return "libclang_rt.asan-aarch64-android.so" +func (toolchainArm64) SanitizerRuntimeLibraryArch() string { + return "aarch64" } func arm64ToolchainFactory(arch android.Arch) Toolchain { diff --git a/cc/config/arm_device.go b/cc/config/arm_device.go index f15d8dae6..85a891a46 100644 --- a/cc/config/arm_device.go +++ b/cc/config/arm_device.go @@ -336,8 +336,8 @@ func (t *toolchainArm) ClangInstructionSetFlags(isa string) (string, error) { } } -func (toolchainArm) AddressSanitizerRuntimeLibrary() string { - return "libclang_rt.asan-arm-android.so" +func (toolchainArm) SanitizerRuntimeLibraryArch() string { + return "arm" } func armToolchainFactory(arch android.Arch) Toolchain { diff --git a/cc/config/mips64_device.go b/cc/config/mips64_device.go index f6132dcff..e414c7e18 100644 --- a/cc/config/mips64_device.go +++ b/cc/config/mips64_device.go @@ -177,8 +177,8 @@ func (t *toolchainMips64) ClangLdflags() string { return "${config.Mips64ClangLdflags}" } -func (toolchainMips64) AddressSanitizerRuntimeLibrary() string { - return "libclang_rt.asan-mips64-android.so" +func (toolchainMips64) SanitizerRuntimeLibraryArch() string { + return "mips64" } func mips64ToolchainFactory(arch android.Arch) Toolchain { diff --git a/cc/config/mips_device.go b/cc/config/mips_device.go index 3c77a48c5..e0ae3c78b 100644 --- a/cc/config/mips_device.go +++ b/cc/config/mips_device.go @@ -226,8 +226,8 @@ func (t *toolchainMips) ClangLdflags() string { return "${config.MipsClangLdflags}" } -func (toolchainMips) AddressSanitizerRuntimeLibrary() string { - return "libclang_rt.asan-mips-android.so" +func (toolchainMips) SanitizerRuntimeLibraryArch() string { + return "mips" } func mipsToolchainFactory(arch android.Arch) Toolchain { diff --git a/cc/config/toolchain.go b/cc/config/toolchain.go index c286a9aa7..5a4e0325c 100644 --- a/cc/config/toolchain.go +++ b/cc/config/toolchain.go @@ -71,7 +71,7 @@ type Toolchain interface { ShlibSuffix() string ExecutableSuffix() string - AddressSanitizerRuntimeLibrary() string + SanitizerRuntimeLibraryArch() string AvailableLibraries() []string } @@ -125,7 +125,7 @@ func (toolchainBase) ClangAsflags() string { return "" } -func (toolchainBase) AddressSanitizerRuntimeLibrary() string { +func (toolchainBase) SanitizerRuntimeLibraryArch() string { return "" } @@ -188,3 +188,19 @@ func indexList(s string, list []string) int { func inList(s string, list []string) bool { return indexList(s, list) != -1 } + +func AddressSanitizerRuntimeLibrary(t Toolchain) string { + arch := t.SanitizerRuntimeLibraryArch() + if arch == "" { + return "" + } + return "libclang_rt.asan-" + arch + "-android.so" +} + +func UndefinedBehaviorSanitizerRuntimeLibrary(t Toolchain) string { + arch := t.SanitizerRuntimeLibraryArch() + if arch == "" { + return "" + } + return "libclang_rt.ubsan_standalone-" + arch + "-android.so" +} diff --git a/cc/config/x86_64_device.go b/cc/config/x86_64_device.go index ec02bedd6..23c976ac0 100644 --- a/cc/config/x86_64_device.go +++ b/cc/config/x86_64_device.go @@ -232,6 +232,10 @@ func (t *toolchainX86_64) ClangLdflags() string { return "${config.X86_64Ldflags}" } +func (toolchainX86_64) SanitizerRuntimeLibraryArch() string { + return "x86_64" +} + func x86_64ToolchainFactory(arch android.Arch) Toolchain { toolchainCflags := []string{ "${config.X86_64ToolchainCflags}", diff --git a/cc/config/x86_device.go b/cc/config/x86_device.go index 032b1f0c4..4667caa9d 100644 --- a/cc/config/x86_device.go +++ b/cc/config/x86_device.go @@ -251,8 +251,8 @@ func (t *toolchainX86) ClangLdflags() string { return "${config.X86Ldflags}" } -func (toolchainX86) AddressSanitizerRuntimeLibrary() string { - return "libclang_rt.asan-i686-android.so" +func (toolchainX86) SanitizerRuntimeLibraryArch() string { + return "i686" } func x86ToolchainFactory(arch android.Arch) Toolchain { diff --git a/cc/makevars.go b/cc/makevars.go index 56698f2f4..23814c3cb 100644 --- a/cc/makevars.go +++ b/cc/makevars.go @@ -172,7 +172,8 @@ func makeVarsToolchain(ctx android.MakeVarsContext, secondPrefix string, }, " ")) if target.Os.Class == android.Device { - ctx.Strict(secondPrefix+"ADDRESS_SANITIZER_RUNTIME_LIBRARY", strings.TrimSuffix(toolchain.AddressSanitizerRuntimeLibrary(), ".so")) + ctx.Strict(secondPrefix+"ADDRESS_SANITIZER_RUNTIME_LIBRARY", strings.TrimSuffix(config.AddressSanitizerRuntimeLibrary(toolchain), ".so")) + ctx.Strict(secondPrefix+"UBSAN_RUNTIME_LIBRARY", strings.TrimSuffix(config.UndefinedBehaviorSanitizerRuntimeLibrary(toolchain), ".so")) } // This is used by external/gentoo/... diff --git a/cc/sanitize.go b/cc/sanitize.go index b79e0c742..8023933c1 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -21,6 +21,7 @@ import ( "github.com/google/blueprint" "android/soong/android" + "android/soong/cc/config" ) type sanitizerType int @@ -239,7 +240,7 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags { flags.LdFlags = append(flags.LdFlags, "-Wl,-u,__asan_preinit") // ASan runtime library must be the first in the link order. - runtimeLibrary := ctx.toolchain().AddressSanitizerRuntimeLibrary() + runtimeLibrary := config.AddressSanitizerRuntimeLibrary(ctx.toolchain()) if runtimeLibrary != "" { flags.libFlags = append([]string{"${config.ClangAsanLibDir}/" + runtimeLibrary}, flags.libFlags...) }