Loading cc/sanitize.go +6 −6 Original line number Diff line number Diff line Loading @@ -1650,12 +1650,12 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { Bool(sanProps.Fuzzer) || Bool(sanProps.Undefined) || Bool(sanProps.All_undefined) { if toolchain.Musl() || (c.staticBinary() && toolchain.Bionic()) { // Use a static runtime for static binaries. // Also use a static runtime for musl to match // what clang does for glibc. Otherwise dlopening // libraries that depend on libclang_rt.ubsan_standalone.so // fails with: if toolchain.Musl() || c.staticBinary() { // Use a static runtime for static binaries. For sanitized glibc binaries the runtime is // added automatically by clang, but for static glibc binaries that are not sanitized but // have a sanitized dependency the runtime needs to be added manually. // Also manually add a static runtime for musl to match what clang does for glibc. // Otherwise dlopening libraries that depend on libclang_rt.ubsan_standalone.so fails with: // Error relocating ...: initial-exec TLS resolves to dynamic definition addStaticDeps(config.UndefinedBehaviorSanitizerRuntimeLibrary(toolchain)+".static", true) } else { Loading cc/sanitize_test.go +27 −0 Original line number Diff line number Diff line Loading @@ -714,6 +714,15 @@ func TestUbsan(t *testing.T) { ], } cc_binary { name: "static_bin_with_ubsan_dep", static_executable: true, host_supported: true, static_libs: [ "libubsan_diag", ], } cc_library_shared { name: "libshared", host_supported: true, Loading Loading @@ -741,6 +750,17 @@ func TestUbsan(t *testing.T) { } } cc_library_static { name: "libubsan_diag", host_supported: true, sanitize: { undefined: true, diag: { undefined: true, }, }, } cc_library_static { name: "libstatic", host_supported: true, Loading @@ -763,6 +783,7 @@ func TestUbsan(t *testing.T) { sharedVariant := variant + "_shared" minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant) standaloneRuntime := result.ModuleForTests("libclang_rt.ubsan_standalone.static", staticVariant) // The binaries, one with ubsan and one without binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant) Loading @@ -770,6 +791,7 @@ func TestUbsan(t *testing.T) { libSharedUbsan := result.ModuleForTests("libsharedubsan", sharedVariant) binDependsUbsanShared := result.ModuleForTests("bin_depends_ubsan_shared", variant) binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant) staticBin := result.ModuleForTests("static_bin_with_ubsan_dep", variant) android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs", strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "), Loading Loading @@ -810,6 +832,11 @@ func TestUbsan(t *testing.T) { android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_no_ubsan static libs", strings.Split(binNoUbsan.Rule("ld").Args["ldFlags"], " "), "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base()) android.AssertStringListContains(t, "missing libclang_rt.ubsan_standalone.static in static_bin_with_ubsan_dep static libs", strings.Split(staticBin.Rule("ld").Args["libFlags"], " "), standaloneRuntime.OutputFiles(t, "")[0].String()) } t.Run("host", func(t *testing.T) { check(t, buildOS, preparer) }) Loading Loading
cc/sanitize.go +6 −6 Original line number Diff line number Diff line Loading @@ -1650,12 +1650,12 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { Bool(sanProps.Fuzzer) || Bool(sanProps.Undefined) || Bool(sanProps.All_undefined) { if toolchain.Musl() || (c.staticBinary() && toolchain.Bionic()) { // Use a static runtime for static binaries. // Also use a static runtime for musl to match // what clang does for glibc. Otherwise dlopening // libraries that depend on libclang_rt.ubsan_standalone.so // fails with: if toolchain.Musl() || c.staticBinary() { // Use a static runtime for static binaries. For sanitized glibc binaries the runtime is // added automatically by clang, but for static glibc binaries that are not sanitized but // have a sanitized dependency the runtime needs to be added manually. // Also manually add a static runtime for musl to match what clang does for glibc. // Otherwise dlopening libraries that depend on libclang_rt.ubsan_standalone.so fails with: // Error relocating ...: initial-exec TLS resolves to dynamic definition addStaticDeps(config.UndefinedBehaviorSanitizerRuntimeLibrary(toolchain)+".static", true) } else { Loading
cc/sanitize_test.go +27 −0 Original line number Diff line number Diff line Loading @@ -714,6 +714,15 @@ func TestUbsan(t *testing.T) { ], } cc_binary { name: "static_bin_with_ubsan_dep", static_executable: true, host_supported: true, static_libs: [ "libubsan_diag", ], } cc_library_shared { name: "libshared", host_supported: true, Loading Loading @@ -741,6 +750,17 @@ func TestUbsan(t *testing.T) { } } cc_library_static { name: "libubsan_diag", host_supported: true, sanitize: { undefined: true, diag: { undefined: true, }, }, } cc_library_static { name: "libstatic", host_supported: true, Loading @@ -763,6 +783,7 @@ func TestUbsan(t *testing.T) { sharedVariant := variant + "_shared" minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant) standaloneRuntime := result.ModuleForTests("libclang_rt.ubsan_standalone.static", staticVariant) // The binaries, one with ubsan and one without binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant) Loading @@ -770,6 +791,7 @@ func TestUbsan(t *testing.T) { libSharedUbsan := result.ModuleForTests("libsharedubsan", sharedVariant) binDependsUbsanShared := result.ModuleForTests("bin_depends_ubsan_shared", variant) binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant) staticBin := result.ModuleForTests("static_bin_with_ubsan_dep", variant) android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs", strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "), Loading Loading @@ -810,6 +832,11 @@ func TestUbsan(t *testing.T) { android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_no_ubsan static libs", strings.Split(binNoUbsan.Rule("ld").Args["ldFlags"], " "), "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base()) android.AssertStringListContains(t, "missing libclang_rt.ubsan_standalone.static in static_bin_with_ubsan_dep static libs", strings.Split(staticBin.Rule("ld").Args["libFlags"], " "), standaloneRuntime.OutputFiles(t, "")[0].String()) } t.Run("host", func(t *testing.T) { check(t, buildOS, preparer) }) Loading