[llvm-dev] Building LLVM's fuzzers

Kostya Serebryany via llvm-dev llvm-dev at lists.llvm.org
Thu Aug 24 15:16:33 PDT 2017


With -Wl,-gc-sections I get this:
SimpleTest.cpp:(.text.sancov.module_ctor[sancov.module_ctor]+0x1b):
undefined reference to `__start___sancov_pcs'
SimpleTest.cpp:(.text.sancov.module_ctor[sancov.module_ctor]+0x20):
undefined reference to `__stop___sancov_pcs'



On Thu, Aug 24, 2017 at 3:07 PM, George Karpenkov <ekarpenkov at apple.com>
wrote:

>
> On Aug 24, 2017, at 2:55 PM, Kostya Serebryany <kcc at google.com> wrote:
>
> Interesting.
> This is a relatively new addition (fsanitize-coverage=pc-tables, which is
> now a part of -fsanitize=fuzzer).
> The tests worked (did they? On Mac?) so I thought everything is ok.
>
>
> For tests we never compile the tested target with -O3 (and that wouldn’t
> be sufficient),
> and for testing fuzzers I was always building them in debug
>
> Yea, we need to make sure the pc-tables are not stripped (this is a
> separate section with globals).
> (I still haven't documented pc-tables, will do soon)
>
>
> Do you know what's the analog of Wl,-dead_strip on Linux?
>
>
> Apparently -Wl,—gc-sections.
> For some reason LLVM does not do it for gold, even though it seems to
> support this flag as well.
> (that could be another reason why you don’t see the failure on Linux)
>
>  1 *if*(NOT LLVM_NO_DEAD_STRIP)
>  2   *if*(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
>  3     # ld64's implementation of -dead_strip breaks tools that use
> plugins.
>  4     set_property(TARGET ${target_name} APPEND_STRING PROPERTY
>  5                  LINK_FLAGS " -Wl,-dead_strip")
>  6   *elseif*(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
>  7     set_property(TARGET ${target_name} APPEND_STRING PROPERTY
>  8                  LINK_FLAGS " -Wl,-z -Wl,discard-unused=sections")
>  9   *elseif*(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD)
> 10     # Object files are compiled with -ffunction-data-sections.
> 11     # Versions of bfd ld < 2.23.1 have a bug in --gc-sections that
> breaks
> 12     # tools that use plugins. Always pass --gc-sections once we require
> 13     # a newer linker.
> 14     set_property(TARGET ${target_name} APPEND_STRING PROPERTY
> 15                  LINK_FLAGS " -Wl,--gc-sections")
> 16   *endif*()
> 17 *endif*()
>
>
>
> --kcc
>
>
>
> On Thu, Aug 24, 2017 at 2:49 PM, Justin Bogner <mail at justinbogner.com>
> wrote:
>
>> George Karpenkov <ekarpenkov at apple.com> writes:
>> > OK so with Kuba’s help I’ve found the error: with optimization, dead
>> > stripping of produced libraries is enabled,
>> > which removes coverage instrumentation.
>> >
>> > However, this has nothing to do with the move to compiler-rt, so I’m
>> > quite skeptical on whether it has worked
>> > beforehand.
>> >
>> > A trivial fix is to do:
>> >
>> > diff --git a/cmake/modules/HandleLLVMOptions.cmake
>> b/cmake/modules/HandleLLVMOptions.cmake
>> > index 04596a6ff63..5465d8d95ba 100644
>> > --- a/cmake/modules/HandleLLVMOptions.cmake
>> > +++ b/cmake/modules/HandleLLVMOptions.cmake
>> > @@ -665,6 +665,9 @@ if(LLVM_USE_SANITIZER)
>> >    endif()
>> >    if (LLVM_USE_SANITIZE_COVERAGE)
>> >      append("-fsanitize=fuzzer-no-link" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
>> > +
>> > +    # Dead stripping messes up coverage instrumentation.
>> > +    set(LLVM_NO_DEAD_STRIP ON)
>> >    endif()
>> >  endif()
>> >
>> > Any arguments against that?
>>
>> We shouldn't do this. We really only want to prevent dead stripping of
>> the counters themselves - disabling it completely isn't very nice.
>>
>> > Apparently, a better way is to follow ASAN instrumentation pass,
>> > which uses some magic to protect against dead-stripping.
>>
>> I thought this was already being done - how else did it work before?
>>
>> >> On Aug 24, 2017, at 11:29 AM, Justin Bogner <mail at justinbogner.com>
>> wrote:
>> >>
>> >> (kcc, george: sorry for the re-send, the first was from a non-list
>> email
>> >> address)
>> >>
>> >> My configuration for building the fuzzers in the LLVM tree doesn't
>> seem to
>> >> work any more (possibly as of moving libFuzzer to compiler-rt, but
>> there
>> >> have been a few other changes in the last week or so that may be
>> related).
>> >>
>> >> I'm building with a fresh top-of-tree clang and setting
>> >> -DLLVM_USE_SANITIZER=Address and -DLLVM_USE_SANITIZE_COVERAGE=On,
>> which
>> >> was working before:
>> >>
>> >>  % cmake -GNinja \
>> >>          -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=On \
>> >>          -DLLVM_ENABLE_WERROR=On \
>> >>          -DLLVM_USE_SANITIZER=Address -DLLVM_USE_SANITIZE_COVERAGE=On
>> \
>> >>          -DCMAKE_C_COMPILER=$HOME/llvm-lkgc/bin/clang \
>> >>          $HOME/code/llvm-src
>> >>
>> >> But when I run any of the fuzzers, it looks like the sanitizer coverage
>> >> hasn't been set up correctly:
>> >>
>> >>  % ./bin/llvm-as-fuzzer
>>                                    2017-08-24 11:14:33
>> >>  INFO: Seed: 4089166883
>> >>  INFO: Loaded 1 modules   (50607 guards): 50607 [0x10e14ef80,
>> 0x10e18063c),
>> >>  INFO: Loaded 1 PC tables (0 PCs): 0 [0x10e2870a8,0x10e2870a8),
>> >>  ERROR: The size of coverage PC tables does not match the number of
>> instrumented PCs. This might be a bug in the compiler, please contact the
>> libFuzzer developers.
>> >>
>> >> From the build logs, it looks like we're now building objects with
>> these
>> >> sanitizer flags:
>> >>
>> >>  -fsanitize=address
>> >>  -fsanitize-address-use-after-scope
>> >>  -fsanitize=fuzzer-no-link
>> >>
>> >> We're then linking the fuzzer binaries with these:
>> >>
>> >>  -fsanitize=address
>> >>  -fsanitize-address-use-after-scope
>> >>  -fsanitize=fuzzer-no-link
>> >>  -fsanitize=fuzzer
>> >>
>> >> Any idea what's wrong or where to start looking?
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170824/0d293835/attachment.html>


More information about the llvm-dev mailing list