Disable rosegment for old Android versions.

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.

Reviewed By: srhines

Differential Revision: https://reviews.llvm.org/D95166
This commit is contained in:
Dan Albert 2021-01-26 16:04:56 -08:00
parent f3c9687a4f
commit fae16fc0ee
2 changed files with 23 additions and 0 deletions

View File

@ -236,6 +236,15 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
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()) {

View File

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