diff --git a/crates/linker/src/generate_dylib/pe.rs b/crates/linker/src/generate_dylib/pe.rs index 321706db99..7051d5d926 100644 --- a/crates/linker/src/generate_dylib/pe.rs +++ b/crates/linker/src/generate_dylib/pe.rs @@ -14,7 +14,11 @@ fn synthetic_image_export_directory( let start = virtual_address + directory_size + name.len() as u32 + 1; let address_of_functions = start; - let address_of_names = address_of_functions + 4 * custom_names.len() as u32; + + // by convention, names start at index, so we add one "padding" name + let number_of_functions = custom_names.len() as u32 + 1; + + let address_of_names = address_of_functions + 4 * number_of_functions; let address_of_name_ordinals = address_of_names + 4 * custom_names.len() as u32; pe::ImageExportDirectory { @@ -24,7 +28,7 @@ fn synthetic_image_export_directory( minor_version: U16::new(LE, 0), name: U32::new(LE, virtual_address + directory_size), base: U32::new(LE, 0), - number_of_functions: U32::new(LE, custom_names.len() as u32), + number_of_functions: U32::new(LE, number_of_functions), number_of_names: U32::new(LE, custom_names.len() as u32), address_of_functions: U32::new(LE, address_of_functions), address_of_names: U32::new(LE, address_of_names), @@ -50,15 +54,38 @@ fn synthetic_export_dir(virtual_address: u32, custom_names: &[String]) -> Vec Vec