aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/Tools.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2012-12-04 22:54:37 +0000
committerChandler Carruth <chandlerc@gmail.com>2012-12-04 22:54:37 +0000
commit1d1539875bc0a00935ffb41e27a8fd327054c006 (patch)
treeec5d57c4c145c86a9bcca6d6891e49bdc997bf15 /lib/Driver/Tools.cpp
parent79762d3d6d82a314848cf4bfa6d2d58439536dbe (diff)
Add -whole-archive around the ASan runtime archive in the link command.
This ensures that even though it comes first, we pick up its .o files. Note that if we can use this (or something similar / equivalent) on other platforms, we could potentially remove ReplaceOperatorsNewAndDelete from the ASan runtimes. We should probably do something similar for TSan and MSan as well. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169328 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/Tools.cpp')
-rw-r--r--lib/Driver/Tools.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index 92f41063e2..d5f191cf8a 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -1524,8 +1524,14 @@ static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
// The ASan runtime needs to come before -lstdc++ (or -lc++, libstdc++.a,
// etc.) so that the linker picks ASan's versions of the global 'operator
// new' and 'operator delete' symbols. We take the extreme (but simple)
- // strategy of inserting it at the front of the link command.
- CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
+ // strategy of inserting it at the front of the link command. It also
+ // needs to be forced to end up in the executable, so wrap it in
+ // whole-archive.
+ SmallVector<const char*, 3> PrefixArgs;
+ PrefixArgs.push_back("-whole-archive");
+ PrefixArgs.push_back(Args.MakeArgString(LibAsan));
+ PrefixArgs.push_back("-no-whole-archive");
+ CmdArgs.insert(CmdArgs.begin(), PrefixArgs.begin(), PrefixArgs.end());
CmdArgs.push_back("-lpthread");
CmdArgs.push_back("-ldl");
CmdArgs.push_back("-export-dynamic");