Add build option for FuzzerInterceptors (#3049)

* Add build option for FuzzerInterceptors

* Add removed whole_archive feature

---------

Co-authored-by: Rowan Hart <rowanhart@microsoft.com>
This commit is contained in:
Rowan Hart 2025-03-09 13:13:05 -07:00 committed by GitHub
parent 620500e295
commit b8387daa0f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -103,6 +103,11 @@ fn main() {
common.define("DEFAULT_SANITIZERS_OPTIONS", "1"); common.define("DEFAULT_SANITIZERS_OPTIONS", "1");
} }
#[cfg(feature = "whole_archive")]
{
common.link_lib_modifier("+whole-archive");
}
common.file(src_dir.join("common.c")).compile("common"); common.file(src_dir.join("common.c")).compile("common");
} }
@ -132,6 +137,11 @@ fn main() {
println!("cargo:rustc-link-arg=-Wl,--undefined=__sanitizer_weak_hook_strcasecmp"); println!("cargo:rustc-link-arg=-Wl,--undefined=__sanitizer_weak_hook_strcasecmp");
} }
#[cfg(feature = "whole_archive")]
{
sancov_cmp.link_lib_modifier("+whole-archive");
}
sancov_cmp sancov_cmp
.define("CMP_MAP_SIZE", Some(&*format!("{cmp_map_size}"))) .define("CMP_MAP_SIZE", Some(&*format!("{cmp_map_size}")))
.define("CMPLOG_MAP_W", Some(&*format!("{cmplog_map_w}"))) .define("CMPLOG_MAP_W", Some(&*format!("{cmplog_map_w}")))
@ -164,14 +174,27 @@ fn main() {
#[cfg(feature = "libfuzzer_define_run_driver")] #[cfg(feature = "libfuzzer_define_run_driver")]
libfuzzer.define("FUZZER_DEFINE_RUN_DRIVER", "1"); libfuzzer.define("FUZZER_DEFINE_RUN_DRIVER", "1");
#[cfg(feature = "whole_archive")]
{
libfuzzer.link_lib_modifier("+whole-archive");
}
libfuzzer.compile("libfuzzer"); libfuzzer.compile("libfuzzer");
} }
#[cfg(feature = "coverage")] #[cfg(feature = "coverage")]
{ {
println!("cargo:rerun-if-changed=src/coverage.c"); println!("cargo:rerun-if-changed=src/coverage.c");
cc::Build::new() let mut coverage = cc::Build::new();
#[cfg(feature = "whole_archive")]
{
coverage.link_lib_modifier("+whole-archive");
}
coverage
.file(src_dir.join("coverage.c")) .file(src_dir.join("coverage.c"))
.define( .define(
"EDGES_MAP_ALLOCATED_SIZE", "EDGES_MAP_ALLOCATED_SIZE",
@ -189,12 +212,17 @@ fn main() {
#[cfg(unix)] #[cfg(unix)]
{ {
let mut cc = cc::Build::new(); let mut cmplog = cc::Build::new();
#[cfg(feature = "cmplog_extended_instrumentation")] #[cfg(feature = "cmplog_extended_instrumentation")]
cc.define("CMPLOG_EXTENDED", Some("1")); cmplog.define("CMPLOG_EXTENDED", Some("1"));
cc.flag("-Wno-pointer-sign") // UNIX ONLY FLAGS #[cfg(feature = "whole_archive")]
{
cmplog.link_lib_modifier("+whole-archive");
}
cmplog.flag("-Wno-pointer-sign") // UNIX ONLY FLAGS
.flag("-Wno-sign-compare") .flag("-Wno-sign-compare")
.define("CMP_MAP_SIZE", Some(&*format!("{cmp_map_size}"))) .define("CMP_MAP_SIZE", Some(&*format!("{cmp_map_size}")))
.define("CMPLOG_MAP_W", Some(&*format!("{cmplog_map_w}"))) .define("CMPLOG_MAP_W", Some(&*format!("{cmplog_map_w}")))
@ -205,7 +233,14 @@ fn main() {
#[cfg(not(unix))] #[cfg(not(unix))]
{ {
cc::Build::new() let mut cmplog = cc::Build::new();
#[cfg(feature = "whole_archive")]
{
cmplog.link_lib_modifier("+whole-archive");
}
cmplog
.define("CMP_MAP_SIZE", Some(&*format!("{cmp_map_size}"))) .define("CMP_MAP_SIZE", Some(&*format!("{cmp_map_size}")))
.define("CMPLOG_MAP_W", Some(&*format!("{cmplog_map_w}"))) .define("CMPLOG_MAP_W", Some(&*format!("{cmplog_map_w}")))
.define("CMPLOG_MAP_H", Some(&*format!("{cmplog_map_h}"))) .define("CMPLOG_MAP_H", Some(&*format!("{cmplog_map_h}")))
@ -222,7 +257,14 @@ fn main() {
if target_family == "unix" { if target_family == "unix" {
println!("cargo:rerun-if-changed=src/forkserver.c"); println!("cargo:rerun-if-changed=src/forkserver.c");
cc::Build::new() let mut forkserver = cc::Build::new();
#[cfg(feature = "whole_archive")]
{
forkserver.link_lib_modifier("+whole-archive");
}
forkserver
.file(src_dir.join("forkserver.c")) .file(src_dir.join("forkserver.c"))
.compile("forkserver"); .compile("forkserver");
} }
@ -232,7 +274,14 @@ fn main() {
if target_family == "windows" { if target_family == "windows" {
println!("cargo:rerun-if-changed=src/windows_asan.c"); println!("cargo:rerun-if-changed=src/windows_asan.c");
cc::Build::new() let mut windows_asan = cc::Build::new();
#[cfg(feature = "whole_archive")]
{
windows_asan.link_lib_modifier("+whole-archive");
}
windows_asan
.file(src_dir.join("windows_asan.c")) .file(src_dir.join("windows_asan.c"))
.compile("windows_asan"); .compile("windows_asan");
} }
@ -259,6 +308,21 @@ fn main() {
write!(file, "").unwrap(); write!(file, "").unwrap();
} }
#[cfg(feature = "libfuzzer_interceptors")]
{
println!("cargo:rerun-if-changed=src/libfuzzer/FuzzerInterceptors.cpp");
let mut libfuzzer_interceptors = cc::Build::new();
libfuzzer_interceptors.file(src_dir.join("libfuzzer/FuzzerInterceptors.cpp"));
#[cfg(feature = "whole_archive")]
{
libfuzzer_interceptors.link_lib_modifier("+whole-archive");
}
libfuzzer_interceptors.cpp(true).compile("interceptors");
}
println!("cargo:rustc-link-search=native={}", &out_dir); println!("cargo:rustc-link-search=native={}", &out_dir);
println!("cargo:rerun-if-changed=build.rs"); println!("cargo:rerun-if-changed=build.rs");