Merge changes I93da03b1,I5fb3ee29
* changes: Use static asan runtime for musl Simplify depending on static sanitizer runtimes
This commit is contained in:
@@ -212,6 +212,14 @@ func AddressSanitizerRuntimeLibrary(t Toolchain) string {
|
|||||||
return LibclangRuntimeLibrary(t, "asan")
|
return LibclangRuntimeLibrary(t, "asan")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AddressSanitizerStaticRuntimeLibrary(t Toolchain) string {
|
||||||
|
return LibclangRuntimeLibrary(t, "asan.static")
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddressSanitizerCXXStaticRuntimeLibrary(t Toolchain) string {
|
||||||
|
return LibclangRuntimeLibrary(t, "asan_cxx.static")
|
||||||
|
}
|
||||||
|
|
||||||
func HWAddressSanitizerRuntimeLibrary(t Toolchain) string {
|
func HWAddressSanitizerRuntimeLibrary(t Toolchain) string {
|
||||||
return LibclangRuntimeLibrary(t, "hwasan")
|
return LibclangRuntimeLibrary(t, "hwasan")
|
||||||
}
|
}
|
||||||
|
117
cc/sanitize.go
117
cc/sanitize.go
@@ -1530,56 +1530,15 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) {
|
|||||||
diagSanitizers = sanitizers
|
diagSanitizers = sanitizers
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine the runtime library required
|
addStaticDeps := func(dep string, hideSymbols bool) {
|
||||||
runtimeLibrary := ""
|
|
||||||
alwaysStaticRuntime := false
|
|
||||||
var extraStaticDeps []string
|
|
||||||
toolchain := c.toolchain(mctx)
|
|
||||||
if Bool(sanProps.Address) {
|
|
||||||
runtimeLibrary = config.AddressSanitizerRuntimeLibrary(toolchain)
|
|
||||||
} else if Bool(sanProps.Hwaddress) {
|
|
||||||
if c.staticBinary() {
|
|
||||||
runtimeLibrary = config.HWAddressSanitizerStaticLibrary(toolchain)
|
|
||||||
extraStaticDeps = []string{"libdl"}
|
|
||||||
} else {
|
|
||||||
runtimeLibrary = config.HWAddressSanitizerRuntimeLibrary(toolchain)
|
|
||||||
}
|
|
||||||
} else if Bool(sanProps.Thread) {
|
|
||||||
runtimeLibrary = config.ThreadSanitizerRuntimeLibrary(toolchain)
|
|
||||||
} else if Bool(sanProps.Scudo) {
|
|
||||||
if len(diagSanitizers) == 0 && !c.sanitize.Properties.UbsanRuntimeDep {
|
|
||||||
runtimeLibrary = config.ScudoMinimalRuntimeLibrary(toolchain)
|
|
||||||
} else {
|
|
||||||
runtimeLibrary = config.ScudoRuntimeLibrary(toolchain)
|
|
||||||
}
|
|
||||||
} else if len(diagSanitizers) > 0 || c.sanitize.Properties.UbsanRuntimeDep ||
|
|
||||||
Bool(sanProps.Fuzzer) ||
|
|
||||||
Bool(sanProps.Undefined) ||
|
|
||||||
Bool(sanProps.All_undefined) {
|
|
||||||
runtimeLibrary = config.UndefinedBehaviorSanitizerRuntimeLibrary(toolchain)
|
|
||||||
if c.staticBinary() || toolchain.Musl() {
|
|
||||||
// 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:
|
|
||||||
// Error relocating ...: initial-exec TLS resolves to dynamic definition
|
|
||||||
runtimeLibrary += ".static"
|
|
||||||
alwaysStaticRuntime = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addStaticDeps := func(deps ...string) {
|
|
||||||
// If we're using snapshots, redirect to snapshot whenever possible
|
// If we're using snapshots, redirect to snapshot whenever possible
|
||||||
snapshot := mctx.Provider(SnapshotInfoProvider).(SnapshotInfo)
|
snapshot := mctx.Provider(SnapshotInfoProvider).(SnapshotInfo)
|
||||||
for idx, dep := range deps {
|
if lib, ok := snapshot.StaticLibs[dep]; ok {
|
||||||
if lib, ok := snapshot.StaticLibs[dep]; ok {
|
dep = lib
|
||||||
deps[idx] = lib
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// static executable gets static runtime libs
|
// static executable gets static runtime libs
|
||||||
depTag := libraryDependencyTag{Kind: staticLibraryDependency, unexportedSymbols: true}
|
depTag := libraryDependencyTag{Kind: staticLibraryDependency, unexportedSymbols: hideSymbols}
|
||||||
variations := append(mctx.Target().Variations(),
|
variations := append(mctx.Target().Variations(),
|
||||||
blueprint.Variation{Mutator: "link", Variation: "static"})
|
blueprint.Variation{Mutator: "link", Variation: "static"})
|
||||||
if c.Device() {
|
if c.Device() {
|
||||||
@@ -1589,17 +1548,60 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) {
|
|||||||
variations = append(variations,
|
variations = append(variations,
|
||||||
blueprint.Variation{Mutator: "sdk", Variation: "sdk"})
|
blueprint.Variation{Mutator: "sdk", Variation: "sdk"})
|
||||||
}
|
}
|
||||||
mctx.AddFarVariationDependencies(variations, depTag, deps...)
|
mctx.AddFarVariationDependencies(variations, depTag, dep)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Determine the runtime library required
|
||||||
|
runtimeSharedLibrary := ""
|
||||||
|
toolchain := c.toolchain(mctx)
|
||||||
|
if Bool(sanProps.Address) {
|
||||||
|
if toolchain.Musl() || (c.staticBinary() && toolchain.Bionic()) {
|
||||||
|
// Use a static runtime for musl to match what clang does for glibc.
|
||||||
|
addStaticDeps(config.AddressSanitizerStaticRuntimeLibrary(toolchain), false)
|
||||||
|
addStaticDeps(config.AddressSanitizerCXXStaticRuntimeLibrary(toolchain), false)
|
||||||
|
} else {
|
||||||
|
runtimeSharedLibrary = config.AddressSanitizerRuntimeLibrary(toolchain)
|
||||||
|
}
|
||||||
|
} else if Bool(sanProps.Hwaddress) {
|
||||||
|
if c.staticBinary() {
|
||||||
|
addStaticDeps(config.HWAddressSanitizerStaticLibrary(toolchain), true)
|
||||||
|
addStaticDeps("libdl", false)
|
||||||
|
} else {
|
||||||
|
runtimeSharedLibrary = config.HWAddressSanitizerRuntimeLibrary(toolchain)
|
||||||
|
}
|
||||||
|
} else if Bool(sanProps.Thread) {
|
||||||
|
runtimeSharedLibrary = config.ThreadSanitizerRuntimeLibrary(toolchain)
|
||||||
|
} else if Bool(sanProps.Scudo) {
|
||||||
|
if len(diagSanitizers) == 0 && !c.sanitize.Properties.UbsanRuntimeDep {
|
||||||
|
runtimeSharedLibrary = config.ScudoMinimalRuntimeLibrary(toolchain)
|
||||||
|
} else {
|
||||||
|
runtimeSharedLibrary = config.ScudoRuntimeLibrary(toolchain)
|
||||||
|
}
|
||||||
|
} else if len(diagSanitizers) > 0 || c.sanitize.Properties.UbsanRuntimeDep ||
|
||||||
|
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:
|
||||||
|
// Error relocating ...: initial-exec TLS resolves to dynamic definition
|
||||||
|
addStaticDeps(config.UndefinedBehaviorSanitizerRuntimeLibrary(toolchain)+".static", true)
|
||||||
|
} else {
|
||||||
|
runtimeSharedLibrary = config.UndefinedBehaviorSanitizerRuntimeLibrary(toolchain)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if enableMinimalRuntime(c.sanitize) || c.sanitize.Properties.MinimalRuntimeDep {
|
if enableMinimalRuntime(c.sanitize) || c.sanitize.Properties.MinimalRuntimeDep {
|
||||||
addStaticDeps(config.UndefinedBehaviorSanitizerMinimalRuntimeLibrary(toolchain))
|
addStaticDeps(config.UndefinedBehaviorSanitizerMinimalRuntimeLibrary(toolchain), true)
|
||||||
}
|
}
|
||||||
if c.sanitize.Properties.BuiltinsDep {
|
if c.sanitize.Properties.BuiltinsDep {
|
||||||
addStaticDeps(config.BuiltinsRuntimeLibrary(toolchain))
|
addStaticDeps(config.BuiltinsRuntimeLibrary(toolchain), true)
|
||||||
}
|
}
|
||||||
|
|
||||||
if runtimeLibrary != "" && (toolchain.Bionic() || toolchain.Musl() || c.sanitize.Properties.UbsanRuntimeDep) {
|
if runtimeSharedLibrary != "" && (toolchain.Bionic() || toolchain.Musl() || c.sanitize.Properties.UbsanRuntimeDep) {
|
||||||
// UBSan is supported on non-bionic linux host builds as well
|
// UBSan is supported on non-bionic linux host builds as well
|
||||||
|
|
||||||
// Adding dependency to the runtime library. We are using *FarVariation*
|
// Adding dependency to the runtime library. We are using *FarVariation*
|
||||||
@@ -1609,14 +1611,17 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) {
|
|||||||
//
|
//
|
||||||
// Note that by adding dependency with {static|shared}DepTag, the lib is
|
// Note that by adding dependency with {static|shared}DepTag, the lib is
|
||||||
// added to libFlags and LOCAL_SHARED_LIBRARIES by cc.Module
|
// added to libFlags and LOCAL_SHARED_LIBRARIES by cc.Module
|
||||||
if c.staticBinary() || alwaysStaticRuntime {
|
if c.staticBinary() {
|
||||||
addStaticDeps(runtimeLibrary)
|
// Most sanitizers are either disabled for static binaries or have already
|
||||||
addStaticDeps(extraStaticDeps...)
|
// handled the static binary case above through a direct call to addStaticDeps.
|
||||||
|
// If not, treat the runtime shared library as a static library and hope for
|
||||||
|
// the best.
|
||||||
|
addStaticDeps(runtimeSharedLibrary, true)
|
||||||
} else if !c.static() && !c.Header() {
|
} else if !c.static() && !c.Header() {
|
||||||
// If we're using snapshots, redirect to snapshot whenever possible
|
// If we're using snapshots, redirect to snapshot whenever possible
|
||||||
snapshot := mctx.Provider(SnapshotInfoProvider).(SnapshotInfo)
|
snapshot := mctx.Provider(SnapshotInfoProvider).(SnapshotInfo)
|
||||||
if lib, ok := snapshot.SharedLibs[runtimeLibrary]; ok {
|
if lib, ok := snapshot.SharedLibs[runtimeSharedLibrary]; ok {
|
||||||
runtimeLibrary = lib
|
runtimeSharedLibrary = lib
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip apex dependency check for sharedLibraryDependency
|
// Skip apex dependency check for sharedLibraryDependency
|
||||||
@@ -1640,7 +1645,7 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) {
|
|||||||
variations = append(variations,
|
variations = append(variations,
|
||||||
blueprint.Variation{Mutator: "sdk", Variation: "sdk"})
|
blueprint.Variation{Mutator: "sdk", Variation: "sdk"})
|
||||||
}
|
}
|
||||||
AddSharedLibDependenciesWithVersions(mctx, c, variations, depTag, runtimeLibrary, "", true)
|
AddSharedLibDependenciesWithVersions(mctx, c, variations, depTag, runtimeSharedLibrary, "", true)
|
||||||
}
|
}
|
||||||
// static lib does not have dependency to the runtime library. The
|
// static lib does not have dependency to the runtime library. The
|
||||||
// dependency will be added to the executables or shared libs using
|
// dependency will be added to the executables or shared libs using
|
||||||
|
@@ -127,6 +127,7 @@ type expectedRuntimeLinkage int
|
|||||||
const (
|
const (
|
||||||
RUNTIME_LINKAGE_NONE = expectedRuntimeLinkage(0)
|
RUNTIME_LINKAGE_NONE = expectedRuntimeLinkage(0)
|
||||||
RUNTIME_LINKAGE_SHARED = iota
|
RUNTIME_LINKAGE_SHARED = iota
|
||||||
|
RUNTIME_LINKAGE_STATIC
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAsan(t *testing.T) {
|
func TestAsan(t *testing.T) {
|
||||||
@@ -245,6 +246,8 @@ func TestAsan(t *testing.T) {
|
|||||||
libStaticAsanNoAsanVariant := result.ModuleForTests("libstatic_asan", staticVariant)
|
libStaticAsanNoAsanVariant := result.ModuleForTests("libstatic_asan", staticVariant)
|
||||||
|
|
||||||
libAsanSharedRuntime := result.ModuleForTests("libclang_rt.asan", sharedVariant)
|
libAsanSharedRuntime := result.ModuleForTests("libclang_rt.asan", sharedVariant)
|
||||||
|
libAsanStaticRuntime := result.ModuleForTests("libclang_rt.asan.static", staticVariant)
|
||||||
|
libAsanStaticCxxRuntime := result.ModuleForTests("libclang_rt.asan_cxx.static", staticVariant)
|
||||||
|
|
||||||
expectSharedLinkDep(t, ctx, binWithAsan, libShared)
|
expectSharedLinkDep(t, ctx, binWithAsan, libShared)
|
||||||
expectSharedLinkDep(t, ctx, binWithAsan, libAsan)
|
expectSharedLinkDep(t, ctx, binWithAsan, libAsan)
|
||||||
@@ -289,12 +292,38 @@ func TestAsan(t *testing.T) {
|
|||||||
expectNoSharedLinkDep(t, ctx, libShared, libAsanSharedRuntime)
|
expectNoSharedLinkDep(t, ctx, libShared, libAsanSharedRuntime)
|
||||||
expectNoSharedLinkDep(t, ctx, libTransitive, libAsanSharedRuntime)
|
expectNoSharedLinkDep(t, ctx, libTransitive, libAsanSharedRuntime)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if runtimeLinkage == RUNTIME_LINKAGE_STATIC {
|
||||||
|
expectStaticLinkDep(t, ctx, binWithAsan, libAsanStaticRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticRuntime)
|
||||||
|
expectStaticLinkDep(t, ctx, libAsan, libAsanStaticRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticRuntime)
|
||||||
|
|
||||||
|
expectStaticLinkDep(t, ctx, binWithAsan, libAsanStaticCxxRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticCxxRuntime)
|
||||||
|
expectStaticLinkDep(t, ctx, libAsan, libAsanStaticCxxRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticCxxRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticCxxRuntime)
|
||||||
|
} else {
|
||||||
|
expectNoStaticLinkDep(t, ctx, binWithAsan, libAsanStaticRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, libAsan, libAsanStaticRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticRuntime)
|
||||||
|
|
||||||
|
expectNoStaticLinkDep(t, ctx, binWithAsan, libAsanStaticCxxRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticCxxRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, libAsan, libAsanStaticCxxRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticCxxRuntime)
|
||||||
|
expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticCxxRuntime)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run("host", func(t *testing.T) { check(t, buildOS, RUNTIME_LINKAGE_NONE, preparer) })
|
t.Run("host", func(t *testing.T) { check(t, buildOS, RUNTIME_LINKAGE_NONE, preparer) })
|
||||||
t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", RUNTIME_LINKAGE_SHARED, preparer) })
|
t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", RUNTIME_LINKAGE_SHARED, preparer) })
|
||||||
t.Run("host musl", func(t *testing.T) {
|
t.Run("host musl", func(t *testing.T) {
|
||||||
check(t, "linux_musl_x86_64", RUNTIME_LINKAGE_SHARED,
|
check(t, "linux_musl_x86_64", RUNTIME_LINKAGE_STATIC,
|
||||||
android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
|
android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user