diff --git a/Cargo.lock b/Cargo.lock index 44e9a7b5741..2de96f72f98 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1416,7 +1416,7 @@ dependencies = [ [[package]] name = "object" version = "0.28.2" -source = "git+https://github.com/Amanieu/object?branch=wasmer#3dad33d218df5df57684e194bd97de61391ff0a1" +source = "git+https://github.com/gimli-rs/object#eea6c452114f84c14a31dc350c7937bd936dc0a5" dependencies = [ "crc32fast", "hashbrown 0.11.2", diff --git a/Cargo.toml b/Cargo.toml index 4525656f15d..62761e2458e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -296,4 +296,4 @@ path = "examples/features.rs" required-features = ["cranelift"] [patch.crates-io] -object = { git = "https://github.com/Amanieu/object", branch = "wasmer" } +object = { git = "https://github.com/gimli-rs/object" } diff --git a/lib/engine-dylib/src/artifact.rs b/lib/engine-dylib/src/artifact.rs index 7a483e9e14d..7165b4b1bb8 100644 --- a/lib/engine-dylib/src/artifact.rs +++ b/lib/engine-dylib/src/artifact.rs @@ -176,6 +176,8 @@ impl DylibArtifact { data: &[u8], tunables: &dyn Tunables, ) -> Result { + use object::{write::CoffExportStyle, BinaryFormat}; + let mut engine_inner = engine.inner_mut(); let target = engine.target(); let compiler = engine_inner.compiler()?; @@ -241,6 +243,9 @@ impl DylibArtifact { let mut obj = get_object_for_target(&target_triple).map_err(to_compile_error)?; emit_trampolines(&mut obj, engine.target()); + if obj.format() == BinaryFormat::Coff { + obj.add_coff_exports(CoffExportStyle::Gnu); + } let file = tempfile::Builder::new() .prefix("wasmer_dylib_") .suffix(".o") @@ -285,6 +290,9 @@ impl DylibArtifact { .map_err(to_compile_error)?; emit_compilation(&mut obj, compilation, &symbol_registry, &target_triple) .map_err(to_compile_error)?; + if obj.format() == BinaryFormat::Coff { + obj.add_coff_exports(CoffExportStyle::Gnu); + } let file = tempfile::Builder::new() .prefix("wasmer_dylib_") .suffix(".o") @@ -481,6 +489,13 @@ impl DylibArtifact { dylib_path: PathBuf, lib: Library, ) -> Result { + unsafe { + let trampolines_symbol: LibrarySymbol = lib + .get(WASMER_TRAMPOLINES_SYMBOL) + .expect("missing WASMER_TRAMPOLINES symbol"); + fill_trampoline_table(trampolines_symbol.into_raw().into_raw() as *mut usize); + } + let mut finished_functions: PrimaryMap = PrimaryMap::new(); for (function_local_index, _function_len) in metadata.function_body_lengths.iter() { @@ -665,15 +680,6 @@ impl DylibArtifact { let metadata = ModuleMetadata::deserialize(metadata_slice)?; - let trampolines_symbol: LibrarySymbol = - lib.get(WASMER_TRAMPOLINES_SYMBOL).map_err(|e| { - DeserializeError::CorruptedBinary(format!( - "The provided object file doesn't seem to be generated by Wasmer: {}", - e - )) - })?; - fill_trampoline_table(trampolines_symbol.into_raw().into_raw() as *mut usize); - let mut engine_inner = engine.inner_mut(); Self::from_parts(&mut engine_inner, metadata, shared_path, lib) diff --git a/tests/ignores.txt b/tests/ignores.txt index 54606e9ad5c..274020d2ce4 100644 --- a/tests/ignores.txt +++ b/tests/ignores.txt @@ -32,7 +32,6 @@ llvm traps::start_trap_pretty dylib traps::start_trap_pretty aarch64 traps::start_trap_pretty -cranelift multi_value_imports::dylib # Needs investigation singlepass multi_value_imports::dylib # Singlepass doesn't support multivalue singlepass multi_value_imports::dynamic # Singlepass doesn't support multivalue @@ -45,6 +44,7 @@ singlepass+windows spec::skip_stack_guard_page # Needs investigation. cranelift+windows spec::skip_stack_guard_page # Needs investigation. Issue: `STATUS_ACCESS_VIOLATION` trap happened cranelift+macos spec::skip_stack_guard_page # Needs investigation. process didn't exit successfully: (signal: 6, SIGABRT: process abort signal) llvm+macos spec::skip_stack_guard_page # Needs investigation. process didn't exit successfully: (signal: 6, SIGABRT: process abort signal) +dylib spec::skip_stack_guard_page # Missing trap information in dylibs # TODO(https://github.com/wasmerio/wasmer/issues/1727): Traps in dylib engine