diff --git a/fuzzers/libfuzzer_stats/Cargo.toml b/fuzzers/libfuzzer_stats/Cargo.toml index f9f86f618f..4f52bad5b7 100644 --- a/fuzzers/libfuzzer_stats/Cargo.toml +++ b/fuzzers/libfuzzer_stats/Cargo.toml @@ -17,9 +17,15 @@ codegen-units = 1 opt-level = 3 debug = true +[build-dependencies] +cc = "1.0" + [dependencies] clap = "2.32.0" afl = { path = "../../afl/" } -[lib] -crate-type = ["staticlib", "cdylib"] +[[bin]] +name = "libfuzzer" +path = "./src/mod.rs" +test = false +bench = false diff --git a/fuzzers/libfuzzer_stats/build.rs b/fuzzers/libfuzzer_stats/build.rs index 260811e96e..39b52042ab 100644 --- a/fuzzers/libfuzzer_stats/build.rs +++ b/fuzzers/libfuzzer_stats/build.rs @@ -4,40 +4,67 @@ use std::env; use std::path::Path; use std::process::Command; +const LIBPNG_URL: &str = "http://prdownloads.sourceforge.net/libpng/libpng-1.6.37.tar.gz?download"; + fn main() { let out_dir = env::var_os("OUT_DIR").unwrap(); - let out_dir = out_dir.to_string_lossy(); - - println!("cargo:rerun-if-changed=./runtime/rt.c",); - Command::new("clang") - .args(&["-c", "./runtime/rt.c", "-o"]) - .arg(&format!("{:?}/rt.o", out_dir)) - .status() - .unwrap(); - Command::new("ar") - .args(&["crus", "librt.a", "librt.o"]) - .current_dir(&Path::new(out_dir.as_ref())) - .status() - .unwrap(); + let out_dir = out_dir.to_string_lossy().to_string(); + let out_dir_path = Path::new(&out_dir); + println!("cargo:rerun-if-changed=./r&untime/rt.c",); println!("cargo:rerun-if-changed=harness.c"); - Command::new("clang") - .args(&["-c", "./harness.c", "-I./libpng-1.6.37", "-o"]) - .arg(&format!("{}/harness.o", out_dir)) - .status() - .unwrap(); - Command::new("ar") - .args(&["crus", "harness.a", "harness.o"]) - .current_dir(&Path::new(out_dir.as_ref())) - .status() - .unwrap(); - println!("cargo:rustc-link-search=native={}", out_dir); - println!("cargo:rustc-link-lib=static=libpng16"); - println!("cargo:rustc-link-lib=static=harness"); - println!("cargo:rustc-link-lib=static=rt"); + cc::Build::new() + .file("./runtime/rt.c") + .file("./harness.c") + .compile("libfuzzer-sys"); - println!("cargo:rerun-if-changed=libpng16.a"); + + let libpng = format!("{}/libpng-1.6.37", &out_dir); + let libpng_path = Path::new(&libpng); + let libpng_tar = format!("{}/libpng-1.6.37.tar.gz", &out_dir); + + if !libpng_path.is_dir() { + if !Path::new(&libpng_tar).is_file() { + println!("cargo:warning=Libpng not found, downloading..."); + // Download libpng + Command::new("wget") + .arg("-c") + .arg(LIBPNG_URL) + .arg("-O") + .arg(&libpng_tar) + .status() + .unwrap(); + } + Command::new("tar") + .current_dir(&out_dir_path) + .arg("-xvzf") + .arg(&libpng_tar) + .status() + .unwrap(); + Command::new(format!("{}/configure", &libpng)) + .current_dir(&libpng_path) + .arg("--disable-shared") + .status() + .unwrap(); + Command::new("make") + .current_dir(&libpng_path) + .env("CC", "clang") + .env("CXX", "clang++") + .env("CFLAGS", "-D_DEFAULT_SOURCE -fPIE -fsanitize-coverage=trace-pc-guard") + .env("LDFLAGS", "-fPIE -fsanitize-coverage=trace-pc-guard") + .env("CXXFLAGS", "-D_DEFAULT_SOURCE -fPIE -fsanitize-coverage=trace-pc-guard") + .status() + .unwrap(); + } + + println!("cargo:rustc-link-search=native={}", &out_dir); + println!("cargo:rustc-link-search=native={}/.libs", &libpng); + println!("cargo:rustc-link-lib=static=png16"); + + //Deps for libpng: -pthread -lz -lm + println!("cargo:rustc-link-lib=dylib=m"); + println!("cargo:rustc-link-lib=dylib=z"); println!("cargo:rerun-if-changed=build.rs"); } diff --git a/fuzzers/libfuzzer_stats/runtime/Makefile b/fuzzers/libfuzzer_stats/runtime/Makefile deleted file mode 100644 index 87e5cb0759..0000000000 --- a/fuzzers/libfuzzer_stats/runtime/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -CC ?= clang - -all: rt.o - -rt.o: rt.c - $(CC) -c rt.c - -clean: - rm -f rt.o - diff --git a/fuzzers/libfuzzer_stats/runtime/rt.c b/fuzzers/libfuzzer_stats/runtime/rt.c index 43ccccc2f7..164c3351cc 100644 --- a/fuzzers/libfuzzer_stats/runtime/rt.c +++ b/fuzzers/libfuzzer_stats/runtime/rt.c @@ -144,10 +144,3 @@ int afl_libfuzzer_init() { return 0; } - -int main(int argc, char** argv) { - - afl_libfuzzer_main(); - return 0; - -} diff --git a/fuzzers/libfuzzer_stats/src/lib.rs b/fuzzers/libfuzzer_stats/src/mod.rs similarity index 99% rename from fuzzers/libfuzzer_stats/src/lib.rs rename to fuzzers/libfuzzer_stats/src/mod.rs index ef37f6bfd3..7f46839373 100644 --- a/fuzzers/libfuzzer_stats/src/lib.rs +++ b/fuzzers/libfuzzer_stats/src/mod.rs @@ -47,8 +47,7 @@ fn harness(_executor: &dyn Executor, buf: &[u8]) -> ExitKind { const NAME_COV_MAP: &str = "cov_map"; -#[no_mangle] -pub extern "C" fn afl_libfuzzer_main() { +pub fn main() { let matches = App::new("libAFLrs fuzzer harness") .about("libAFLrs fuzzer harness help options.") .arg(