aboutsummaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorFabian Meumertzheim <fabian@meumertzhe.im>2021-10-12 13:15:38 +0200
committerFabian Meumertzheim <fabian@meumertzhe.im>2021-10-15 10:11:09 +0200
commit554bfe492ec8ef1658500d695b3c99a1bcd3d1f8 (patch)
tree27b4a49c403df3416a02bc35fc3933fb1e35b5e4 /driver
parent50d1f3714ce1cbc09cea0ec7fb9e190349438e48 (diff)
downloadjazzer-api-554bfe492ec8ef1658500d695b3c99a1bcd3d1f8.tar.gz
Replace uses of dlsym and weak symbols
Neither is directly supported on Windows, but also not required: We can simply not add these symbols if we are linking against a sanitizer.
Diffstat (limited to 'driver')
-rw-r--r--driver/BUILD.bazel6
-rw-r--r--driver/libfuzzer_driver.cpp22
-rw-r--r--driver/sanitizer_symbols.cpp29
3 files changed, 40 insertions, 17 deletions
diff --git a/driver/BUILD.bazel b/driver/BUILD.bazel
index d9501505..3a1e72c0 100644
--- a/driver/BUILD.bazel
+++ b/driver/BUILD.bazel
@@ -84,6 +84,12 @@ cc_17_library(
cc_binary(
name = "jazzer_driver",
+ srcs = [
+ # Defines symbols otherwise defined by sanitizers to prevent linker
+ # errors and print JVM stack traces.
+ # Windows-compatible replacement for __attribute__((weak)).
+ "sanitizer_symbols.cpp",
+ ],
data = [
"//agent:jazzer_agent_deploy.jar",
],
diff --git a/driver/libfuzzer_driver.cpp b/driver/libfuzzer_driver.cpp
index 67638350..02ef1b8e 100644
--- a/driver/libfuzzer_driver.cpp
+++ b/driver/libfuzzer_driver.cpp
@@ -14,8 +14,6 @@
#include "libfuzzer_driver.h"
-#include <dlfcn.h>
-
#include <algorithm>
#include <filesystem>
#include <fstream>
@@ -44,26 +42,16 @@ DECLARE_string(id_sync_file);
// Defined in fuzz_target_runner.cpp
DECLARE_string(coverage_report);
+// This symbol is defined by sanitizers if linked into Jazzer or in
+// sanitizer_symbols.cpp if no sanitizer is used.
+extern "C" void __sanitizer_set_death_callback(void (*)());
+
// We apply a patch to libFuzzer to make it call this function instead of
// __sanitizer_set_death_callback to pass us the death callback.
extern "C" [[maybe_unused]] void __jazzer_set_death_callback(
void (*callback)()) {
jazzer::AbstractLibfuzzerDriver::libfuzzer_print_crashing_input_ = callback;
- void *sanitizer_set_death_callback =
- dlsym(RTLD_DEFAULT, "__sanitizer_set_death_callback");
- if (sanitizer_set_death_callback != nullptr)
- reinterpret_cast<void (*)(void (*)())>(sanitizer_set_death_callback)(
- callback);
-}
-
-// Suppress libFuzzer warnings about missing sanitizer methods in non-ASan
-// builds.
-extern "C" __attribute__((weak)) int __sanitizer_acquire_crash_state() {
- return true;
-}
-
-extern "C" __attribute__((weak)) void __sanitizer_print_stack_trace() {
- jazzer::DumpJvmStackTraces();
+ __sanitizer_set_death_callback(callback);
}
namespace {
diff --git a/driver/sanitizer_symbols.cpp b/driver/sanitizer_symbols.cpp
new file mode 100644
index 00000000..10255ef1
--- /dev/null
+++ b/driver/sanitizer_symbols.cpp
@@ -0,0 +1,29 @@
+// Copyright 2021 Code Intelligence GmbH
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Called in libfuzzer_driver.cpp.
+extern "C" void __sanitizer_set_death_callback(void (*)()) {}
+
+// Suppress libFuzzer warnings about missing sanitizer methods in non-sanitizer
+// builds.
+extern "C" int __sanitizer_acquire_crash_state() { return 1; }
+
+namespace jazzer {
+void DumpJvmStackTraces();
+}
+
+// Dump a JVM stack trace on timeouts.
+extern "C" void __sanitizer_print_stack_trace() {
+ jazzer::DumpJvmStackTraces();
+}