diff --git a/crates/wasmtime/src/engine.rs b/crates/wasmtime/src/engine.rs index e940ae34d057..82dd651e093d 100644 --- a/crates/wasmtime/src/engine.rs +++ b/crates/wasmtime/src/engine.rs @@ -647,7 +647,12 @@ impl Engine { /// this will return `Some(...)` indicating so. Otherwise `None` is /// returned. pub fn detect_precompiled(&self, bytes: &[u8]) -> Option { - serialization::detect_precompiled(bytes) + serialization::detect_precompiled_bytes(bytes) + } + + /// Like [`Engine::detect_precompiled`], but performs the detection on a file. + pub fn detect_precompiled_file(&self, path: impl AsRef) -> Result> { + serialization::detect_precompiled_file(path) } } diff --git a/crates/wasmtime/src/engine/serialization.rs b/crates/wasmtime/src/engine/serialization.rs index 8aa35208b109..86cc6cb8e373 100644 --- a/crates/wasmtime/src/engine/serialization.rs +++ b/crates/wasmtime/src/engine/serialization.rs @@ -145,8 +145,9 @@ pub fn check_compatible(engine: &Engine, mmap: &MmapVec, expected: ObjectKind) - bincode::deserialize::(data)?.check_compatible(engine) } -pub fn detect_precompiled(bytes: &[u8]) -> Option { - let obj = File::parse(bytes).ok()?; +fn detect_precompiled<'data, R: object::ReadRef<'data>>( + obj: File<'data, R>, +) -> Option { match obj.flags() { FileFlags::Elf { os_abi: obj::ELFOSABI_WASMTIME, @@ -162,6 +163,16 @@ pub fn detect_precompiled(bytes: &[u8]) -> Option { } } +pub fn detect_precompiled_bytes(bytes: &[u8]) -> Option { + detect_precompiled(File::parse(bytes).ok()?) +} + +pub fn detect_precompiled_file(path: impl AsRef) -> Result> { + let read_cache = object::ReadCache::new(std::fs::File::open(path)?); + let obj = File::parse(&read_cache)?; + Ok(detect_precompiled(obj)) +} + #[derive(Serialize, Deserialize)] struct Metadata { target: String,