[llvm-dev] Building LLVM's fuzzers
Justin Bogner via llvm-dev
llvm-dev at lists.llvm.org
Thu Aug 24 15:10:14 PDT 2017
Kostya Serebryany <kcc at google.com> writes:
> 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.
It looks like the tests were passing, and I *think* I'd tried my fuzzer
since that change was in place. Maybe something about how we're linking
in compiler-rt makes it more obvious to the linker that these symbols
look dead?
> 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?
I think the closest thing is -Wl,--gc-sections but that might be less
aggressive about it than macOS's linker is.
> 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?
>>
More information about the llvm-dev
mailing list