46 lines
1.5 KiB
Rust
46 lines
1.5 KiB
Rust
use std::env;
|
|
|
|
use libafl_cc::{ClangWrapper, CompilerWrapper, LLVMPasses};
|
|
|
|
pub fn main() {
|
|
let mut args: Vec<String> = env::args().collect();
|
|
if args.len() > 1 {
|
|
let mut dir = env::current_exe().unwrap();
|
|
let wrapper_name = dir.file_name().unwrap().to_str().unwrap();
|
|
|
|
let is_cpp = match wrapper_name[wrapper_name.len()-2..].to_lowercase().as_str() {
|
|
"cc" => false,
|
|
"++" | "pp" | "xx" => true,
|
|
_ => panic!("Could not figure out if c or c++ warpper was called. Expected {:?} to end with c or cxx", dir),
|
|
};
|
|
|
|
dir.pop();
|
|
|
|
// Must be always present, even without --libafl
|
|
args.push("-fsanitize-coverage=trace-pc-guard,trace-cmp".into());
|
|
|
|
let mut cc = ClangWrapper::new();
|
|
|
|
#[cfg(target_os = "linux")]
|
|
cc.add_pass(LLVMPasses::AutoTokens);
|
|
|
|
if let Some(code) = cc
|
|
.cpp(is_cpp)
|
|
// silence the compiler wrapper output, needed for some configure scripts.
|
|
.silence(true)
|
|
// add arguments only if --libafl or --libafl-no-link are present
|
|
.need_libafl_arg(true)
|
|
.parse_args(&args)
|
|
.expect("Failed to parse the command line")
|
|
.link_staticlib(&dir, "fuzzbench")
|
|
.add_pass(LLVMPasses::CmpLogRtn)
|
|
.run()
|
|
.expect("Failed to run the wrapped compiler")
|
|
{
|
|
std::process::exit(code);
|
|
}
|
|
} else {
|
|
panic!("LibAFL CC: No Arguments given");
|
|
}
|
|
}
|