From: Dan Albert Date: Thu, 11 Oct 2018 20:39:32 +0000 (+0000) Subject: [Driver] Fix --hash-style choice for Android. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f3961d46c88845a099c9eefec828f891302c14c6;p=clang [Driver] Fix --hash-style choice for Android. Summary: Android supports GNU style hashes as of Marshmallow, so we should be generating both styles for pre-M targets and GNU hashes for newer targets. Reviewers: srhines, pirama Reviewed By: srhines Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D53118 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@344293 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/ToolChains/Linux.cpp b/lib/Driver/ToolChains/Linux.cpp index 0db75f71f3..fc511013cd 100644 --- a/lib/Driver/ToolChains/Linux.cpp +++ b/lib/Driver/ToolChains/Linux.cpp @@ -264,15 +264,18 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) // and the MIPS ABI require .dynsym to be sorted in different ways. // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS // ABI requires a mapping between the GOT and the symbol table. - // Android loader does not support .gnu.hash. + // Android loader does not support .gnu.hash until API 23. // Hexagon linker/loader does not support .gnu.hash - if (!IsMips && !IsAndroid && !IsHexagon) { + if (!IsMips && !IsHexagon) { if (Distro.IsRedhat() || Distro.IsOpenSUSE() || Distro.IsAlpineLinux() || - (Distro.IsUbuntu() && Distro >= Distro::UbuntuMaverick)) + (Distro.IsUbuntu() && Distro >= Distro::UbuntuMaverick) || + (IsAndroid && !Triple.isAndroidVersionLT(23))) ExtraOpts.push_back("--hash-style=gnu"); - if (Distro.IsDebian() || Distro.IsOpenSUSE() || Distro == Distro::UbuntuLucid || - Distro == Distro::UbuntuJaunty || Distro == Distro::UbuntuKarmic) + if (Distro.IsDebian() || Distro.IsOpenSUSE() || + Distro == Distro::UbuntuLucid || Distro == Distro::UbuntuJaunty || + Distro == Distro::UbuntuKarmic || + (IsAndroid && Triple.isAndroidVersionLT(23))) ExtraOpts.push_back("--hash-style=both"); } diff --git a/test/Driver/linux-ld.c b/test/Driver/linux-ld.c index 030753cb2b..cb530216fe 100644 --- a/test/Driver/linux-ld.c +++ b/test/Driver/linux-ld.c @@ -975,6 +975,20 @@ // CHECK-MIPS64EL-REDHAT: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld.so.1" // CHECK-MIPS64EL-REDHAT-NOT: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld-musl-mipsel.so.1" // CHECK-MIPS64EL-REDHAT-NOT: "--hash-style={{gnu|both}}" + +// Check that we pass --hash-style=both for pre-M Android versions and +// --hash-style=gnu for newer Android versions. +// RUN: %clang %s -### -o %t.o 2>&1 \ +// RUN: --target=armv7-linux-android21 \ +// RUN: | FileCheck --check-prefix=CHECK-ANDROID-HASH-STYLE-L %s +// CHECK-ANDROID-HASH-STYLE-L: "{{.*}}ld{{(.exe)?}}" +// CHECK-ANDROID-HASH-STYLE-L: "--hash-style=both" +// +// RUN: %clang %s -### -o %t.o 2>&1 \ +// RUN: --target=armv7-linux-android23 \ +// RUN: | FileCheck --check-prefix=CHECK-ANDROID-HASH-STYLE-M %s +// CHECK-ANDROID-HASH-STYLE-M: "{{.*}}ld{{(.exe)?}}" +// CHECK-ANDROID-HASH-STYLE-M: "--hash-style=gnu" // // RUN: %clang %s -### -o %t.o 2>&1 \ // RUN: --target=sparc-unknown-linux-gnu \