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 {};