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

Chandler Carruth chandlerc at google.com
Tue Dec 4 14:54:32 PST 2012


On Tue, Dec 4, 2012 at 2:52 PM, Nico Weber <thakis at chromium.org> wrote:

> -whole-archive is linux-only. darwin has -force_load libfoo.a.
>

This is already in the linux-only part of the driver.


>
> On Tue, Dec 4, 2012 at 2:43 PM, Chandler Carruth <chandlerc at google.com>
> wrote:
> > On it. We need to wrap the runtime in -whole-archive as well.
> >
> > I'm a touch worried about this being a Linux-only fix, but that'll have
> to
> > wait for someone on a non-linux platform where it matters to chime in...
> >
> >
> > On Tue, Dec 4, 2012 at 2:21 PM, Alexey Samsonov <samsonov at google.com>
> wrote:
> >>
> >> 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
> >>
> >>
> >> _______________________________________________
> >> cfe-commits mailing list
> >> cfe-commits at cs.uiuc.edu
> >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> >>
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121204/b59345dc/attachment.html>


More information about the cfe-commits mailing list