From dc07867dc9991c982bd3441da19d6fcc16ea54d6 Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Thu, 23 Feb 2023 13:19:08 -0800 Subject: [PATCH] [clang][Driver] Pass /INFERASANLIBS:NO to link.exe under -fsanitize=address With recent MSVC releases, STL headers will add /INFERASANLIBS to the drectve section of object files that are compiled with clang. With this flag, link.exe will automatically attempt to look for asan libs. When using clang as the driver to invoke the linker, we want to disable this feature because we explicitly pass the proper asan libraries, otherwise we get symbols defined multiple times. Reviewed By: hans Differential Revision: https://reviews.llvm.org/D144684 --- clang/lib/Driver/ToolChains/MSVC.cpp | 5 +++++ clang/test/Driver/cl-link.c | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index 13a7a2f..6f7db52 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -336,6 +336,11 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, } } + // Clang handles passing the proper asan libs to the linker, which goes + // against link.exe's /INFERASANLIBS which automatically finds asan libs. + if (TC.getSanitizerArgs(Args).needsAsanRt()) + CmdArgs.push_back("/INFERASANLIBS:NO"); + #ifdef _WIN32 // When cross-compiling with VS2017 or newer, link.exe expects to have // its containing bin directory at the top of PATH, followed by the diff --git a/clang/test/Driver/cl-link.c b/clang/test/Driver/cl-link.c index dcb7801..21d8208 100644 --- a/clang/test/Driver/cl-link.c +++ b/clang/test/Driver/cl-link.c @@ -65,3 +65,11 @@ // RUN: %clang_cl /Tc%s -fuse-ld=lld -### 2>&1 | FileCheck --check-prefix=USE_LLD %s // USE_LLD: lld-link + +// RUN: %clang_cl -m32 -arch:IA32 --target=i386-pc-win32 /Tc%s -fuse-ld=link -### -fsanitize=address 2>&1 | FileCheck --check-prefix=INFER-LINK %s +// INFER-LINK: link.exe +// INFER-LINK: /INFERASANLIBS:NO + +// RUN: %clang_cl -m32 -arch:IA32 --target=i386-pc-win32 /Tc%s -fuse-ld=lld -### -fsanitize=address 2>&1 | FileCheck --check-prefix=INFER-LLD %s +// INFER-LLD: lld-link +// INFER-LLD-NOT: INFERASANLIBS -- 2.7.4