[compiler-rt] r212815 - [ASan/Win] Don't apply dllexport to __asan_init in the DLL thunk
Timur Iskhodzhanov
timurrrr at google.com
Fri Jul 11 08:29:06 PDT 2014
Reid, Hans,
I have a hard time writing a simple LIT test that would fail before the fix.
Here's a small standalone repro:
---- f.cc ----
#if CONFIG==1
extern "C" __declspec(dllexport) int f1() {
int x = 0;
return 1;
}
#else
extern "C" __declspec(dllexport) int f2() {
int x = 0;
return 2;
}
#endif
--------------
I can repro the failure @r212814 invoking link.exe directly (similar
to what Chromium does):
$ clang-cl -fsanitize=address -DCONFIG=1 f.cc -c -Fo1.obj && clang-cl
-fsanitize=address -DCONFIG=2 f.cc -c -Fo2.obj
$ link /DLL 1.obj
%LLVM_BUILD%\lib\clang\3.5.0\lib\windows\clang_rt.asan_dll_thunk-i386.lib
&& \
link /DLL 2.obj 1.lib
%LLVM_BUILD%\lib\clang\3.5.0\lib\windows\clang_rt.asan_dll_thunk-i386.lib
...
clang_rt.asan_dll_thunk-i386.lib(asan_dll_thunk.cc.obj) : error
LNK2005: ___asan_init_v4 already defined in 1.lib(1.dll)
OK, cool, now I want to get the same error without invoking link.exe
directly and without knowing the path to the RTL:
[using the 1.lib generated by the previous link.exe command]
$ clang-cl -fsanitize=address -LD -DCONFIG=2 f.cc 1.lib -Fe2.dll && echo OOPS
Creating library 2.lib and object 2.exp
OOPS
?!?!
Adding -### reveals that clang-cl calls link.exe with the following
args at the end of the command line:
... "...\clang_rt.asan_dll_thunk-i386.lib" "blablabla.obj" "1.lib"
and link.exe seems to be sensitive to the order in which the RTL and
1.lib appear on the command line! 8)
$ link /nologo /DLL 2.obj
%LLVM_BUILD%\lib\clang\3.5.0\lib\windows\clang_rt.asan_dll_thunk-i386.lib
1.lib && echo OOPS
OOPS
$ link /nologo /DLL 2.obj 1.lib
%LLVM_BUILD%\lib\clang\3.5.0\lib\windows\clang_rt.asan_dll_thunk-i386.lib
clang_rt.asan_dll_thunk-i386.lib(asan_dll_thunk.cc.obj) : error
LNK2005: ___asan_init_v4 already defined in 1.lib(1.dll)
I was unable to pass the lib and the RTL in the order required to
repro the bug using clang-cl, as clang-cl overrides the order of stuff
I pass via "-link".
Any ideas?
Or maybe it's Chromium/GYP that's doing something wrong?
--
Tim
2014-07-11 17:46 GMT+04:00 Timur Iskhodzhanov <timurrrr at google.com>:
> Author: timurrrr
> Date: Fri Jul 11 08:46:05 2014
> New Revision: 212815
>
> URL: http://llvm.org/viewvc/llvm-project?rev=212815&view=rev
> Log:
> [ASan/Win] Don't apply dllexport to __asan_init in the DLL thunk
>
> This fixes '___asan_init_v4 already defined' errors when linking some of Chromium DLLs.
> Looks like one of the DLL is using a .lib produced while linking another DLL and it exploded after r212699.
> I'm trying to come up with a small testcase...
>
> Modified:
> compiler-rt/trunk/lib/asan/CMakeLists.txt
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h
>
> Modified: compiler-rt/trunk/lib/asan/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/CMakeLists.txt?rev=212815&r1=212814&r2=212815&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/CMakeLists.txt (original)
> +++ compiler-rt/trunk/lib/asan/CMakeLists.txt Fri Jul 11 08:46:05 2014
> @@ -179,7 +179,7 @@ else()
> add_compiler_rt_runtime(clang_rt.asan_dll_thunk-${arch} ${arch} STATIC
> SOURCES asan_dll_thunk.cc
> $<TARGET_OBJECTS:RTInterception.${arch}>
> - CFLAGS ${ASAN_CFLAGS} -DASAN_DLL_THUNK
> + CFLAGS ${ASAN_CFLAGS} -DASAN_DLL_THUNK -DSANITIZER_DLL_THUNK
> DEFS ${ASAN_COMMON_DEFINITIONS})
> add_dependencies(asan clang_rt.asan_dll_thunk-${arch})
> endif()
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h?rev=212815&r1=212814&r2=212815&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h Fri Jul 11 08:46:05 2014
> @@ -17,7 +17,11 @@
>
> // Only use SANITIZER_*ATTRIBUTE* before the function return type!
> #if SANITIZER_WINDOWS
> -# define SANITIZER_INTERFACE_ATTRIBUTE __declspec(dllexport)
> +# if defined(SANITIZER_DLL_THUNK)
> +# define SANITIZER_INTERFACE_ATTRIBUTE
> +# else
> +# define SANITIZER_INTERFACE_ATTRIBUTE __declspec(dllexport)
> +# endif
> // FIXME find out what we need on Windows, if anything.
> # define SANITIZER_WEAK_ATTRIBUTE
> #elif defined(SANITIZER_GO)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list