forked from OSchip/llvm-project
Wrong crtbegin/crtend pair used for PIE on Android.
Android uses the same flavour of crt*.o for PIE and non-PIE executables, and a different one for DSOs. GNU/Linux, on the other hand, uses one set of crt*.o for non-PIE executables, and another for both PIE executables and DSOs. llvm-svn: 163500
This commit is contained in:
parent
6f66ed1329
commit
c9cde48f3a
|
@ -5741,8 +5741,10 @@ void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
const char *crtbegin;
|
||||
if (Args.hasArg(options::OPT_static))
|
||||
crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
|
||||
else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
|
||||
else if (Args.hasArg(options::OPT_shared))
|
||||
crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
|
||||
else if (Args.hasArg(options::OPT_pie))
|
||||
crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
|
||||
else
|
||||
crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
|
||||
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
|
||||
|
@ -5808,8 +5810,10 @@ void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
|
||||
if (!Args.hasArg(options::OPT_nostartfiles)) {
|
||||
const char *crtend;
|
||||
if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
|
||||
if (Args.hasArg(options::OPT_shared))
|
||||
crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
|
||||
else if (Args.hasArg(options::OPT_pie))
|
||||
crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
|
||||
else
|
||||
crtend = isAndroid ? "crtend_android.o" : "crtend.o";
|
||||
|
||||
|
|
|
@ -412,3 +412,20 @@
|
|||
// CHECK-ANDROID-STATIC: "-lgcc"
|
||||
// CHECK-ANDROID-STATIC-NOT: "gcc_s"
|
||||
// CHECK-ANDROID-STATIC: "{{.*}}/crtend_android.o"
|
||||
// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
|
||||
// RUN: -target arm-linux-androideabi \
|
||||
// RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \
|
||||
// RUN: -pie \
|
||||
// RUN: | FileCheck --check-prefix=CHECK-ANDROID-PIE %s
|
||||
// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
|
||||
// RUN: -target arm-linux-android \
|
||||
// RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \
|
||||
// RUN: -pie \
|
||||
// RUN: | FileCheck --check-prefix=CHECK-ANDROID-PIE %s
|
||||
// CHECK-ANDROID-PIE: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
|
||||
// CHECK-ANDROID-PIE: "{{.*}}/crtbegin_dynamic.o"
|
||||
// CHECK-ANDROID-PIE: "-L[[SYSROOT]]/usr/lib"
|
||||
// CHECK-ANDROID-PIE-NOT: "gcc_s"
|
||||
// CHECK-ANDROID-PIE: "-lgcc"
|
||||
// CHECK-ANDROID-PIE-NOT: "gcc_s"
|
||||
// CHECK-ANDROID-PIE: "{{.*}}/crtend_android.o"
|
||||
|
|
Loading…
Reference in New Issue