This change builds libraries with -fsanitize=fuzzer-no-link
instead of -fsanitize=fuzzer
when the cmake -DSANITIZERS=fuzzer
option is specified. This is necessary to make fuzzing and IPC cmake options compatible with each other and avoid CI failures in #30975 which enables IPC in the fuzzer CI build:
https://cirrus-ci.com/task/5366255504326656?logs=ci#L2817 https://cirrus-ci.com/task/5233064575500288?logs=ci#L2384
The failures can also be reproduced by checking out #31741 and building with cmake -B build -DBUILD_FOR_FUZZING=ON -DSANITIZERS=fuzzer -DENABLE_IPC=ON
with this fix reverted.
The fix updates the cmake build so when -DSANITIZERS=fuzzer
is specified, the fuzz test binary is built with -fsanitize=fuzzer
(so it can use libFuzzer’s main function), and libraries are built with -fsanitize=fuzzer-no-link
(so they can be linked into other executables with their own main functions).
Previously when -DSANITIZERS=fuzzer
was specified, -fsanitize=fuzzer
was applied to ALL libraries and executables. This was inappropriate because it made it impossible to build any executables other than the fuzz test executable without triggering link errors:
multiple definition of `main'
"undefined reference to `LLVMFuzzerTestOneInput'
if they depended on any libraries instrumented for fuzzing.
This was especially a problem when the ENABLE_IPC
option was set because it made building the mpgen
code generator impossible so nothing else that depended on generated sources, including the fuzz test binary, could be built either.
This commit was previously part of #31741 and had some discussion there starting in #31741#pullrequestreview-2619682385
This PR is part of the process separation project.