cb06fdad05
fork() is a simple way to ensure that state does not leak in between fuzzing runs. Unfortunately, the fuzzer mutation engine relies on bitmaps which contain coverage information for each fuzzing run, and these bitmaps should be copied from the child to the parent(where the mutation occurs). These bitmaps are created through compile-time instrumentation and they are not shared with fork()-ed processes, by default. To address this, we create a shared memory region, adjust its size and map it _over_ the counter region. Furthermore, libfuzzer doesn't generally expose the globals that specify the location of the counters/coverage bitmap. As a workaround, we rely on a custom linker script which forces all of the bitmaps we care about to be placed in a contiguous region, which is easy to locate and mmap over. Signed-off-by: Alexander Bulekov <alxndr@bu.edu> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Darren Kenny <darren.kenny@oracle.com> Message-id: 20200220041118.23264-16-alxndr@bu.edu Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
38 lines
1.0 KiB
Plaintext
38 lines
1.0 KiB
Plaintext
/* We adjust linker script modification to place all of the stuff that needs to
|
|
* persist across fuzzing runs into a contiguous seciton of memory. Then, it is
|
|
* easy to re-map the counter-related memory as shared.
|
|
*/
|
|
|
|
SECTIONS
|
|
{
|
|
.data.fuzz_start : ALIGN(4K)
|
|
{
|
|
__FUZZ_COUNTERS_START = .;
|
|
__start___sancov_cntrs = .;
|
|
*(_*sancov_cntrs);
|
|
__stop___sancov_cntrs = .;
|
|
|
|
/* Lowest stack counter */
|
|
*(__sancov_lowest_stack);
|
|
}
|
|
.data.fuzz_ordered :
|
|
{
|
|
/* Coverage counters. They're not necessary for fuzzing, but are useful
|
|
* for analyzing the fuzzing performance
|
|
*/
|
|
__start___llvm_prf_cnts = .;
|
|
*(*llvm_prf_cnts);
|
|
__stop___llvm_prf_cnts = .;
|
|
|
|
/* Internal Libfuzzer TracePC object which contains the ValueProfileMap */
|
|
FuzzerTracePC*(.bss*);
|
|
}
|
|
.data.fuzz_end : ALIGN(4K)
|
|
{
|
|
__FUZZ_COUNTERS_END = .;
|
|
}
|
|
}
|
|
/* Dont overwrite the SECTIONS in the default linker script. Instead insert the
|
|
* above into the default script */
|
|
INSERT AFTER .data;
|