[cfe-commits] r169328 - in /cfe/trunk: lib/Driver/Tools.cpp test/Driver/asan-ld.c

Chandler Carruth chandlerc at gmail.com
Tue Dec 4 14:54:37 PST 2012


Author: chandlerc
Date: Tue Dec  4 16:54:37 2012
New Revision: 169328

URL: http://llvm.org/viewvc/llvm-project?rev=169328&view=rev
Log:
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.

Modified:
    cfe/trunk/lib/Driver/Tools.cpp
    cfe/trunk/test/Driver/asan-ld.c

Modified: cfe/trunk/lib/Driver/Tools.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=169328&r1=169327&r2=169328&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Tools.cpp (original)
+++ cfe/trunk/lib/Driver/Tools.cpp Tue Dec  4 16:54:37 2012
@@ -1524,8 +1524,14 @@
       // 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");

Modified: cfe/trunk/test/Driver/asan-ld.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/asan-ld.c?rev=169328&r1=169327&r2=169328&view=diff
==============================================================================
--- cfe/trunk/test/Driver/asan-ld.c (original)
+++ cfe/trunk/test/Driver/asan-ld.c Tue Dec  4 16:54:37 2012
@@ -19,7 +19,7 @@
 //
 // CHECK-LINUX-CXX: "{{.*}}ld{{(.exe)?}}"
 // CHECK-LINUX-CXX-NOT: "-lc"
-// CHECK-LINUX-CXX: libclang_rt.asan-i386.a"
+// CHECK-LINUX-CXX: "-whole-archive" "{{.*}}libclang_rt.asan-i386.a" "-no-whole-archive"
 // CHECK-LINUX-CXX: "-lpthread"
 // CHECK-LINUX-CXX: "-ldl"
 // CHECK-LINUX-CXX: "-export-dynamic"
@@ -32,7 +32,7 @@
 //
 // CHECK-LINUX-CXX-STATIC: "{{.*}}ld{{(.exe)?}}"
 // CHECK-LINUX-CXX-STATIC-NOT: stdc++
-// CHECK-LINUX-CXX-STATIC: libclang_rt.asan-i386.a"
+// CHECK-LINUX-CXX-STATIC: "-whole-archive" "{{.*}}libclang_rt.asan-i386.a" "-no-whole-archive"
 // CHECK-LINUX-CXX-STATIC: stdc++
 
 // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \





More information about the cfe-commits mailing list