[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:43:27 PST 2012
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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121204/19762e8b/attachment.html>
More information about the cfe-commits
mailing list