From f0b72461568b4236ad25338c44cb637bcbce1323 Mon Sep 17 00:00:00 2001 From: Xinhao Yuan Date: Fri, 27 Mar 2026 07:02:48 -0700 Subject: [PATCH] Create a library for the FuzzTest llvm fuzzer wrapper to be used outside Bazel. PiperOrigin-RevId: 890430374 --- fuzztest/BUILD | 16 ++++++++++++++++ fuzztest/llvm_fuzzer_wrapper.cc | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/fuzztest/BUILD b/fuzztest/BUILD index 2cb687d2..068b4621 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,21 @@ cc_library( alwayslink = True, ) +# A full self-contained library archive that external llvm fuzzers should link +# to their fuzz targets to make them compatible with FuzzTest. +# +# Note that the library should be linked with +# `--undefined=fuzztest_llvm_fuzzer_wrapper_link_hook` or `--whole-archive` +# linker flag, as otherwise the test registration would not work. +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_wrapper.cc b/fuzztest/llvm_fuzzer_wrapper.cc index 64077256..905920ac 100644 --- a/fuzztest/llvm_fuzzer_wrapper.cc +++ b/fuzztest/llvm_fuzzer_wrapper.cc @@ -45,6 +45,11 @@ extern "C" size_t LLVMFuzzerCustomCrossOver(const uint8_t* data1, size_t size1, exit(-1); } +// A dummy symbol to be referenced by the linker flag +// `--undefined=fuzztest_llvm_fuzzer_wrapper_link_hook` to force this file to be +// included, otherwise the test registration would not be triggered. +extern "C" [[maybe_unused]] int fuzztest_llvm_fuzzer_wrapper_link_hook = 42; + std::vector> ReadByteArraysFromDirectory() { const std::string flag = absl::GetFlag(FLAGS_llvm_fuzzer_wrapper_corpus_dir); if (flag.empty()) return {};