diff --git a/apex/allowed_deps.txt b/apex/allowed_deps.txt index 57b18de15..f59408ed7 100644 --- a/apex/allowed_deps.txt +++ b/apex/allowed_deps.txt @@ -564,6 +564,7 @@ prebuilt_libclang_rt.builtins-aarch64-android(minSdkVersion:(no version)) prebuilt_libclang_rt.builtins-arm-android(minSdkVersion:(no version)) prebuilt_libclang_rt.builtins-i686-android(minSdkVersion:(no version)) prebuilt_libclang_rt.builtins-x86_64-android(minSdkVersion:(no version)) +prebuilt_libunwind(minSdkVersion:(no version)) prebuilt_test_framework-sdkextensions(minSdkVersion:(no version)) server_configurable_flags(minSdkVersion:29) service-permission(minSdkVersion:current) diff --git a/apex/apex.go b/apex/apex.go index 5cd18ed28..bff77936a 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -2854,7 +2854,7 @@ func makeApexAvailableBaseline() map[string][]string { "libprofile-clang-extras_ndk", "libprofile-extras", "libprofile-extras_ndk", - "libunwind_llvm", + "libunwind", } return m } diff --git a/apex/apex_test.go b/apex/apex_test.go index fc746724a..ddbbe38a6 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -1751,10 +1751,10 @@ func TestQTargetApexUsesStaticUnwinder(t *testing.T) { // ensure apex variant of c++ is linked with static unwinder cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module) - ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped") + ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind") // note that platform variant is not. cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module) - ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped") + ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind") } func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) { diff --git a/cc/config/global.go b/cc/config/global.go index fa8e0fba2..89ae69abb 100644 --- a/cc/config/global.go +++ b/cc/config/global.go @@ -90,9 +90,12 @@ var ( "-Wl,--warn-shared-textrel", "-Wl,--fatal-warnings", "-Wl,--no-undefined-version", + // TODO: Eventually we should link against a libunwind.a with hidden symbols, and then these + // --exclude-libs arguments can be removed. "-Wl,--exclude-libs,libgcc.a", "-Wl,--exclude-libs,libgcc_stripped.a", "-Wl,--exclude-libs,libunwind_llvm.a", + "-Wl,--exclude-libs,libunwind.a", } deviceGlobalLldflags = append(ClangFilterUnknownLldflags(deviceGlobalLdflags), diff --git a/cc/stl.go b/cc/stl.go index 406fa3a3e..75fab1702 100644 --- a/cc/stl.go +++ b/cc/stl.go @@ -140,11 +140,7 @@ func needsLibAndroidSupport(ctx BaseModuleContext) bool { } func staticUnwinder(ctx android.BaseModuleContext) string { - if ctx.Arch().ArchType == android.Arm { - return "libunwind_llvm" - } else { - return "libgcc_stripped" - } + return "libunwind" } func (stl *stl) deps(ctx BaseModuleContext, deps Deps) Deps { @@ -192,6 +188,7 @@ func (stl *stl) deps(ctx BaseModuleContext, deps Deps) Deps { if needsLibAndroidSupport(ctx) { deps.StaticLibs = append(deps.StaticLibs, "ndk_libandroid_support") } + // TODO: Switch the NDK over to the LLVM unwinder for non-arm32 architectures. if ctx.Arch().ArchType == android.Arm { deps.StaticLibs = append(deps.StaticLibs, "ndk_libunwind") } else { @@ -231,10 +228,6 @@ func (stl *stl) flags(ctx ModuleContext, flags Flags) Flags { // Use Win32 threads in libc++. "-D_LIBCPP_HAS_THREAD_API_WIN32") } - } else { - if ctx.Arch().ArchType == android.Arm { - flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,--exclude-libs,libunwind_llvm.a") - } } case "libstdc++": // Nothing diff --git a/cc/testing.go b/cc/testing.go index 903f76c4a..dc9a59d0b 100644 --- a/cc/testing.go +++ b/cc/testing.go @@ -109,6 +109,16 @@ func GatherRequiredDepsForTest(oses ...android.OsType) string { src: "", } + toolchain_library { + name: "libunwind", + defaults: ["linux_bionic_supported"], + vendor_available: true, + product_available: true, + recovery_available: true, + native_bridge_supported: true, + src: "", + } + toolchain_library { name: "libclang_rt.fuzzer-arm-android", vendor_available: true,