danalbert created this revision. danalbert added a reviewer: srhines. danalbert added a project: clang. danalbert requested review of this revision.
The unwinder used by the crash handler on versions of Android prior to API 29 did not correctly handle binaries built with rosegment, which is enabled by default for LLD. Android only supports LLD, so it's not an issue that this flag is not accepted by other linkers. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D95166 Files: clang/lib/Driver/ToolChains/Linux.cpp clang/test/Driver/linux-ld.c Index: clang/test/Driver/linux-ld.c =================================================================== --- clang/test/Driver/linux-ld.c +++ clang/test/Driver/linux-ld.c @@ -1089,6 +1089,20 @@ // CHECK-ANDROID-HASH-STYLE-M: "{{.*}}ld{{(.exe)?}}" // CHECK-ANDROID-HASH-STYLE-M: "--hash-style=gnu" +// Check that we pass --no-rosegment for pre-29 Android versions and do not for +// 29+. +// RUN: %clang %s -### -o %t.o 2>&1 \ +// RUN: --target=armv7-linux-android28 \ +// RUN: | FileCheck --check-prefix=CHECK-ANDROID-ROSEGMENT-28 %s +// CHECK-ANDROID-ROSEGMENT-28: "{{.*}}ld{{(.exe)?}}" +// CHECK-ANDROID-ROSEGMENT-28: "--no-rosegment" +// +// RUN: %clang %s -### -o %t.o 2>&1 \ +// RUN: --target=armv7-linux-android29 \ +// RUN: | FileCheck --check-prefix=CHECK-ANDROID-ROSEGMENT-29 %s +// CHECK-ANDROID-ROSEGMENT-29: "{{.*}}ld{{(.exe)?}}" +// CHECK-ANDROID-ROSEGMENT-29-NOT: "--no-rosegment" + // RUN: %clang %s -### -o %t.o 2>&1 \ // RUN: --target=armv7-linux-android21 \ // RUN: | FileCheck --check-prefix=CHECK-ANDROID-NOEXECSTACK %s Index: clang/lib/Driver/ToolChains/Linux.cpp =================================================================== --- clang/lib/Driver/ToolChains/Linux.cpp +++ clang/lib/Driver/ToolChains/Linux.cpp @@ -236,6 +236,15 @@ ExtraOpts.push_back("relro"); } + if (Triple.isAndroid() && Triple.isAndroidVersionLT(29)) { + // https://github.com/android/ndk/issues/1196 + // The unwinder used by the crash handler on versions of Android prior to + // API 29 did not correctly handle binaries built with rosegment, which is + // enabled by default for LLD. Android only supports LLD, so it's not an + // issue that this flag is not accepted by other linkers. + ExtraOpts.push_back("--no-rosegment"); + } + // Android ARM/AArch64 use max-page-size=4096 to reduce VMA usage. Note, lld // from 11 onwards default max-page-size to 65536 for both ARM and AArch64. if ((Triple.isARM() || Triple.isAArch64()) && Triple.isAndroid()) {
Index: clang/test/Driver/linux-ld.c =================================================================== --- clang/test/Driver/linux-ld.c +++ clang/test/Driver/linux-ld.c @@ -1089,6 +1089,20 @@ // CHECK-ANDROID-HASH-STYLE-M: "{{.*}}ld{{(.exe)?}}" // CHECK-ANDROID-HASH-STYLE-M: "--hash-style=gnu" +// Check that we pass --no-rosegment for pre-29 Android versions and do not for +// 29+. +// RUN: %clang %s -### -o %t.o 2>&1 \ +// RUN: --target=armv7-linux-android28 \ +// RUN: | FileCheck --check-prefix=CHECK-ANDROID-ROSEGMENT-28 %s +// CHECK-ANDROID-ROSEGMENT-28: "{{.*}}ld{{(.exe)?}}" +// CHECK-ANDROID-ROSEGMENT-28: "--no-rosegment" +// +// RUN: %clang %s -### -o %t.o 2>&1 \ +// RUN: --target=armv7-linux-android29 \ +// RUN: | FileCheck --check-prefix=CHECK-ANDROID-ROSEGMENT-29 %s +// CHECK-ANDROID-ROSEGMENT-29: "{{.*}}ld{{(.exe)?}}" +// CHECK-ANDROID-ROSEGMENT-29-NOT: "--no-rosegment" + // RUN: %clang %s -### -o %t.o 2>&1 \ // RUN: --target=armv7-linux-android21 \ // RUN: | FileCheck --check-prefix=CHECK-ANDROID-NOEXECSTACK %s Index: clang/lib/Driver/ToolChains/Linux.cpp =================================================================== --- clang/lib/Driver/ToolChains/Linux.cpp +++ clang/lib/Driver/ToolChains/Linux.cpp @@ -236,6 +236,15 @@ ExtraOpts.push_back("relro"); } + if (Triple.isAndroid() && Triple.isAndroidVersionLT(29)) { + // https://github.com/android/ndk/issues/1196 + // The unwinder used by the crash handler on versions of Android prior to + // API 29 did not correctly handle binaries built with rosegment, which is + // enabled by default for LLD. Android only supports LLD, so it's not an + // issue that this flag is not accepted by other linkers. + ExtraOpts.push_back("--no-rosegment"); + } + // Android ARM/AArch64 use max-page-size=4096 to reduce VMA usage. Note, lld // from 11 onwards default max-page-size to 65536 for both ARM and AArch64. if ((Triple.isARM() || Triple.isAArch64()) && Triple.isAndroid()) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits