blob: 89eb0b8c1c6bb787562f899dea5e7f3b45886983 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
From 2b8900f80027da90a41043f8d428c208cb6fdae2 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Wed, 30 Mar 2016 19:56:10 -0700
Subject: [PATCH] driver: Add musl ldso support
Linux/musl libc implementation has different ldso
this needs to take effect when target arch is detected
as a musl based Linux platform
Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
lib/Driver/Tools.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 42 insertions(+), 5 deletions(-)
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index e45c5c5..34237c4 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -8953,6 +8953,47 @@ static std::string getLinuxDynamicLinker(const ArgList &Args,
return "/system/bin/linker64";
else
return "/system/bin/linker";
+ } else if (ToolChain.getTriple().isLinuxMuslEnvironment()) {
+ switch (Arch) {
+ case llvm::Triple::x86:
+ return "/lib/ld-musl-i386.so.1";
+ case llvm::Triple::x86_64:
+ if (ToolChain.getTriple().getEnvironment() == llvm::Triple::MUSLX32)
+ return "/lib/ld-musl-x32.so.1";
+ else
+ return "/lib/ld-musl-x86_64.so.1";
+ case llvm::Triple::aarch64:
+ return "/lib/ld-musl-aarch64.so.1";
+ case llvm::Triple::aarch64_be:
+ return "/lib/ld-musl-aarch64_be.so.1";
+ case llvm::Triple::ppc:
+ return "/lib/ld-musl-powerpc.so.1";
+ case llvm::Triple::ppc64:
+ return "/lib/ld-musl-powerpc64.so.1";
+ case llvm::Triple::arm:
+ case llvm::Triple::thumb:
+ if(arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
+ return "/lib/ld-musl-armhf.so.1";
+ else
+ return "/lib/ld-musl-arm.so.1";
+ case llvm::Triple::armeb:
+ case llvm::Triple::thumbeb:
+ if(arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
+ return "/lib/ld-musl-armebhf.so.1";
+ else
+ return "/lib/ld-musl-armeb.so.1";
+ case llvm::Triple::mips:
+ return "/lib/ld-musl-mips.so.1";
+ case llvm::Triple::mipsel:
+ return "/lib/ld-musl-mipsel.so.1";
+ case llvm::Triple::mips64:
+ return "/lib/ld-musl-mips64.so.1";
+ case llvm::Triple::mips64el:
+ return "/lib/ld-musl-mipsel64el.so.1";
+ default:
+ llvm_unreachable("unsupported musl architecture");
+ break;
+ }
} else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
Arch == llvm::Triple::sparcel)
return "/lib/ld-linux.so.2";
@@ -8981,11 +9022,7 @@ static std::string getLinuxDynamicLinker(const ArgList &Args,
bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
if (mips::isUCLibc(Args))
LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
- else if (!ToolChain.getTriple().hasEnvironment()) {
- bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
- (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
- LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
- } else
+ else
LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
return (LibDir + "/" + LibName).str();
--
2.8.2
|