diff --git a/fuzzers/fuzzbench/src/bin/libafl_cc.rs b/fuzzers/fuzzbench/src/bin/libafl_cc.rs index 01af782ec8..9d4fc05945 100644 --- a/fuzzers/fuzzbench/src/bin/libafl_cc.rs +++ b/fuzzers/fuzzbench/src/bin/libafl_cc.rs @@ -21,7 +21,7 @@ pub fn main() { let mut cc = ClangWrapper::new(); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_vendor = "apple"))] cc.add_pass(LLVMPasses::AutoTokens); if let Some(code) = cc diff --git a/fuzzers/fuzzbench/src/lib.rs b/fuzzers/fuzzbench/src/lib.rs index 0eccd70dbc..d42fa03b0f 100644 --- a/fuzzers/fuzzbench/src/lib.rs +++ b/fuzzers/fuzzbench/src/lib.rs @@ -47,7 +47,7 @@ use libafl::{ state::{HasCorpus, HasMetadata, StdState}, Error, }; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_vendor = "apple"))] use libafl_targets::autotokens; use libafl_targets::{ libfuzzer_initialize, libfuzzer_test_one_input, CmpLogObserver, CMPLOG_MAP, EDGES_MAP, @@ -367,7 +367,7 @@ fn fuzz( if let Some(tokenfile) = tokenfile { toks.add_from_file(tokenfile)?; } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_vendor = "apple"))] { toks += autotokens()?; } diff --git a/fuzzers/fuzzbench_text/src/bin/libafl_cc.rs b/fuzzers/fuzzbench_text/src/bin/libafl_cc.rs index d0fded4e68..1a361ebe5d 100644 --- a/fuzzers/fuzzbench_text/src/bin/libafl_cc.rs +++ b/fuzzers/fuzzbench_text/src/bin/libafl_cc.rs @@ -18,7 +18,7 @@ pub fn main() { let mut cc = ClangWrapper::new(); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_vendor = "apple"))] cc.add_pass(LLVMPasses::AutoTokens); if let Some(code) = cc diff --git a/fuzzers/fuzzbench_text/src/lib.rs b/fuzzers/fuzzbench_text/src/lib.rs index e21ff8d11d..26100876b6 100644 --- a/fuzzers/fuzzbench_text/src/lib.rs +++ b/fuzzers/fuzzbench_text/src/lib.rs @@ -53,7 +53,7 @@ use libafl::{ state::{HasCorpus, HasMetadata, StdState}, Error, }; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_vendor = "apple"))] use libafl_targets::autotokens; use libafl_targets::{ libfuzzer_initialize, libfuzzer_test_one_input, CmpLogObserver, CMPLOG_MAP, EDGES_MAP, @@ -427,7 +427,7 @@ fn fuzz_binary( if let Some(tokenfile) = tokenfile { toks.add_from_file(tokenfile)?; } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_vendor = "apple"))] { toks += autotokens()?; } @@ -654,7 +654,7 @@ fn fuzz_text( if let Some(tokenfile) = tokenfile { toks.add_from_file(tokenfile)?; } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_vendor = "apple"))] { toks += autotokens()?; } diff --git a/fuzzers/fuzzbench_weighted/src/bin/libafl_cc.rs b/fuzzers/fuzzbench_weighted/src/bin/libafl_cc.rs index 01af782ec8..9d4fc05945 100644 --- a/fuzzers/fuzzbench_weighted/src/bin/libafl_cc.rs +++ b/fuzzers/fuzzbench_weighted/src/bin/libafl_cc.rs @@ -21,7 +21,7 @@ pub fn main() { let mut cc = ClangWrapper::new(); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_vendor = "apple"))] cc.add_pass(LLVMPasses::AutoTokens); if let Some(code) = cc diff --git a/fuzzers/fuzzbench_weighted/src/lib.rs b/fuzzers/fuzzbench_weighted/src/lib.rs index 7188e022c2..a4b1f3e312 100644 --- a/fuzzers/fuzzbench_weighted/src/lib.rs +++ b/fuzzers/fuzzbench_weighted/src/lib.rs @@ -47,7 +47,7 @@ use libafl::{ state::{HasCorpus, HasMetadata, StdState}, Error, }; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_vendor = "apple"))] use libafl_targets::autotokens; use libafl_targets::{ libfuzzer_initialize, libfuzzer_test_one_input, CmpLogObserver, CMPLOG_MAP, EDGES_MAP, @@ -368,7 +368,7 @@ fn fuzz( if let Some(tokenfile) = tokenfile { toks.add_from_file(tokenfile)?; } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_vendor = "apple"))] { toks += autotokens()?; } diff --git a/libafl/src/mutators/token_mutations.rs b/libafl/src/mutators/token_mutations.rs index a8ae5a8ae3..d33caa9df6 100644 --- a/libafl/src/mutators/token_mutations.rs +++ b/libafl/src/mutators/token_mutations.rs @@ -1,7 +1,7 @@ //! Tokens are what AFL calls extras or dictionaries. //! They may be inserted as part of mutations during fuzzing. use alloc::vec::Vec; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_vendor = "apple"))] use core::slice::from_raw_parts; use core::{ mem::size_of, @@ -105,7 +105,7 @@ impl Tokens { /// # Safety /// The caller must ensure that the region between `token_start` and `token_stop` /// is a valid region, containing autotokens in the exepcted format. - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_vendor = "apple"))] pub unsafe fn from_ptrs(token_start: *const u8, token_stop: *const u8) -> Result { let mut ret = Self::default(); if token_start.is_null() || token_stop.is_null() { diff --git a/libafl_cc/src/autotokens-pass.cc b/libafl_cc/src/autotokens-pass.cc index 760f9bb6d6..c4b6cdbc00 100644 --- a/libafl_cc/src/autotokens-pass.cc +++ b/libafl_cc/src/autotokens-pass.cc @@ -665,7 +665,11 @@ bool AutoTokensPass::runOnModule(Module &M) { ConstantDataArray::get(Ctx, *(new ArrayRef(ptrhld.get(), offset))), "libafl_dictionary_" + M.getName()); +#if defined(__linux__) dict->setSection("libafl_token"); +#elif defined(__APPLE__) + dict->setSection("__DATA,__libafl_token"); +#endif } } diff --git a/libafl_targets/src/coverage.c b/libafl_targets/src/coverage.c index 9d3149b939..e3a8183e57 100644 --- a/libafl_targets/src/coverage.c +++ b/libafl_targets/src/coverage.c @@ -9,19 +9,27 @@ typedef uint32_t prev_loc_t; #define CTX_MAX_K 32U extern uint8_t __afl_area_ptr_local[EDGES_MAP_SIZE]; -uint8_t* __afl_area_ptr = __afl_area_ptr_local; +uint8_t *__afl_area_ptr = __afl_area_ptr_local; extern uint32_t __afl_acc_memop_ptr_local[ACCOUNTING_MAP_SIZE]; -uint32_t* __afl_acc_memop_ptr = __afl_acc_memop_ptr_local; +uint32_t *__afl_acc_memop_ptr = __afl_acc_memop_ptr_local; // Weak symbols, LLVM Passes overwrites them if we really use it -#ifdef __linux__ +#if defined(__linux__) extern EXT_VAR(__start_libafl_token, uint8_t); extern EXT_VAR(__stop_libafl_token, uint8_t); +#elif defined(__APPLE__) +extern uint8_t __start_libafl_token __asm( + "section$start$__DATA$__libafl_token"); +extern uint8_t __stop_libafl_token __asm("section$end$__DATA$__libafl_token"); +#endif + +#if defined(__linux__) || defined(__APPLE__) // Expose the start of libafl_token section as C symbols -uint8_t* __token_start = &__start_libafl_token; -uint8_t* __token_stop = &__stop_libafl_token; +uint8_t *__token_start = &__start_libafl_token; +uint8_t *__token_stop = &__stop_libafl_token; + #endif //#if defined(__ANDROID__) || defined(__HAIKU__) diff --git a/libafl_targets/src/coverage.rs b/libafl_targets/src/coverage.rs index 8e2e4ca1aa..e8e749761e 100644 --- a/libafl_targets/src/coverage.rs +++ b/libafl_targets/src/coverage.rs @@ -1,6 +1,6 @@ //! Coverage maps as static mut array -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_vendor = "apple"))] use libafl::{mutators::Tokens, Error}; use crate::{ACCOUNTING_MAP_SIZE, EDGES_MAP_SIZE}; @@ -26,11 +26,11 @@ extern "C" { pub static mut __afl_acc_memop_ptr: *mut u32; /// Start of libafl token section - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_vendor = "apple"))] pub static __token_start: *const u8; /// End of libafl token section - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_vendor = "apple"))] pub static __token_stop: *const u8; } pub use __afl_acc_memop_ptr as ACCOUNTING_MEMOP_MAP_PTR; @@ -43,7 +43,7 @@ pub use __afl_area_ptr as EDGES_MAP_PTR; /// # Safety /// /// This fn is safe to call, as long as the compilation did not break, previously -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_vendor = "apple"))] pub fn autotokens() -> Result { unsafe { if __token_start.is_null() || __token_stop.is_null() {