Move win32 libs in libafl_cc and improve static lib linking (#176)

* Move win32 libs in libafl_cc and improve static lib linking

* fmt
This commit is contained in:
Andrea Fioraldi 2021-06-16 14:21:13 +02:00 committed by GitHub
parent 8202548648
commit 1faadec106
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 64 additions and 196 deletions

View File

@ -1,4 +1,4 @@
use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; use libafl_cc::{ClangWrapper, CompilerWrapper};
use std::env; use std::env;
fn main() { fn main() {
@ -8,28 +8,13 @@ fn main() {
dir.pop(); dir.pop();
let mut cc = ClangWrapper::new("clang", "clang++"); let mut cc = ClangWrapper::new("clang", "clang++");
cc.from_args(&args) cc.is_cpp(false)
.from_args(&args)
.unwrap() .unwrap()
.add_link_arg("-Wl,--whole-archive".into()) .link_staticlib(&dir, "generic_inmemory".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())
.unwrap() .unwrap()
.add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into())
.unwrap(); .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(); cc.run().unwrap();
} else { } else {
panic!("LibAFL CC: No Arguments given"); panic!("LibAFL CC: No Arguments given");

View File

@ -1,4 +1,4 @@
use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; use libafl_cc::{ClangWrapper, CompilerWrapper};
use std::env; use std::env;
fn main() { fn main() {
@ -8,29 +8,13 @@ fn main() {
dir.pop(); dir.pop();
let mut cc = ClangWrapper::new("clang", "clang++"); let mut cc = ClangWrapper::new("clang", "clang++");
cc.is_cpp() cc.is_cpp(true)
.from_args(&args) .from_args(&args)
.unwrap() .unwrap()
.add_link_arg("-Wl,--whole-archive".into()) .link_staticlib(&dir, "generic_inmemory".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())
.unwrap() .unwrap()
.add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into())
.unwrap(); .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(); cc.run().unwrap();
} else { } else {
panic!("LibAFL CC: No Arguments given"); panic!("LibAFL CC: No Arguments given");

View File

@ -1,4 +1,4 @@
use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; use libafl_cc::{ClangWrapper, CompilerWrapper};
use std::env; use std::env;
fn main() { fn main() {
@ -8,27 +8,15 @@ fn main() {
dir.pop(); dir.pop();
let mut cc = ClangWrapper::new("clang", "clang++"); let mut cc = ClangWrapper::new("clang", "clang++");
cc.from_args(&args) cc.is_cpp(false)
.from_args(&args)
.unwrap() .unwrap()
.add_link_arg("-Wl,--whole-archive".into()) .link_staticlib(&dir, "libfuzzer_libmozjpeg".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())
.unwrap() .unwrap()
.add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into())
.unwrap(); .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(); cc.run().unwrap();
} else {
panic!("LibAFL CC: No Arguments given");
} }
} }

View File

@ -1,4 +1,4 @@
use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; use libafl_cc::{ClangWrapper, CompilerWrapper};
use std::env; use std::env;
fn main() { fn main() {
@ -8,29 +8,15 @@ fn main() {
dir.pop(); dir.pop();
let mut cc = ClangWrapper::new("clang", "clang++"); let mut cc = ClangWrapper::new("clang", "clang++");
cc.is_cpp() cc.is_cpp(true)
.from_args(&args) .from_args(&args)
.unwrap() .unwrap()
.add_link_arg("-Wl,--whole-archive".into()) .link_staticlib(&dir, "libfuzzer_libmozjpeg".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())
.unwrap() .unwrap()
.add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into())
.unwrap(); .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(); cc.run().unwrap();
} else {
panic!("LibAFL CC: No Arguments given");
} }
} }

View File

@ -1,4 +1,4 @@
use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; use libafl_cc::{ClangWrapper, CompilerWrapper};
use std::env; use std::env;
fn main() { fn main() {
@ -8,28 +8,13 @@ fn main() {
dir.pop(); dir.pop();
let mut cc = ClangWrapper::new("clang", "clang++"); let mut cc = ClangWrapper::new("clang", "clang++");
cc.from_args(&args) cc.is_cpp(false)
.from_args(&args)
.unwrap() .unwrap()
.add_link_arg("-Wl,--whole-archive".into()) .link_staticlib(&dir, "libfuzzer_libpng".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())
.unwrap() .unwrap()
.add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into())
.unwrap(); .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(); cc.run().unwrap();
} else { } else {
panic!("LibAFL CC: No Arguments given"); panic!("LibAFL CC: No Arguments given");

View File

@ -1,4 +1,4 @@
use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; use libafl_cc::{ClangWrapper, CompilerWrapper};
use std::env; use std::env;
fn main() { fn main() {
@ -8,29 +8,13 @@ fn main() {
dir.pop(); dir.pop();
let mut cc = ClangWrapper::new("clang", "clang++"); let mut cc = ClangWrapper::new("clang", "clang++");
cc.is_cpp() cc.is_cpp(true)
.from_args(&args) .from_args(&args)
.unwrap() .unwrap()
.add_link_arg("-Wl,--whole-archive".into()) .link_staticlib(&dir, "libfuzzer_libpng".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())
.unwrap() .unwrap()
.add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into())
.unwrap(); .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(); cc.run().unwrap();
} else { } else {
panic!("LibAFL CC: No Arguments given"); panic!("LibAFL CC: No Arguments given");

View File

@ -1,4 +1,4 @@
use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; use libafl_cc::{ClangWrapper, CompilerWrapper};
use std::env; use std::env;
fn main() { fn main() {
@ -8,28 +8,13 @@ fn main() {
dir.pop(); dir.pop();
let mut cc = ClangWrapper::new("clang", "clang++"); let mut cc = ClangWrapper::new("clang", "clang++");
cc.from_args(&args) cc.is_cpp(false)
.from_args(&args)
.unwrap() .unwrap()
.add_link_arg("-Wl,--whole-archive".into()) .link_staticlib(&dir, "libfuzzer_libpng".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())
.unwrap() .unwrap()
.add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into())
.unwrap(); .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(); cc.run().unwrap();
} else { } else {
panic!("LibAFL CC: No Arguments given"); panic!("LibAFL CC: No Arguments given");

View File

@ -1,4 +1,4 @@
use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; use libafl_cc::{ClangWrapper, CompilerWrapper};
use std::env; use std::env;
fn main() { fn main() {
@ -8,29 +8,13 @@ fn main() {
dir.pop(); dir.pop();
let mut cc = ClangWrapper::new("clang", "clang++"); let mut cc = ClangWrapper::new("clang", "clang++");
cc.is_cpp() cc.is_cpp(true)
.from_args(&args) .from_args(&args)
.unwrap() .unwrap()
.add_link_arg("-Wl,--whole-archive".into()) .link_staticlib(&dir, "libfuzzer_libpng".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())
.unwrap() .unwrap()
.add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into())
.unwrap(); .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(); cc.run().unwrap();
} else { } else {
panic!("LibAFL CC: No Arguments given"); panic!("LibAFL CC: No Arguments given");

View File

@ -1,4 +1,4 @@
use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; use libafl_cc::{ClangWrapper, CompilerWrapper};
use std::env; use std::env;
fn main() { fn main() {
@ -8,28 +8,13 @@ fn main() {
dir.pop(); dir.pop();
let mut cc = ClangWrapper::new("clang", "clang++"); let mut cc = ClangWrapper::new("clang", "clang++");
cc.from_args(&args) cc.is_cpp(false)
.from_args(&args)
.unwrap() .unwrap()
.add_link_arg("-Wl,--whole-archive".into()) .link_staticlib(&dir, "libfuzzer_libpng".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())
.unwrap() .unwrap()
.add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into())
.unwrap(); .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(); cc.run().unwrap();
} else { } else {
panic!("LibAFL CC: No Arguments given"); panic!("LibAFL CC: No Arguments given");

View File

@ -1,4 +1,4 @@
use libafl_cc::{ClangWrapper, CompilerWrapper, LIB_EXT, LIB_PREFIX}; use libafl_cc::{ClangWrapper, CompilerWrapper};
use std::env; use std::env;
fn main() { fn main() {
@ -8,29 +8,13 @@ fn main() {
dir.pop(); dir.pop();
let mut cc = ClangWrapper::new("clang", "clang++"); let mut cc = ClangWrapper::new("clang", "clang++");
cc.is_cpp() cc.is_cpp(true)
.from_args(&args) .from_args(&args)
.unwrap() .unwrap()
.add_link_arg("-Wl,--whole-archive".into()) .link_staticlib(&dir, "libfuzzer_libpng".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())
.unwrap() .unwrap()
.add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into()) .add_arg("-fsanitize-coverage=trace-pc-guard,trace-cmp".into())
.unwrap(); .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(); cc.run().unwrap();
} else { } else {
panic!("LibAFL CC: No Arguments given"); panic!("LibAFL CC: No Arguments given");

View File

@ -20,9 +20,6 @@ pub mod pipes;
#[cfg(all(unix, feature = "std"))] #[cfg(all(unix, feature = "std"))]
use std::ffi::CString; use std::ffi::CString;
#[cfg(all(feature = "std", any(target_os = "linux", target_os = "android")))]
use std::fs::File;
#[cfg(all(windows, feature = "std"))] #[cfg(all(windows, feature = "std"))]
pub mod windows_exceptions; pub mod windows_exceptions;

View File

@ -1,6 +1,6 @@
//! Compiler Wrapper from `LibAFL` //! 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 /// `LibAFL` CC Error Type
#[derive(Debug)] #[derive(Debug)]
@ -42,6 +42,9 @@ pub trait CompilerWrapper {
/// Add a compiler argument only when linking /// Add a compiler argument only when linking
fn add_link_arg(&mut self, arg: String) -> Result<&'_ mut Self, Error>; 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 /// Command to run the compiler
fn command(&mut self) -> Result<Vec<String>, Error>; fn command(&mut self) -> Result<Vec<String>, Error>;
@ -136,6 +139,14 @@ impl CompilerWrapper for ClangWrapper {
// Fuzzing define common among tools // Fuzzing define common among tools
new_args.push("-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1".into()); 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; self.base_args = new_args;
Ok(self) Ok(self)
} }
@ -155,6 +166,16 @@ impl CompilerWrapper for ClangWrapper {
Ok(self) 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<Vec<String>, Error> { fn command(&mut self) -> Result<Vec<String>, Error> {
let mut args = vec![]; let mut args = vec![];
if self.is_cpp { if self.is_cpp {
@ -207,9 +228,9 @@ impl ClangWrapper {
self self
} }
/// set cpp mode /// Set cpp mode
pub fn is_cpp(&mut self) -> &'_ mut Self { pub fn is_cpp(&mut self, value: bool) -> &'_ mut Self {
self.is_cpp = true; self.is_cpp = value;
self self
} }
} }