Merge "Fix adding manual ubsan runtime to static glibc binaries" into main

This commit is contained in:
Colin Cross 2023-08-24 17:11:47 +00:00 committed by Gerrit Code Review
commit 55e775f94f
2 changed files with 33 additions and 6 deletions

View file

@ -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 {

View file

@ -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,
@ -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,
@ -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)
@ -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"], " "),
@ -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) })