[compiler-rt] r212815 - [ASan/Win] Don't apply dllexport to __asan_init in the DLL thunk

Timur Iskhodzhanov timurrrr at google.com
Mon Jul 14 10:46:17 PDT 2014


How about http://reviews.llvm.org/D4500 ?

The #undef trick you've suggested is unlikely to work (at least
without many hacks) as there's no dllthunk-specific code between the
header that defines SANITIZER_INTERFACE_ATTRIBUTE and the header that
declares __asan_init.

2014-07-14 21:14 GMT+04:00 Timur Iskhodzhanov <timurrrr at google.com>:
> Now that I have a test case, I'll try to come up with a solution that
> doesn't require #ifdef's in shared headers.
>
> 2014-07-12 5:18 GMT+04:00 Alexey Samsonov <vonosmas at gmail.com>:
>>
>> On Fri, Jul 11, 2014 at 12:05 PM, Timur Iskhodzhanov <timurrrr at google.com>
>> wrote:
>>>
>>> On Windows, we currently have two RTLs -- the "full" one, linked to the
>>> app; and a mini dll_thunk one, delegating ASan interface calls to the main
>>> one.
>>
>>
>> Yes, I understand your goal, I have concerns about the way you reach it
>> (SANITIZER_DLL_THUNK, see comment about compile definitons in public
>> sanitizer_common headers).
>> If you need _some_ stuff from sanitizer_common headers for building your
>> special asan_dll_thunk.cc, it would probably be better to add
>>
>> // Interceptors in dll thunk don't need interface attribute because ....
>> #undef SANITIZER_INTERFACE_ATTRIBUTE
>> #define SANITIZER_INTERFACE_ATTRIBUTE
>>
>> to the .cc file
>>
>>>
>>> The dllexport attribute should only be applied to interface functions
>>> exported by the full/main one.
>>
>>
>>>
>>> 11 июля 2014 г. 22:28 пользователь "Alexey Samsonov" <vonosmas at gmail.com>
>>> написал:
>>>
>>>>
>>>> On Fri, Jul 11, 2014 at 6:46 AM, Timur Iskhodzhanov <timurrrr at google.com>
>>>> wrote:
>>>>>
>>>>> 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
>>>>
>>>>
>>>> I find this very confusing. sanitizer_common is not a header-only
>>>> library, it's compiled once, and then the same object
>>>> files are put inside all sanitizer runtimes (ASan, TSan, MSan). But ASan
>>>> runtime #includes headers from sanitizer_common.
>>>> If you build some parts of ASan runtime with "-DSANITIZER_FOO=1" and
>>>> build sanitizer_common itself with "-DSANITIZER_FOO=0"
>>>> you may get all sorts of weird bugs. So I kind of advocate against
>>>> "SANITIZER_FOO" macro which are exposed in sanitizer_common headers.
>>>>
>>>> Is it possible to find other solution? What SANITIZER_INTERFACE_ATTRIBUTE
>>>> are you trying to get rid of?
>>>>
>>>>
>>>>>
>>>>>  // 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
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Alexey Samsonov
>>>> vonosmas at gmail.com
>>
>>
>>
>>
>> --
>> Alexey Samsonov
>> vonosmas at gmail.com




More information about the llvm-commits mailing list