Create a library for the FuzzTest LLVM fuzzer wrapper to be used outside Bazel. PiperOrigin-RevId: 907211728
diff --git a/fuzztest/BUILD b/fuzztest/BUILD index 0315b15..a4d29f8 100644 --- a/fuzztest/BUILD +++ b/fuzztest/BUILD
@@ -16,6 +16,7 @@ load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") load("@rules_cc//cc:cc_library.bzl", "cc_library") +load("@rules_cc//cc:cc_static_library.bzl", "cc_static_library") load("@rules_cc//cc:cc_test.bzl", "cc_test") package(default_visibility = ["//visibility:public"]) @@ -176,6 +177,16 @@ alwayslink = True, ) +# Self-contained FuzzTest library archive to be linked with LLVMFuzzerTestOneInput targets. +cc_static_library( + name = "fuzztest_llvm_fuzzer_static", + testonly = True, + deps = [ + ":llvm_fuzzer_main", + ":llvm_fuzzer_wrapper", + ], +) + cc_library( name = "domain", hdrs = ["domain.h"],
diff --git a/fuzztest/llvm_fuzzer_main.cc b/fuzztest/llvm_fuzzer_main.cc index f9b17c3..8f190de 100644 --- a/fuzztest/llvm_fuzzer_main.cc +++ b/fuzztest/llvm_fuzzer_main.cc
@@ -19,7 +19,12 @@ "Maximum input size for the wrapped legacy LLVMFuzzer target " "(https://llvm.org/docs/LibFuzzer.html#fuzz-target)."); +// Defined in the FuzzTest LLVMFuzzer wrapper library, referenced here to make +// sure that the wrapper library is linked. +extern "C" void FuzzTestForceLinkLLVMFuzzerRegistration(); + int main(int argc, char** argv) { + FuzzTestForceLinkLLVMFuzzerRegistration(); absl::ParseCommandLine(argc, argv); testing::InitGoogleTest(&argc, argv); if (LLVMFuzzerInitialize) {
diff --git a/fuzztest/llvm_fuzzer_wrapper.cc b/fuzztest/llvm_fuzzer_wrapper.cc index 6407725..95e3d7c 100644 --- a/fuzztest/llvm_fuzzer_wrapper.cc +++ b/fuzztest/llvm_fuzzer_wrapper.cc
@@ -45,6 +45,10 @@ exit(-1); } +// A dummy function to be referenced by the FuzzTest LLVMFuzzer main library, +// otherwise the test registration here would not be triggered. +extern "C" [[maybe_unused]] void FuzzTestForceLinkLLVMFuzzerRegistration() {} + std::vector<std::vector<uint8_t>> ReadByteArraysFromDirectory() { const std::string flag = absl::GetFlag(FLAGS_llvm_fuzzer_wrapper_corpus_dir); if (flag.empty()) return {};