From 44b69666dad7dc3d27f85449c425b25cb9100620 Mon Sep 17 00:00:00 2001 From: Elsa Granger Date: Wed, 15 Feb 2023 18:58:32 +0800 Subject: [PATCH] Fix fuzzbench build (#1004) * Fix -z,defs handle * Add libfuzzer_no_link_main option in libfuzzer * Use libfuzzer_no_link_main for fuzzbench * no_link_main feature --------- Co-authored-by: Andrea Fioraldi --- fuzzers/fuzzbench/Cargo.toml | 1 + fuzzers/fuzzbench_text/Cargo.toml | 1 + libafl_cc/src/clang.rs | 6 ++++-- libafl_targets/Cargo.toml | 1 + libafl_targets/build.rs | 10 +++++++--- libafl_targets/src/libfuzzer.c | 3 +++ 6 files changed, 17 insertions(+), 5 deletions(-) diff --git a/fuzzers/fuzzbench/Cargo.toml b/fuzzers/fuzzbench/Cargo.toml index d5ded20ad0..2a1328e712 100644 --- a/fuzzers/fuzzbench/Cargo.toml +++ b/fuzzers/fuzzbench/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" [features] default = ["std"] std = [] +no_link_main = ["libafl_targets/libfuzzer_no_link_main"] [profile.release] lto = true diff --git a/fuzzers/fuzzbench_text/Cargo.toml b/fuzzers/fuzzbench_text/Cargo.toml index 221dd7663e..3fa90ecfdb 100644 --- a/fuzzers/fuzzbench_text/Cargo.toml +++ b/fuzzers/fuzzbench_text/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" [features] default = ["std"] std = [] +no_link_main = ["libafl_targets/libfuzzer_no_link_main"] [profile.release] lto = true diff --git a/libafl_cc/src/clang.rs b/libafl_cc/src/clang.rs index aed7307fbc..9ebacbee51 100644 --- a/libafl_cc/src/clang.rs +++ b/libafl_cc/src/clang.rs @@ -167,8 +167,10 @@ impl CompilerWrapper for ClangWrapper { i += 1; continue; } - "-z" => { - if i + 1 < args.len() && args[i + 1].as_ref() == "defs" { + "-z" | "-Wl,-z" => { + if i + 1 < args.len() + && (args[i + 1].as_ref() == "defs" || args[i + 1].as_ref() == "-Wl,defs") + { i += 2; continue; } diff --git a/libafl_targets/Cargo.toml b/libafl_targets/Cargo.toml index a4738d749b..c73d7b3010 100644 --- a/libafl_targets/Cargo.toml +++ b/libafl_targets/Cargo.toml @@ -16,6 +16,7 @@ categories = ["development-tools::testing", "emulators", "embedded", "os", "no-s default = ["std", "sanitizers_flags"] std = ["libafl/std"] libfuzzer = [] +libfuzzer_no_link_main = ["libfuzzer"] sanitizers_flags = [] pointer_maps = [] sancov_pcguard_edges = [] diff --git a/libafl_targets/build.rs b/libafl_targets/build.rs index 1d41cbf5ae..b7583ad140 100644 --- a/libafl_targets/build.rs +++ b/libafl_targets/build.rs @@ -84,9 +84,13 @@ fn main() { { println!("cargo:rerun-if-changed=src/libfuzzer.c"); - cc::Build::new() - .file(src_dir.join("libfuzzer.c")) - .compile("libfuzzer"); + let mut libfuzzer = cc::Build::new(); + libfuzzer.file(src_dir.join("libfuzzer.c")); + + #[cfg(feature = "libfuzzer_no_link_main")] + libfuzzer.define("FUZZER_NO_LINK_MAIN", "1"); + + libfuzzer.compile("libfuzzer"); } println!("cargo:rerun-if-changed=src/common.h"); diff --git a/libafl_targets/src/libfuzzer.c b/libafl_targets/src/libfuzzer.c index 4de0be79b1..42c7a8cd4f 100644 --- a/libafl_targets/src/libfuzzer.c +++ b/libafl_targets/src/libfuzzer.c @@ -18,6 +18,8 @@ EXT_FUNC_IMPL(LLVMFuzzerTestOneInput, int, (uint8_t *Data, size_t Size), false) EXT_FUNC_IMPL(libafl_main, void, (void), false) { } + +#ifndef FUZZER_NO_LINK_MAIN EXT_FUNC_IMPL(main, int, (int argc, char** argv), false) { libafl_main(); return 0; @@ -30,6 +32,7 @@ int main(int argc, char** argv) { libafl_main(); } #endif +#endif #pragma GCC diagnostic pop