From 234b01de96a439e44bd993ac3824f435dcfddc42 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Mon, 7 Feb 2022 13:49:03 -0800 Subject: [PATCH] Use -fno-sanitize-link-runtime for bionic sanitizers Currently when using sanitizers and building for the device the -fsanitize= argument is not passed to the linker so that the linker won't add the runtimes, which have already been added as explicit dependencies. Pass -fno-sanitize-link-runtime instead in case the linker has other behaviors when passed -fsanitize= besides adding the runtimes. Also check for bionic instead of host so that linux bionic gets the same linker behavior as bionic for the device. Test: m USE_HOST_MUSL=true host-native Test: m checkbuild Change-Id: I0f2966e2fd4ae8adc5cb21eb116c349bcc0c668f --- cc/sanitize.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/cc/sanitize.go b/cc/sanitize.go index 6c6882217..b8e1468e4 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -705,19 +705,22 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags { if len(sanitize.Properties.Sanitizers) > 0 { sanitizeArg := "-fsanitize=" + strings.Join(sanitize.Properties.Sanitizers, ",") - flags.Local.CFlags = append(flags.Local.CFlags, sanitizeArg) flags.Local.AsFlags = append(flags.Local.AsFlags, sanitizeArg) - if ctx.Host() { + flags.Local.LdFlags = append(flags.Local.LdFlags, sanitizeArg) + + if ctx.toolchain().Bionic() { + // Bionic sanitizer runtimes have already been added as dependencies so that + // the right variant of the runtime will be used (with the "-android" + // suffix), so don't let clang the runtime library. + flags.Local.LdFlags = append(flags.Local.LdFlags, "-fno-sanitize-link-runtime") + } else { // Host sanitizers only link symbols in the final executable, so // there will always be undefined symbols in intermediate libraries. _, flags.Global.LdFlags = removeFromList("-Wl,--no-undefined", flags.Global.LdFlags) - flags.Local.LdFlags = append(flags.Local.LdFlags, sanitizeArg) - // non-Bionic toolchain prebuilts are missing UBSan's vptr and function sanitizers - if !ctx.toolchain().Bionic() { - flags.Local.CFlags = append(flags.Local.CFlags, "-fno-sanitize=vptr,function") - } + // non-Bionic toolchain prebuilts are missing UBSan's vptr and function san + flags.Local.CFlags = append(flags.Local.CFlags, "-fno-sanitize=vptr,function") } if enableMinimalRuntime(sanitize) {