From 210c77b38c6c3176137f5b52b3a298fee5c6fbec Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Tue, 4 Dec 2012 22:54:37 +0000 Subject: 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. llvm-svn: 169328 --- clang/lib/Driver/Tools.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'clang/lib/Driver/Tools.cpp') diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 92f41063e2d..d5f191cf8ad 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/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 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"); -- cgit v1.2.3