[PATCH] D96070: [clang] [driver] Enable static linking to libc++
Timm Bäder via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 4 11:45:23 PST 2021
tbaeder created this revision.
tbaeder added reviewers: rsmith, EricWF, ldionne, tstellar, hfinkel.
tbaeder requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Hi,
currently the following fails:
clang++ -stdlib=libc++ -static ./test.cpp
because libc++ needs libc++abi and pthreads.
This change has already been proposed in a different version, using `-static-libc++` in https://reviews.llvm.org/D63329
And https://reviews.llvm.org/D60794 tried to do it in libc++ instead of clang.
This version makes both linking with `-static` as above work, as well as `-static-libstdc++ -stdlib=libc++`.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D96070
Files:
clang/lib/Driver/ToolChain.cpp
clang/lib/Driver/ToolChains/Gnu.cpp
clang/test/Driver/libcxx-link.cpp
clang/test/Driver/netbsd.cpp
Index: clang/test/Driver/netbsd.cpp
===================================================================
--- clang/test/Driver/netbsd.cpp
+++ clang/test/Driver/netbsd.cpp
@@ -250,7 +250,7 @@
// S-ARM-7: clang{{.*}}" "-cc1" "-triple" "armv5e-unknown-netbsd7.0.0-eabi"
// S-ARM-7: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
// S-ARM-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}eabi{{/|\\\\}}crti.o"
-// S-ARM-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++" "-lm" "-lc"
+// S-ARM-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++" "-lc++abi" "-lm" "-lc"
// S-ARM-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
// S-AARCH64: clang{{.*}}" "-cc1" "-triple" "aarch64-unknown-netbsd"
Index: clang/test/Driver/libcxx-link.cpp
===================================================================
--- /dev/null
+++ clang/test/Driver/libcxx-link.cpp
@@ -0,0 +1,20 @@
+
+
+// Regular shared link
+// RUN: %clang++ %s -stdlib=libc++
+
+// Static link via -static-libstdc++
+// RUN: %clang++ %s -stdlib=libc++ -static-libstdc++
+
+// Static link via -static
+// RUN: %clang++ %s -stdlib=libc++ -static
+
+// Both
+// RUN: %clang++ %s -stdlib=libc++ -static-libstdc++ -static
+
+#include <iostream>
+int main(int argc, char **argv) {
+ std::cout << "Hello Word\n";
+
+ return 0;
+}
Index: clang/lib/Driver/ToolChains/Gnu.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Gnu.cpp
+++ clang/lib/Driver/ToolChains/Gnu.cpp
@@ -613,6 +613,14 @@
// FIXME: Does this really make sense for all GNU toolchains?
WantPthread = true;
+ // libc++ links against pthreads so for static links we need
+ // to supply this manually
+ if (!WantPthread &&
+ getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx &&
+ (Args.hasArg(options::OPT_static) ||
+ Args.hasArg(options::OPT_static_libstdcxx)))
+ WantPthread = true;
+
AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
if (WantPthread && !isAndroid)
Index: clang/lib/Driver/ToolChain.cpp
===================================================================
--- clang/lib/Driver/ToolChain.cpp
+++ clang/lib/Driver/ToolChain.cpp
@@ -1041,6 +1041,9 @@
switch (Type) {
case ToolChain::CST_Libcxx:
CmdArgs.push_back("-lc++");
+ if (Args.hasArg(options::OPT_static) ||
+ Args.hasArg(options::OPT_static_libstdcxx))
+ CmdArgs.push_back("-lc++abi");
break;
case ToolChain::CST_Libstdcxx:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D96070.321533.patch
Type: text/x-patch
Size: 2554 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210204/10a6ec86/attachment-0001.bin>
More information about the cfe-commits
mailing list