diff --git a/fuzzers/generic_inmemory/src/bin/libafl_cc.rs b/fuzzers/generic_inmemory/src/bin/libafl_cc.rs index b37778565c..0305a00b66 100644 --- a/fuzzers/generic_inmemory/src/bin/libafl_cc.rs +++ b/fuzzers/generic_inmemory/src/bin/libafl_cc.rs @@ -1,4 +1,4 @@ -use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; +use libafl_cc::{ClangWrapper, CompilerWrapper}; use std::env; fn main() { @@ -8,28 +8,13 @@ fn main() { dir.pop(); let mut cc = ClangWrapper::new("clang", "clang++"); - cc.from_args(&args) + cc.is_cpp(false) + .from_args(&args) .unwrap() - .add_link_arg("-Wl,--whole-archive".into()) - .unwrap() - .add_link_arg( - dir.join(format!("{}generic_inmemory.{}", LIB_PREFIX, LIB_EXT)) - .display() - .to_string(), - ) - .unwrap() - .add_link_arg("-Wl,-no-whole-archive".into()) + .link_staticlib(&dir, "generic_inmemory".into()) .unwrap() .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .unwrap(); - // Libraries needed by libafl on Windows - #[cfg(windows)] - cc.add_link_arg("-lws2_32".into()) - .unwrap() - .add_link_arg("-lBcrypt".into()) - .unwrap() - .add_link_arg("-lAdvapi32".into()) - .unwrap(); cc.run().unwrap(); } else { panic!("LibAFL CC: No Arguments given"); diff --git a/fuzzers/generic_inmemory/src/bin/libafl_cxx.rs b/fuzzers/generic_inmemory/src/bin/libafl_cxx.rs index a05b141849..71886b5e02 100644 --- a/fuzzers/generic_inmemory/src/bin/libafl_cxx.rs +++ b/fuzzers/generic_inmemory/src/bin/libafl_cxx.rs @@ -1,4 +1,4 @@ -use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; +use libafl_cc::{ClangWrapper, CompilerWrapper}; use std::env; fn main() { @@ -8,29 +8,13 @@ fn main() { dir.pop(); let mut cc = ClangWrapper::new("clang", "clang++"); - cc.is_cpp() + cc.is_cpp(true) .from_args(&args) .unwrap() - .add_link_arg("-Wl,--whole-archive".into()) - .unwrap() - .add_link_arg( - dir.join(format!("{}generic_inmemory.{}", LIB_PREFIX, LIB_EXT)) - .display() - .to_string(), - ) - .unwrap() - .add_link_arg("-Wl,-no-whole-archive".into()) + .link_staticlib(&dir, "generic_inmemory".into()) .unwrap() .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .unwrap(); - // Libraries needed by libafl on Windows - #[cfg(windows)] - cc.add_link_arg("-lws2_32".into()) - .unwrap() - .add_link_arg("-lBcrypt".into()) - .unwrap() - .add_link_arg("-lAdvapi32".into()) - .unwrap(); cc.run().unwrap(); } else { panic!("LibAFL CC: No Arguments given"); diff --git a/fuzzers/libfuzzer_libmozjpeg/src/bin/libafl_cc.rs b/fuzzers/libfuzzer_libmozjpeg/src/bin/libafl_cc.rs index 0162b98a95..ef610ccba0 100644 --- a/fuzzers/libfuzzer_libmozjpeg/src/bin/libafl_cc.rs +++ b/fuzzers/libfuzzer_libmozjpeg/src/bin/libafl_cc.rs @@ -1,4 +1,4 @@ -use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; +use libafl_cc::{ClangWrapper, CompilerWrapper}; use std::env; fn main() { @@ -8,27 +8,15 @@ fn main() { dir.pop(); let mut cc = ClangWrapper::new("clang", "clang++"); - cc.from_args(&args) + cc.is_cpp(false) + .from_args(&args) .unwrap() - .add_link_arg("-Wl,--whole-archive".into()) - .unwrap() - .add_link_arg( - dir.join(format!("{}libfuzzer_libmozjpeg.{}", LIB_PREFIX, LIB_EXT)) - .display() - .to_string(), - ) - .unwrap() - .add_link_arg("-Wl,-no-whole-archive".into()) + .link_staticlib(&dir, "libfuzzer_libmozjpeg".into()) .unwrap() .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .unwrap(); - #[cfg(windows)] - cc.add_link_arg("-lws2_32".into()) - .unwrap() - .add_link_arg("-lBcrypt".into()) - .unwrap() - .add_link_arg("-lAdvapi32".into()) - .unwrap(); cc.run().unwrap(); + } else { + panic!("LibAFL CC: No Arguments given"); } } diff --git a/fuzzers/libfuzzer_libmozjpeg/src/bin/libafl_cxx.rs b/fuzzers/libfuzzer_libmozjpeg/src/bin/libafl_cxx.rs index 73bca7be22..c042724c97 100644 --- a/fuzzers/libfuzzer_libmozjpeg/src/bin/libafl_cxx.rs +++ b/fuzzers/libfuzzer_libmozjpeg/src/bin/libafl_cxx.rs @@ -1,4 +1,4 @@ -use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; +use libafl_cc::{ClangWrapper, CompilerWrapper}; use std::env; fn main() { @@ -8,29 +8,15 @@ fn main() { dir.pop(); let mut cc = ClangWrapper::new("clang", "clang++"); - cc.is_cpp() + cc.is_cpp(true) .from_args(&args) .unwrap() - .add_link_arg("-Wl,--whole-archive".into()) - .unwrap() - .add_link_arg( - dir.join(format!("{}libfuzzer_libmozjpeg.{}", LIB_PREFIX, LIB_EXT)) - .display() - .to_string(), - ) - .unwrap() - .add_link_arg("-Wl,-no-whole-archive".into()) + .link_staticlib(&dir, "libfuzzer_libmozjpeg".into()) .unwrap() .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .unwrap(); - // Libraries needed by libafl on Windows - #[cfg(windows)] - cc.add_link_arg("-lws2_32".into()) - .unwrap() - .add_link_arg("-lBcrypt".into()) - .unwrap() - .add_link_arg("-lAdvapi32".into()) - .unwrap(); cc.run().unwrap(); + } else { + panic!("LibAFL CC: No Arguments given"); } } diff --git a/fuzzers/libfuzzer_libpng/src/bin/libafl_cc.rs b/fuzzers/libfuzzer_libpng/src/bin/libafl_cc.rs index 5af597bfac..4daebd6950 100644 --- a/fuzzers/libfuzzer_libpng/src/bin/libafl_cc.rs +++ b/fuzzers/libfuzzer_libpng/src/bin/libafl_cc.rs @@ -1,4 +1,4 @@ -use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; +use libafl_cc::{ClangWrapper, CompilerWrapper}; use std::env; fn main() { @@ -8,28 +8,13 @@ fn main() { dir.pop(); let mut cc = ClangWrapper::new("clang", "clang++"); - cc.from_args(&args) + cc.is_cpp(false) + .from_args(&args) .unwrap() - .add_link_arg("-Wl,--whole-archive".into()) - .unwrap() - .add_link_arg( - dir.join(format!("{}libfuzzer_libpng.{}", LIB_PREFIX, LIB_EXT)) - .display() - .to_string(), - ) - .unwrap() - .add_link_arg("-Wl,-no-whole-archive".into()) + .link_staticlib(&dir, "libfuzzer_libpng".into()) .unwrap() .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .unwrap(); - // Libraries needed by libafl on Windows - #[cfg(windows)] - cc.add_link_arg("-lws2_32".into()) - .unwrap() - .add_link_arg("-lBcrypt".into()) - .unwrap() - .add_link_arg("-lAdvapi32".into()) - .unwrap(); cc.run().unwrap(); } else { panic!("LibAFL CC: No Arguments given"); diff --git a/fuzzers/libfuzzer_libpng/src/bin/libafl_cxx.rs b/fuzzers/libfuzzer_libpng/src/bin/libafl_cxx.rs index 72e06e3baa..5443014d3f 100644 --- a/fuzzers/libfuzzer_libpng/src/bin/libafl_cxx.rs +++ b/fuzzers/libfuzzer_libpng/src/bin/libafl_cxx.rs @@ -1,4 +1,4 @@ -use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; +use libafl_cc::{ClangWrapper, CompilerWrapper}; use std::env; fn main() { @@ -8,29 +8,13 @@ fn main() { dir.pop(); let mut cc = ClangWrapper::new("clang", "clang++"); - cc.is_cpp() + cc.is_cpp(true) .from_args(&args) .unwrap() - .add_link_arg("-Wl,--whole-archive".into()) - .unwrap() - .add_link_arg( - dir.join(format!("{}libfuzzer_libpng.{}", LIB_PREFIX, LIB_EXT)) - .display() - .to_string(), - ) - .unwrap() - .add_link_arg("-Wl,-no-whole-archive".into()) + .link_staticlib(&dir, "libfuzzer_libpng".into()) .unwrap() .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .unwrap(); - // Libraries needed by libafl on Windows - #[cfg(windows)] - cc.add_link_arg("-lws2_32".into()) - .unwrap() - .add_link_arg("-lBcrypt".into()) - .unwrap() - .add_link_arg("-lAdvapi32".into()) - .unwrap(); cc.run().unwrap(); } else { panic!("LibAFL CC: No Arguments given"); diff --git a/fuzzers/libfuzzer_libpng_launcher/src/bin/libafl_cc.rs b/fuzzers/libfuzzer_libpng_launcher/src/bin/libafl_cc.rs index 5af597bfac..4daebd6950 100644 --- a/fuzzers/libfuzzer_libpng_launcher/src/bin/libafl_cc.rs +++ b/fuzzers/libfuzzer_libpng_launcher/src/bin/libafl_cc.rs @@ -1,4 +1,4 @@ -use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; +use libafl_cc::{ClangWrapper, CompilerWrapper}; use std::env; fn main() { @@ -8,28 +8,13 @@ fn main() { dir.pop(); let mut cc = ClangWrapper::new("clang", "clang++"); - cc.from_args(&args) + cc.is_cpp(false) + .from_args(&args) .unwrap() - .add_link_arg("-Wl,--whole-archive".into()) - .unwrap() - .add_link_arg( - dir.join(format!("{}libfuzzer_libpng.{}", LIB_PREFIX, LIB_EXT)) - .display() - .to_string(), - ) - .unwrap() - .add_link_arg("-Wl,-no-whole-archive".into()) + .link_staticlib(&dir, "libfuzzer_libpng".into()) .unwrap() .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .unwrap(); - // Libraries needed by libafl on Windows - #[cfg(windows)] - cc.add_link_arg("-lws2_32".into()) - .unwrap() - .add_link_arg("-lBcrypt".into()) - .unwrap() - .add_link_arg("-lAdvapi32".into()) - .unwrap(); cc.run().unwrap(); } else { panic!("LibAFL CC: No Arguments given"); diff --git a/fuzzers/libfuzzer_libpng_launcher/src/bin/libafl_cxx.rs b/fuzzers/libfuzzer_libpng_launcher/src/bin/libafl_cxx.rs index 72e06e3baa..5443014d3f 100644 --- a/fuzzers/libfuzzer_libpng_launcher/src/bin/libafl_cxx.rs +++ b/fuzzers/libfuzzer_libpng_launcher/src/bin/libafl_cxx.rs @@ -1,4 +1,4 @@ -use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; +use libafl_cc::{ClangWrapper, CompilerWrapper}; use std::env; fn main() { @@ -8,29 +8,13 @@ fn main() { dir.pop(); let mut cc = ClangWrapper::new("clang", "clang++"); - cc.is_cpp() + cc.is_cpp(true) .from_args(&args) .unwrap() - .add_link_arg("-Wl,--whole-archive".into()) - .unwrap() - .add_link_arg( - dir.join(format!("{}libfuzzer_libpng.{}", LIB_PREFIX, LIB_EXT)) - .display() - .to_string(), - ) - .unwrap() - .add_link_arg("-Wl,-no-whole-archive".into()) + .link_staticlib(&dir, "libfuzzer_libpng".into()) .unwrap() .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .unwrap(); - // Libraries needed by libafl on Windows - #[cfg(windows)] - cc.add_link_arg("-lws2_32".into()) - .unwrap() - .add_link_arg("-lBcrypt".into()) - .unwrap() - .add_link_arg("-lAdvapi32".into()) - .unwrap(); cc.run().unwrap(); } else { panic!("LibAFL CC: No Arguments given"); diff --git a/fuzzers/libfuzzer_reachability/src/bin/libafl_cc.rs b/fuzzers/libfuzzer_reachability/src/bin/libafl_cc.rs index 5af597bfac..4daebd6950 100644 --- a/fuzzers/libfuzzer_reachability/src/bin/libafl_cc.rs +++ b/fuzzers/libfuzzer_reachability/src/bin/libafl_cc.rs @@ -1,4 +1,4 @@ -use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; +use libafl_cc::{ClangWrapper, CompilerWrapper}; use std::env; fn main() { @@ -8,28 +8,13 @@ fn main() { dir.pop(); let mut cc = ClangWrapper::new("clang", "clang++"); - cc.from_args(&args) + cc.is_cpp(false) + .from_args(&args) .unwrap() - .add_link_arg("-Wl,--whole-archive".into()) - .unwrap() - .add_link_arg( - dir.join(format!("{}libfuzzer_libpng.{}", LIB_PREFIX, LIB_EXT)) - .display() - .to_string(), - ) - .unwrap() - .add_link_arg("-Wl,-no-whole-archive".into()) + .link_staticlib(&dir, "libfuzzer_libpng".into()) .unwrap() .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .unwrap(); - // Libraries needed by libafl on Windows - #[cfg(windows)] - cc.add_link_arg("-lws2_32".into()) - .unwrap() - .add_link_arg("-lBcrypt".into()) - .unwrap() - .add_link_arg("-lAdvapi32".into()) - .unwrap(); cc.run().unwrap(); } else { panic!("LibAFL CC: No Arguments given"); diff --git a/fuzzers/libfuzzer_reachability/src/bin/libafl_cxx.rs b/fuzzers/libfuzzer_reachability/src/bin/libafl_cxx.rs index 72e06e3baa..5443014d3f 100644 --- a/fuzzers/libfuzzer_reachability/src/bin/libafl_cxx.rs +++ b/fuzzers/libfuzzer_reachability/src/bin/libafl_cxx.rs @@ -1,4 +1,4 @@ -use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; +use libafl_cc::{ClangWrapper, CompilerWrapper}; use std::env; fn main() { @@ -8,29 +8,13 @@ fn main() { dir.pop(); let mut cc = ClangWrapper::new("clang", "clang++"); - cc.is_cpp() + cc.is_cpp(true) .from_args(&args) .unwrap() - .add_link_arg("-Wl,--whole-archive".into()) - .unwrap() - .add_link_arg( - dir.join(format!("{}libfuzzer_libpng.{}", LIB_PREFIX, LIB_EXT)) - .display() - .to_string(), - ) - .unwrap() - .add_link_arg("-Wl,-no-whole-archive".into()) + .link_staticlib(&dir, "libfuzzer_libpng".into()) .unwrap() .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .unwrap(); - // Libraries needed by libafl on Windows - #[cfg(windows)] - cc.add_link_arg("-lws2_32".into()) - .unwrap() - .add_link_arg("-lBcrypt".into()) - .unwrap() - .add_link_arg("-lAdvapi32".into()) - .unwrap(); cc.run().unwrap(); } else { panic!("LibAFL CC: No Arguments given"); diff --git a/libafl/src/bolts/os/mod.rs b/libafl/src/bolts/os/mod.rs index 967c090e05..289c371f60 100644 --- a/libafl/src/bolts/os/mod.rs +++ b/libafl/src/bolts/os/mod.rs @@ -20,9 +20,6 @@ pub mod pipes; #[cfg(all(unix, feature = "std"))] use std::ffi::CString; -#[cfg(all(feature = "std", any(target_os = "linux", target_os = "android")))] -use std::fs::File; - #[cfg(all(windows, feature = "std"))] pub mod windows_exceptions; diff --git a/libafl_cc/src/lib.rs b/libafl_cc/src/lib.rs index 87fcb27117..0e1f9b292d 100644 --- a/libafl_cc/src/lib.rs +++ b/libafl_cc/src/lib.rs @@ -1,6 +1,6 @@ //! Compiler Wrapper from `LibAFL` -use std::{process::Command, string::String, vec::Vec}; +use std::{path::Path, process::Command, string::String, vec::Vec}; /// `LibAFL` CC Error Type #[derive(Debug)] @@ -42,6 +42,9 @@ pub trait CompilerWrapper { /// Add a compiler argument only when linking fn add_link_arg(&mut self, arg: String) -> Result<&'_ mut Self, Error>; + /// Link static C lib + fn link_staticlib(&mut self, dir: &Path, name: String) -> Result<&'_ mut Self, Error>; + /// Command to run the compiler fn command(&mut self) -> Result, Error>; @@ -136,6 +139,14 @@ impl CompilerWrapper for ClangWrapper { // Fuzzing define common among tools new_args.push("-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1".into()); + // Libraries needed by libafl on Windows + #[cfg(windows)] + if linking { + new_args.push("-lws2_32".into()); + new_args.push("-lBcrypt".into()); + new_args.push("-lAdvapi32".into()); + } + self.base_args = new_args; Ok(self) } @@ -155,6 +166,16 @@ impl CompilerWrapper for ClangWrapper { Ok(self) } + fn link_staticlib(&mut self, dir: &Path, name: String) -> Result<&'_ mut Self, Error> { + self.add_link_arg("-Wl,--whole-archive".into())? + .add_link_arg( + dir.join(format!("{}{}.{}", LIB_PREFIX, name, LIB_EXT)) + .display() + .to_string(), + )? + .add_link_arg("-Wl,-no-whole-archive".into()) + } + fn command(&mut self) -> Result, Error> { let mut args = vec![]; if self.is_cpp { @@ -207,9 +228,9 @@ impl ClangWrapper { self } - /// set cpp mode - pub fn is_cpp(&mut self) -> &'_ mut Self { - self.is_cpp = true; + /// Set cpp mode + pub fn is_cpp(&mut self, value: bool) -> &'_ mut Self { + self.is_cpp = value; self } }