Commit fae16fc0 authored by Dan Albert's avatar Dan Albert
Browse files

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
parent f3c9687a
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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()) {
+14 −0
Original line number Diff line number Diff line
@@ -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