building libpng

This commit is contained in:
Dominik Maier 2020-12-21 18:14:53 +01:00
parent 245e44b9d5
commit eb78c34f9e
5 changed files with 64 additions and 49 deletions

View File

@ -17,9 +17,15 @@ codegen-units = 1
opt-level = 3 opt-level = 3
debug = true debug = true
[build-dependencies]
cc = "1.0"
[dependencies] [dependencies]
clap = "2.32.0" clap = "2.32.0"
afl = { path = "../../afl/" } afl = { path = "../../afl/" }
[lib] [[bin]]
crate-type = ["staticlib", "cdylib"] name = "libfuzzer"
path = "./src/mod.rs"
test = false
bench = false

View File

@ -4,40 +4,67 @@ use std::env;
use std::path::Path; use std::path::Path;
use std::process::Command; use std::process::Command;
const LIBPNG_URL: &str = "http://prdownloads.sourceforge.net/libpng/libpng-1.6.37.tar.gz?download";
fn main() { fn main() {
let out_dir = env::var_os("OUT_DIR").unwrap(); let out_dir = env::var_os("OUT_DIR").unwrap();
let out_dir = out_dir.to_string_lossy(); let out_dir = out_dir.to_string_lossy().to_string();
let out_dir_path = Path::new(&out_dir);
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();
println!("cargo:rerun-if-changed=./r&untime/rt.c",);
println!("cargo:rerun-if-changed=harness.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); cc::Build::new()
println!("cargo:rustc-link-lib=static=libpng16"); .file("./runtime/rt.c")
println!("cargo:rustc-link-lib=static=harness"); .file("./harness.c")
println!("cargo:rustc-link-lib=static=rt"); .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"); println!("cargo:rerun-if-changed=build.rs");
} }

View File

@ -1,10 +0,0 @@
CC ?= clang
all: rt.o
rt.o: rt.c
$(CC) -c rt.c
clean:
rm -f rt.o

View File

@ -144,10 +144,3 @@ int afl_libfuzzer_init() {
return 0; return 0;
} }
int main(int argc, char** argv) {
afl_libfuzzer_main();
return 0;
}

View File

@ -47,8 +47,7 @@ fn harness<I>(_executor: &dyn Executor<I>, buf: &[u8]) -> ExitKind {
const NAME_COV_MAP: &str = "cov_map"; const NAME_COV_MAP: &str = "cov_map";
#[no_mangle] pub fn main() {
pub extern "C" fn afl_libfuzzer_main() {
let matches = App::new("libAFLrs fuzzer harness") let matches = App::new("libAFLrs fuzzer harness")
.about("libAFLrs fuzzer harness help options.") .about("libAFLrs fuzzer harness help options.")
.arg( .arg(