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

Alexey Samsonov samsonov at google.com
Tue Dec 4 14:21:10 PST 2012


Hi Matt,

This breaks building programs with ASan:
$ cat zzz.cc
int main(int argc, char *argv[]) {
  return 0;
}
$ clang++ -fsanitize=address zzz.cc
/tmp/zzz-YkVYcB.o: In function `main':
zzz.cc:(.text+0xfb): undefined reference to `__asan_report_store4'
zzz.cc:(.text+0x157): undefined reference to `__asan_report_store4'
zzz.cc:(.text+0x18b): undefined reference to `__asan_report_store8'
/tmp/zzz-YkVYcB.o: In function `asan.module_ctor':
zzz.cc:(.text+0x1f5): undefined reference to `__asan_init'
clang-3: error: linker command failed with exit code 1 (use -v to see
invocation)


On Tue, Dec 4, 2012 at 1:18 PM, Matt Beaumont-Gay <matthewbg at google.com>wrote:

> Author: matthewbg
> Date: Tue Dec  4 15:18:26 2012
> New Revision: 169310
>
> URL: http://llvm.org/viewvc/llvm-project?rev=169310&view=rev
> Log:
> Currently, with -fsanitize=address, the driver appends libclang_rt.asan.a
> to
> the link command. This all works fine when the driver is also responsible
> for
> adding -lstdc++ to the link command. But, if -lstdc++ (or libstdc++.a,
> etc) is
> passed explicitly to the driver, the ASan runtime will appear in the link
> command after the standard library, leading to multiple-definition errors
> for
> the global 'operator new' and 'operator delete'. Fix this in a painfully
> simple way, by inserting libclang_rt.asan.a at the start of the link
> command
> instead of the end.
>
> If we need to do something more clever, we can walk the link command
> looking
> for something that resembles libstdc++ and insert libclang_rt.asan.a as
> late
> as possible, but the simple solution works for now.
>
> 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=169310&r1=169309&r2=169310&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.cpp (original)
> +++ cfe/trunk/lib/Driver/Tools.cpp Tue Dec  4 15:18:26 2012
> @@ -1512,7 +1512,7 @@
>      llvm::sys::path::append(LibAsan, "lib", "linux",
>          (Twine("libclang_rt.asan-") +
>              TC.getArchName() + "-android.so"));
> -    CmdArgs.push_back(Args.MakeArgString(LibAsan));
> +    CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
>    } else {
>      if (!Args.hasArg(options::OPT_shared)) {
>        // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
> @@ -1521,7 +1521,11 @@
>        llvm::sys::path::append(LibAsan, "lib", "linux",
>                                (Twine("libclang_rt.asan-") +
>                                 TC.getArchName() + ".a"));
> -      CmdArgs.push_back(Args.MakeArgString(LibAsan));
> +      // 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));
>        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=169310&r1=169309&r2=169310&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Driver/asan-ld.c (original)
> +++ cfe/trunk/test/Driver/asan-ld.c Tue Dec  4 15:18:26 2012
> @@ -24,7 +24,17 @@
>  // CHECK-LINUX-CXX: "-ldl"
>  // CHECK-LINUX-CXX: "-export-dynamic"
>  // CHECK-LINUX-CXX: stdc++
> +
> +// RUN: %clang -no-canonical-prefixes %s -### -o /dev/null
> -fsanitize=address \
> +// RUN:     -target i386-unknown-linux
> --sysroot=%S/Inputs/basic_linux_tree \
> +// RUN:     -lstdc++ -static 2>&1 \
> +// RUN:   | FileCheck --check-prefix=CHECK-LINUX-CXX-STATIC %s
>  //
> +// 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: stdc++
> +
>  // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
>  // RUN:     -target arm-linux-androideabi -fsanitize=address \
>  // RUN:     --sysroot=%S/Inputs/basic_android_tree/sysroot \
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



-- 
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121204/6ab85733/attachment.html>


More information about the cfe-commits mailing list