From edb6b509c249e58261968ce0624802aeea53171f Mon Sep 17 00:00:00 2001 From: Romain Malmain Date: Mon, 13 May 2024 11:58:19 +0200 Subject: [PATCH] Generate stub bindings less aggressively. (#2164) Emit warning when using runtime files for an incompatible architecture. --- libafl_qemu/build_linux.rs | 10 +++--- libafl_qemu/libafl_qemu_build/Cargo.toml | 1 + libafl_qemu/libafl_qemu_build/src/lib.rs | 26 +++++++++++++++ libafl_qemu/libafl_qemu_sys/build_linux.rs | 33 +------------------ .../src/x86_64_stub_bindings.rs | 1 - libafl_qemu/runtime/libafl_qemu.h | 10 +++--- 6 files changed, 39 insertions(+), 42 deletions(-) diff --git a/libafl_qemu/build_linux.rs b/libafl_qemu/build_linux.rs index bca4fd97c0..4ec63e82e2 100644 --- a/libafl_qemu/build_linux.rs +++ b/libafl_qemu/build_linux.rs @@ -4,6 +4,8 @@ use std::{ process::Command, }; +use libafl_qemu_build::maybe_generate_stub_bindings; + #[allow(clippy::too_many_lines)] pub fn build() { // Note: Unique features are checked in libafl_qemu_sys @@ -114,11 +116,11 @@ pub fn build() { .write_to_file(&runtime_bindings_file) .expect("Could not write bindings."); - libafl_qemu_build::store_generated_content_if_different( + maybe_generate_stub_bindings( + &cpu_target, + &emulation_mode, &stub_runtime_bindings_file, - fs::read(&runtime_bindings_file) - .expect("Could not read generated bindings file") - .as_slice(), + &runtime_bindings_file ); if (emulation_mode == "usermode") && (qemu_asan || qemu_asan_guest) { diff --git a/libafl_qemu/libafl_qemu_build/Cargo.toml b/libafl_qemu/libafl_qemu_build/Cargo.toml index e864e4c0d3..9ce6e047ee 100644 --- a/libafl_qemu/libafl_qemu_build/Cargo.toml +++ b/libafl_qemu/libafl_qemu_build/Cargo.toml @@ -36,3 +36,4 @@ shell-words = "1.1" pkg-config = "0.3.26" cc = "1.0" regex = "1" +rustversion = "1.0" diff --git a/libafl_qemu/libafl_qemu_build/src/lib.rs b/libafl_qemu/libafl_qemu_build/src/lib.rs index bb013f1d23..fcb7de8d32 100644 --- a/libafl_qemu/libafl_qemu_build/src/lib.rs +++ b/libafl_qemu/libafl_qemu_build/src/lib.rs @@ -292,3 +292,29 @@ pub fn store_generated_content_if_different(file_to_update: &PathBuf, fresh_cont .unwrap_or_else(|_| panic!("Unable to write in {}", file_to_update.display())); } } +#[rustversion::nightly] +pub fn maybe_generate_stub_bindings( + cpu_target: &str, + emulation_mode: &str, + stub_bindings_file: &PathBuf, + bindings_file: &PathBuf, +) { + if cpu_target == "x86_64" && emulation_mode == "usermode" { + store_generated_content_if_different( + stub_bindings_file, + fs::read(bindings_file) + .expect("Could not read generated bindings file") + .as_slice(), + ); + } +} + +#[rustversion::not(nightly)] +pub fn maybe_generate_stub_bindings( + _cpu_target: &str, + _emulation_mode: &str, + _stub_bindings_file: &PathBuf, + _bindings_file: &PathBuf, +) { + // Do nothing +} diff --git a/libafl_qemu/libafl_qemu_sys/build_linux.rs b/libafl_qemu/libafl_qemu_sys/build_linux.rs index 0a312462e9..7fc92c4fe7 100644 --- a/libafl_qemu/libafl_qemu_sys/build_linux.rs +++ b/libafl_qemu/libafl_qemu_sys/build_linux.rs @@ -1,10 +1,6 @@ -#[rustversion::nightly] -use std::fs; use std::{env, fs::copy, path::PathBuf}; -use libafl_qemu_build::build_with_bindings; -#[rustversion::nightly] -use libafl_qemu_build::store_generated_content_if_different; +use libafl_qemu_build::{build_with_bindings, maybe_generate_stub_bindings}; #[macro_export] macro_rules! assert_unique_feature { @@ -18,33 +14,6 @@ macro_rules! assert_unique_feature { } } -#[rustversion::nightly] -fn maybe_generate_stub_bindings( - cpu_target: &str, - emulation_mode: &str, - stub_bindings_file: &PathBuf, - bindings_file: &PathBuf, -) { - if cpu_target == "x86_64" && emulation_mode == "usermode" { - store_generated_content_if_different( - stub_bindings_file, - fs::read(bindings_file) - .expect("Could not read generated bindings file") - .as_slice(), - ); - } -} - -#[rustversion::not(nightly)] -fn maybe_generate_stub_bindings( - _cpu_target: &str, - _emulation_mode: &str, - _stub_bindings_file: &PathBuf, - _bindings_file: &PathBuf, -) { - // Do nothing -} - pub fn build() { println!(r#"cargo::rustc-check-cfg=cfg(emulation_mode, values("usermode", "systemmode"))"#); println!( diff --git a/libafl_qemu/libafl_qemu_sys/src/x86_64_stub_bindings.rs b/libafl_qemu/libafl_qemu_sys/src/x86_64_stub_bindings.rs index 8e1cd142f4..22f43e20da 100644 --- a/libafl_qemu/libafl_qemu_sys/src/x86_64_stub_bindings.rs +++ b/libafl_qemu/libafl_qemu_sys/src/x86_64_stub_bindings.rs @@ -2340,7 +2340,6 @@ pub type DeviceReset = ::std::option::Option