diff --git a/crates/examples/src/bin/elftoefi.rs b/crates/examples/src/bin/elftoefi.rs index 46ac4e3..61634af 100644 --- a/crates/examples/src/bin/elftoefi.rs +++ b/crates/examples/src/bin/elftoefi.rs @@ -336,7 +336,7 @@ fn copy_file>( major_subsystem_version: 0, minor_subsystem_version: 0, subsystem: pe::IMAGE_SUBSYSTEM_EFI_APPLICATION, - dll_characteristics: 0, + dll_characteristics: pe::DllFlags(0), size_of_stack_reserve: 0, size_of_stack_commit: 0, size_of_heap_reserve: 0, diff --git a/crates/examples/src/readobj/pe.rs b/crates/examples/src/readobj/pe.rs index af6c17f..5ac283f 100644 --- a/crates/examples/src/readobj/pe.rs +++ b/crates/examples/src/readobj/pe.rs @@ -49,12 +49,20 @@ pub(super) fn print_coff_import(p: &mut Printer<'_>, data: &[u8]) { p.field_hex("Signature1", header.sig1.get(LE)); p.field_hex("Signature2", header.sig2.get(LE)); p.field("Version", header.version.get(LE)); - p.field_enum("Machine", header.machine.get(LE), FLAGS_IMAGE_FILE_MACHINE); + p.field_consts("Machine", header.machine.get(LE), Machine::NAMES); p.field("TimeDateStamp", header.time_date_stamp.get(LE)); p.field_hex("SizeOfData", header.size_of_data.get(LE)); p.field("OrdinalOrHint", header.ordinal_or_hint.get(LE)); - p.field_enum("ImportType", header.import_type(), FLAGS_IMAGE_OBJECT_TYPE); - p.field_enum("NameType", header.name_type(), FLAGS_IMAGE_OBJECT_NAME); + p.field_consts( + "ImportType", + header.import_type(), + pe::ImportObjectType::NAMES, + ); + p.field_consts( + "NameType", + header.name_type(), + pe::ImportObjectNameType::NAMES, + ); if let Some(data) = header.parse_data(data, &mut offset).print_err(p) { p.field_inline_string("Symbol", data.symbol()); p.field_inline_string("Dll", data.dll()); @@ -160,7 +168,7 @@ fn print_file(p: &mut Printer<'_>, header: &ImageFileHeader) { return; } p.group("ImageFileHeader", |p| { - p.field_enum("Machine", header.machine.get(LE), FLAGS_IMAGE_FILE_MACHINE); + p.field_consts("Machine", header.machine.get(LE), Machine::NAMES); p.field("NumberOfSections", header.number_of_sections.get(LE)); p.field("TimeDateStamp", header.time_date_stamp.get(LE)); p.field_hex( @@ -172,8 +180,11 @@ fn print_file(p: &mut Printer<'_>, header: &ImageFileHeader) { "SizeOfOptionalHeader", header.size_of_optional_header.get(LE), ); - p.field_hex("Characteristics", header.characteristics.get(LE)); - p.flags(header.characteristics.get(LE), 0, FLAGS_IMAGE_FILE); + p.field_flags( + "Characteristics", + header.characteristics.get(LE), + FileFlags::NAMES, + ); }); } @@ -212,12 +223,11 @@ fn print_optional(p: &mut Printer<'_>, header: &impl ImageOptionalHeader) { p.field_hex("SizeOfImage", header.size_of_image()); p.field_hex("SizeOfHeaders", header.size_of_headers()); p.field_hex("CheckSum", header.check_sum()); - p.field_enum("Subsystem", header.subsystem(), FLAGS_IMAGE_SUBSYSTEM); - p.field_hex("DllCharacteristics", header.dll_characteristics()); - p.flags( + p.field_consts("Subsystem", header.subsystem(), Subsystem::NAMES); + p.field_flags( + "DllCharacteristics", header.dll_characteristics(), - 0, - FLAGS_IMAGE_DLLCHARACTERISTICS, + DllFlags::NAMES, ); p.field_hex("SizeOfStackReserve", header.size_of_stack_reserve()); p.field_hex("SizeOfStackCommit", header.size_of_stack_commit()); @@ -234,7 +244,7 @@ fn print_data_directories(p: &mut Printer<'_>, data_directories: &DataDirectorie } for (index, dir) in data_directories.iter().enumerate() { p.group("ImageDataDirectory", |p| { - p.field_enum("Index", index, FLAGS_IMAGE_DIRECTORY_ENTRY); + p.field_consts("Index", index, NAMES_DIRECTORY_ENTRY); p.field_hex("VirtualAddress", dir.virtual_address.get(LE)); p.field_hex("Size", dir.size.get(LE)); }); @@ -249,7 +259,7 @@ fn print_bigobj(p: &mut Printer<'_>, header: &AnonObjectHeaderBigobj) { p.field_hex("Signature1", header.sig1.get(LE)); p.field_hex("Signature2", header.sig2.get(LE)); p.field("Version", header.version.get(LE)); - p.field_enum("Machine", header.machine.get(LE), FLAGS_IMAGE_FILE_MACHINE); + p.field_consts("Machine", header.machine.get(LE), Machine::NAMES); p.field("TimeDateStamp", header.time_date_stamp.get(LE)); p.field( "ClassId", @@ -540,7 +550,7 @@ fn print_resource_table( } ResourceNameOrId::Id(id) => { if level == 0 { - p.field_enum("NameOrId", id, FLAGS_RT); + p.field_consts("NameOrId", id, NAMES_RT); } else { p.field("NameOrId", id); } @@ -573,7 +583,7 @@ fn print_resource_table( fn print_sections<'data, Coff: CoffHeader>( p: &mut Printer<'_>, data: &[u8], - machine: u16, + machine: pe::Machine, symbols: Option<&SymbolTable<'data, &'data [u8], Coff>>, sections: &SectionTable, ) { @@ -610,16 +620,11 @@ fn print_sections<'data, Coff: CoffHeader>( ); p.field("NumberOfRelocations", section.number_of_relocations.get(LE)); p.field("NumberOfLinenumbers", section.number_of_linenumbers.get(LE)); - p.field_hex("Characteristics", section.characteristics.get(LE)); - p.flags(section.characteristics.get(LE), 0, FLAGS_IMAGE_SCN); - // 0 means no alignment flag. - if section.characteristics.get(LE) & IMAGE_SCN_ALIGN_MASK != 0 { - p.flags( - section.characteristics.get(LE), - IMAGE_SCN_ALIGN_MASK, - FLAGS_IMAGE_SCN_ALIGN, - ); - } + p.field_flags( + "Characteristics", + section.characteristics.get(LE), + SectionFlags::NAMES, + ); } print_relocations(p, data, machine, symbols, section); }); @@ -629,7 +634,7 @@ fn print_sections<'data, Coff: CoffHeader>( fn print_relocations<'data, Coff: CoffHeader>( p: &mut Printer<'_>, data: &[u8], - machine: u16, + machine: pe::Machine, symbols: Option<&SymbolTable<'data, &'data [u8], Coff>>, section: &ImageSectionHeader, ) { @@ -682,15 +687,17 @@ fn print_symbols<'data, Coff: CoffHeader>( }); p.field_string_option("Section", section_index.0, section_name); } else { - p.field_enum_display("Section", symbol.section_number(), FLAGS_IMAGE_SYM); + p.field_consts_display( + "Section", + symbol.section_number(), + pe::SymbolSection::NAMES, + ); } - p.field_hex("Type", symbol.typ()); - p.field_enum("BaseType", symbol.base_type(), FLAGS_IMAGE_SYM_TYPE); - p.field_enum("DerivedType", symbol.derived_type(), FLAGS_IMAGE_SYM_DTYPE); - p.field_enum( + p.field_flags("Type", symbol.typ(), pe::SymbolType::NAMES); + p.field_consts( "StorageClass", symbol.storage_class(), - FLAGS_IMAGE_SYM_CLASS, + pe::SymbolClass::NAMES, ); p.field_hex("NumberOfAuxSymbols", symbol.number_of_aux_symbols()); if symbol.has_aux_file_name() @@ -725,7 +732,7 @@ fn print_symbols<'data, Coff: CoffHeader>( p.field("NumberOfLinenumbers", aux.number_of_linenumbers.get(LE)); p.field_hex("CheckSum", aux.check_sum.get(LE)); p.field("Number", aux.number.get(LE)); - p.field_enum("Selection", aux.selection, FLAGS_IMAGE_COMDAT_SELECT); + p.field_consts("Selection", aux.selection, pe::ComdatSelection::NAMES); p.field_hex("Reserved", aux.reserved); p.field("HighNumber", aux.high_number.get(LE)); }); @@ -740,10 +747,10 @@ fn print_symbols<'data, Coff: CoffHeader>( .and_then(|symbol| symbol.name(symbols.strings())) .print_err(p); p.field_string_option("DefaultSymbol", index.0, name); - p.field_enum( + p.field_consts( "SearchType", aux.weak_search_type.get(LE), - FLAGS_IMAGE_WEAK_EXTERN, + pe::WeakExternSearch::NAMES, ); }); } @@ -755,7 +762,7 @@ fn print_symbols<'data, Coff: CoffHeader>( fn print_reloc_dir( p: &mut Printer<'_>, data: &[u8], - machine: u16, + machine: pe::Machine, sections: &SectionTable, data_directories: &DataDirectories, ) -> Option<()> { @@ -790,251 +797,3 @@ fn print_reloc_dir( } Some(()) } - -const FLAGS_IMAGE_FILE: &[Flag] = &flags!( - IMAGE_FILE_RELOCS_STRIPPED, - IMAGE_FILE_EXECUTABLE_IMAGE, - IMAGE_FILE_LINE_NUMS_STRIPPED, - IMAGE_FILE_LOCAL_SYMS_STRIPPED, - IMAGE_FILE_AGGRESIVE_WS_TRIM, - IMAGE_FILE_LARGE_ADDRESS_AWARE, - IMAGE_FILE_BYTES_REVERSED_LO, - IMAGE_FILE_32BIT_MACHINE, - IMAGE_FILE_DEBUG_STRIPPED, - IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP, - IMAGE_FILE_NET_RUN_FROM_SWAP, - IMAGE_FILE_SYSTEM, - IMAGE_FILE_DLL, - IMAGE_FILE_UP_SYSTEM_ONLY, - IMAGE_FILE_BYTES_REVERSED_HI, -); -const FLAGS_IMAGE_FILE_MACHINE: &[Flag] = &flags!( - IMAGE_FILE_MACHINE_UNKNOWN, - IMAGE_FILE_MACHINE_TARGET_HOST, - IMAGE_FILE_MACHINE_I386, - IMAGE_FILE_MACHINE_R3000, - IMAGE_FILE_MACHINE_R4000, - IMAGE_FILE_MACHINE_R10000, - IMAGE_FILE_MACHINE_WCEMIPSV2, - IMAGE_FILE_MACHINE_ALPHA, - IMAGE_FILE_MACHINE_SH3, - IMAGE_FILE_MACHINE_SH3DSP, - IMAGE_FILE_MACHINE_SH3E, - IMAGE_FILE_MACHINE_SH4, - IMAGE_FILE_MACHINE_SH5, - IMAGE_FILE_MACHINE_ARM, - IMAGE_FILE_MACHINE_THUMB, - IMAGE_FILE_MACHINE_ARMNT, - IMAGE_FILE_MACHINE_AM33, - IMAGE_FILE_MACHINE_POWERPC, - IMAGE_FILE_MACHINE_POWERPCFP, - IMAGE_FILE_MACHINE_IA64, - IMAGE_FILE_MACHINE_MIPS16, - IMAGE_FILE_MACHINE_ALPHA64, - IMAGE_FILE_MACHINE_MIPSFPU, - IMAGE_FILE_MACHINE_MIPSFPU16, - IMAGE_FILE_MACHINE_AXP64, - IMAGE_FILE_MACHINE_TRICORE, - IMAGE_FILE_MACHINE_CEF, - IMAGE_FILE_MACHINE_EBC, - IMAGE_FILE_MACHINE_AMD64, - IMAGE_FILE_MACHINE_M32R, - IMAGE_FILE_MACHINE_ARM64, - IMAGE_FILE_MACHINE_ARM64EC, - IMAGE_FILE_MACHINE_CEE, - IMAGE_FILE_MACHINE_RISCV32, - IMAGE_FILE_MACHINE_RISCV64, - IMAGE_FILE_MACHINE_RISCV128, -); -const FLAGS_IMAGE_SCN: &[Flag] = &flags!( - IMAGE_SCN_TYPE_NO_PAD, - IMAGE_SCN_CNT_CODE, - IMAGE_SCN_CNT_INITIALIZED_DATA, - IMAGE_SCN_CNT_UNINITIALIZED_DATA, - IMAGE_SCN_LNK_OTHER, - IMAGE_SCN_LNK_INFO, - IMAGE_SCN_LNK_REMOVE, - IMAGE_SCN_LNK_COMDAT, - IMAGE_SCN_NO_DEFER_SPEC_EXC, - IMAGE_SCN_GPREL, - IMAGE_SCN_MEM_FARDATA, - IMAGE_SCN_MEM_PURGEABLE, - IMAGE_SCN_MEM_16BIT, - IMAGE_SCN_MEM_LOCKED, - IMAGE_SCN_MEM_PRELOAD, - IMAGE_SCN_LNK_NRELOC_OVFL, - IMAGE_SCN_MEM_DISCARDABLE, - IMAGE_SCN_MEM_NOT_CACHED, - IMAGE_SCN_MEM_NOT_PAGED, - IMAGE_SCN_MEM_SHARED, - IMAGE_SCN_MEM_EXECUTE, - IMAGE_SCN_MEM_READ, - IMAGE_SCN_MEM_WRITE, -); -const FLAGS_IMAGE_SCN_ALIGN: &[Flag] = &flags!( - IMAGE_SCN_ALIGN_1BYTES, - IMAGE_SCN_ALIGN_2BYTES, - IMAGE_SCN_ALIGN_4BYTES, - IMAGE_SCN_ALIGN_8BYTES, - IMAGE_SCN_ALIGN_16BYTES, - IMAGE_SCN_ALIGN_32BYTES, - IMAGE_SCN_ALIGN_64BYTES, - IMAGE_SCN_ALIGN_128BYTES, - IMAGE_SCN_ALIGN_256BYTES, - IMAGE_SCN_ALIGN_512BYTES, - IMAGE_SCN_ALIGN_1024BYTES, - IMAGE_SCN_ALIGN_2048BYTES, - IMAGE_SCN_ALIGN_4096BYTES, - IMAGE_SCN_ALIGN_8192BYTES, -); -const FLAGS_IMAGE_SYM: &[Flag] = - &flags!(IMAGE_SYM_UNDEFINED, IMAGE_SYM_ABSOLUTE, IMAGE_SYM_DEBUG,); -const FLAGS_IMAGE_SYM_TYPE: &[Flag] = &flags!( - IMAGE_SYM_TYPE_NULL, - IMAGE_SYM_TYPE_VOID, - IMAGE_SYM_TYPE_CHAR, - IMAGE_SYM_TYPE_SHORT, - IMAGE_SYM_TYPE_INT, - IMAGE_SYM_TYPE_LONG, - IMAGE_SYM_TYPE_FLOAT, - IMAGE_SYM_TYPE_DOUBLE, - IMAGE_SYM_TYPE_STRUCT, - IMAGE_SYM_TYPE_UNION, - IMAGE_SYM_TYPE_ENUM, - IMAGE_SYM_TYPE_MOE, - IMAGE_SYM_TYPE_BYTE, - IMAGE_SYM_TYPE_WORD, - IMAGE_SYM_TYPE_UINT, - IMAGE_SYM_TYPE_DWORD, - IMAGE_SYM_TYPE_PCODE, -); -const FLAGS_IMAGE_SYM_DTYPE: &[Flag] = &flags!( - IMAGE_SYM_DTYPE_NULL, - IMAGE_SYM_DTYPE_POINTER, - IMAGE_SYM_DTYPE_FUNCTION, - IMAGE_SYM_DTYPE_ARRAY, -); -const FLAGS_IMAGE_SYM_CLASS: &[Flag] = &flags!( - IMAGE_SYM_CLASS_END_OF_FUNCTION, - IMAGE_SYM_CLASS_NULL, - IMAGE_SYM_CLASS_AUTOMATIC, - IMAGE_SYM_CLASS_EXTERNAL, - IMAGE_SYM_CLASS_STATIC, - IMAGE_SYM_CLASS_REGISTER, - IMAGE_SYM_CLASS_EXTERNAL_DEF, - IMAGE_SYM_CLASS_LABEL, - IMAGE_SYM_CLASS_UNDEFINED_LABEL, - IMAGE_SYM_CLASS_MEMBER_OF_STRUCT, - IMAGE_SYM_CLASS_ARGUMENT, - IMAGE_SYM_CLASS_STRUCT_TAG, - IMAGE_SYM_CLASS_MEMBER_OF_UNION, - IMAGE_SYM_CLASS_UNION_TAG, - IMAGE_SYM_CLASS_TYPE_DEFINITION, - IMAGE_SYM_CLASS_UNDEFINED_STATIC, - IMAGE_SYM_CLASS_ENUM_TAG, - IMAGE_SYM_CLASS_MEMBER_OF_ENUM, - IMAGE_SYM_CLASS_REGISTER_PARAM, - IMAGE_SYM_CLASS_BIT_FIELD, - IMAGE_SYM_CLASS_FAR_EXTERNAL, - IMAGE_SYM_CLASS_BLOCK, - IMAGE_SYM_CLASS_FUNCTION, - IMAGE_SYM_CLASS_END_OF_STRUCT, - IMAGE_SYM_CLASS_FILE, - IMAGE_SYM_CLASS_SECTION, - IMAGE_SYM_CLASS_WEAK_EXTERNAL, - IMAGE_SYM_CLASS_CLR_TOKEN, -); -const FLAGS_IMAGE_COMDAT_SELECT: &[Flag] = &flags!( - IMAGE_COMDAT_SELECT_NODUPLICATES, - IMAGE_COMDAT_SELECT_ANY, - IMAGE_COMDAT_SELECT_SAME_SIZE, - IMAGE_COMDAT_SELECT_EXACT_MATCH, - IMAGE_COMDAT_SELECT_ASSOCIATIVE, - IMAGE_COMDAT_SELECT_LARGEST, - IMAGE_COMDAT_SELECT_NEWEST, -); -const FLAGS_IMAGE_WEAK_EXTERN: &[Flag] = &flags!( - IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY, - IMAGE_WEAK_EXTERN_SEARCH_LIBRARY, - IMAGE_WEAK_EXTERN_SEARCH_ALIAS, - IMAGE_WEAK_EXTERN_ANTI_DEPENDENCY, -); -const FLAGS_IMAGE_SUBSYSTEM: &[Flag] = &flags!( - IMAGE_SUBSYSTEM_UNKNOWN, - IMAGE_SUBSYSTEM_NATIVE, - IMAGE_SUBSYSTEM_WINDOWS_GUI, - IMAGE_SUBSYSTEM_WINDOWS_CUI, - IMAGE_SUBSYSTEM_OS2_CUI, - IMAGE_SUBSYSTEM_POSIX_CUI, - IMAGE_SUBSYSTEM_NATIVE_WINDOWS, - IMAGE_SUBSYSTEM_WINDOWS_CE_GUI, - IMAGE_SUBSYSTEM_EFI_APPLICATION, - IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER, - IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER, - IMAGE_SUBSYSTEM_EFI_ROM, - IMAGE_SUBSYSTEM_XBOX, - IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION, - IMAGE_SUBSYSTEM_XBOX_CODE_CATALOG, -); -const FLAGS_IMAGE_DLLCHARACTERISTICS: &[Flag] = &flags!( - IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA, - IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE, - IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY, - IMAGE_DLLCHARACTERISTICS_NX_COMPAT, - IMAGE_DLLCHARACTERISTICS_NO_ISOLATION, - IMAGE_DLLCHARACTERISTICS_NO_SEH, - IMAGE_DLLCHARACTERISTICS_NO_BIND, - IMAGE_DLLCHARACTERISTICS_APPCONTAINER, - IMAGE_DLLCHARACTERISTICS_WDM_DRIVER, - IMAGE_DLLCHARACTERISTICS_GUARD_CF, - IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE, -); -const FLAGS_IMAGE_DIRECTORY_ENTRY: &[Flag] = &flags!( - IMAGE_DIRECTORY_ENTRY_EXPORT, - IMAGE_DIRECTORY_ENTRY_IMPORT, - IMAGE_DIRECTORY_ENTRY_RESOURCE, - IMAGE_DIRECTORY_ENTRY_EXCEPTION, - IMAGE_DIRECTORY_ENTRY_SECURITY, - IMAGE_DIRECTORY_ENTRY_BASERELOC, - IMAGE_DIRECTORY_ENTRY_DEBUG, - IMAGE_DIRECTORY_ENTRY_ARCHITECTURE, - IMAGE_DIRECTORY_ENTRY_GLOBALPTR, - IMAGE_DIRECTORY_ENTRY_TLS, - IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, - IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, - IMAGE_DIRECTORY_ENTRY_IAT, - IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT, - IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR, -); -const FLAGS_RT: &[Flag] = &flags!( - RT_CURSOR, - RT_BITMAP, - RT_ICON, - RT_MENU, - RT_DIALOG, - RT_STRING, - RT_FONTDIR, - RT_FONT, - RT_ACCELERATOR, - RT_RCDATA, - RT_MESSAGETABLE, - RT_GROUP_CURSOR, - RT_GROUP_ICON, - RT_VERSION, - RT_DLGINCLUDE, - RT_PLUGPLAY, - RT_VXD, - RT_ANICURSOR, - RT_ANIICON, - RT_HTML, - RT_MANIFEST, -); -const FLAGS_IMAGE_OBJECT_TYPE: &[Flag] = - &flags!(IMPORT_OBJECT_CODE, IMPORT_OBJECT_DATA, IMPORT_OBJECT_CONST); -const FLAGS_IMAGE_OBJECT_NAME: &[Flag] = &flags!( - IMPORT_OBJECT_ORDINAL, - IMPORT_OBJECT_NAME, - IMPORT_OBJECT_NAME_NO_PREFIX, - IMPORT_OBJECT_NAME_UNDECORATE, - IMPORT_OBJECT_NAME_EXPORTAS, -); diff --git a/crates/examples/testfiles/coff/import_msvc.lib.objdump b/crates/examples/testfiles/coff/import_msvc.lib.objdump index a345d8e..133ee37 100644 --- a/crates/examples/testfiles/coff/import_msvc.lib.objdump +++ b/crates/examples/testfiles/coff/import_msvc.lib.objdump @@ -42,13 +42,13 @@ Entry Address: 0 Segment { name: ".debug$S", address: 0, size: 0, permissions: R-- } Segment { name: ".idata$5", address: 0, size: 0, permissions: RW- } Segment { name: ".idata$4", address: 0, size: 0, permissions: RW- } -1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: 42100040 } } -2: Section { name: ".idata$5", address: 0, size: 8, align: 8, kind: Data, flags: Coff { characteristics: c0400040 } } -3: Section { name: ".idata$4", address: 0, size: 8, align: 8, kind: Data, flags: Coff { characteristics: c0400040 } } +1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".idata$5", address: 0, size: 8, align: 8, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_8BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +3: Section { name: ".idata$4", address: 0, size: 8, align: 8, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_8BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } Symbols -0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -1: Symbol { name: "\u{7f}test_x64_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } +0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +1: Symbol { name: "\u{7f}test_x64_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } Dynamic symbols @@ -64,12 +64,12 @@ Relative Address Base: 0 Entry Address: 0 Segment { name: ".debug$S", address: 0, size: 0, permissions: R-- } Segment { name: ".idata$3", address: 0, size: 0, permissions: RW- } -1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: 42100040 } } -2: Section { name: ".idata$3", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: c0300040 } } +1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".idata$3", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } Symbols -0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -1: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } +0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +1: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } Dynamic symbols @@ -86,19 +86,19 @@ Entry Address: 0 Segment { name: ".debug$S", address: 0, size: 0, permissions: R-- } Segment { name: ".idata$2", address: 0, size: 0, permissions: RW- } Segment { name: ".idata$6", address: 0, size: 0, permissions: RW- } -1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: 42100040 } } -2: Section { name: ".idata$2", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: c0300040 } } -3: Section { name: ".idata$6", address: 0, size: e, align: 2, kind: Data, flags: Coff { characteristics: c0200040 } } +1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".idata$2", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +3: Section { name: ".idata$6", address: 0, size: e, align: 2, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_2BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } Symbols -0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -1: Symbol { name: "__IMPORT_DESCRIPTOR_test_x64", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } -2: Symbol { name: ".idata$2", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 68 } } -3: Symbol { name: ".idata$6", address: 0, size: 0, kind: Data, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -4: Symbol { name: ".idata$4", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 68 } } -5: Symbol { name: ".idata$5", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 68 } } -6: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } -7: Symbol { name: "\u{7f}test_x64_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } +0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +1: Symbol { name: "__IMPORT_DESCRIPTOR_test_x64", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +2: Symbol { name: ".idata$2", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_SECTION } } +3: Symbol { name: ".idata$6", address: 0, size: 0, kind: Data, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +4: Symbol { name: ".idata$4", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_SECTION } } +5: Symbol { name: ".idata$5", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_SECTION } } +6: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +7: Symbol { name: "\u{7f}test_x64_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } .idata$2 relocations (c, Relocation { kind: ImageOffset, encoding: Generic, size: 20, target: Symbol(SymbolIndex(3)), addend: 0, implicit_addend: true, flags: Coff { typ: 3 } }) @@ -122,19 +122,19 @@ test_x86.dll: Format: Coff Little-endian 32-bit Kind: Relocatable Architecture: I386 -Flags: Coff { characteristics: 100 } +Flags: Coff { characteristics: IMAGE_FILE_32BIT_MACHINE } Relative Address Base: 0 Entry Address: 0 Segment { name: ".debug$S", address: 0, size: 0, permissions: R-- } Segment { name: ".idata$5", address: 0, size: 0, permissions: RW- } Segment { name: ".idata$4", address: 0, size: 0, permissions: RW- } -1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: 42100040 } } -2: Section { name: ".idata$5", address: 0, size: 4, align: 4, kind: Data, flags: Coff { characteristics: c0300040 } } -3: Section { name: ".idata$4", address: 0, size: 4, align: 4, kind: Data, flags: Coff { characteristics: c0300040 } } +1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".idata$5", address: 0, size: 4, align: 4, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +3: Section { name: ".idata$4", address: 0, size: 4, align: 4, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } Symbols -0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -1: Symbol { name: "\u{7f}test_x86_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } +0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +1: Symbol { name: "\u{7f}test_x86_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } Dynamic symbols @@ -145,17 +145,17 @@ test_x86.dll: Format: Coff Little-endian 32-bit Kind: Relocatable Architecture: I386 -Flags: Coff { characteristics: 100 } +Flags: Coff { characteristics: IMAGE_FILE_32BIT_MACHINE } Relative Address Base: 0 Entry Address: 0 Segment { name: ".debug$S", address: 0, size: 0, permissions: R-- } Segment { name: ".idata$3", address: 0, size: 0, permissions: RW- } -1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: 42100040 } } -2: Section { name: ".idata$3", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: c0300040 } } +1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".idata$3", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } Symbols -0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -1: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } +0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +1: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } Dynamic symbols @@ -166,25 +166,25 @@ test_x86.dll: Format: Coff Little-endian 32-bit Kind: Relocatable Architecture: I386 -Flags: Coff { characteristics: 100 } +Flags: Coff { characteristics: IMAGE_FILE_32BIT_MACHINE } Relative Address Base: 0 Entry Address: 0 Segment { name: ".debug$S", address: 0, size: 0, permissions: R-- } Segment { name: ".idata$2", address: 0, size: 0, permissions: RW- } Segment { name: ".idata$6", address: 0, size: 0, permissions: RW- } -1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: 42100040 } } -2: Section { name: ".idata$2", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: c0300040 } } -3: Section { name: ".idata$6", address: 0, size: e, align: 2, kind: Data, flags: Coff { characteristics: c0200040 } } +1: Section { name: ".debug$S", address: 0, size: 42, align: 1, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".idata$2", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +3: Section { name: ".idata$6", address: 0, size: e, align: 2, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_2BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } Symbols -0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -1: Symbol { name: "__IMPORT_DESCRIPTOR_test_x86", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } -2: Symbol { name: ".idata$2", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 68 } } -3: Symbol { name: ".idata$6", address: 0, size: 0, kind: Data, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -4: Symbol { name: ".idata$4", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 68 } } -5: Symbol { name: ".idata$5", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 68 } } -6: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } -7: Symbol { name: "\u{7f}test_x86_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } +0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +1: Symbol { name: "__IMPORT_DESCRIPTOR_test_x86", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +2: Symbol { name: ".idata$2", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_SECTION } } +3: Symbol { name: ".idata$6", address: 0, size: 0, kind: Data, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +4: Symbol { name: ".idata$4", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_SECTION } } +5: Symbol { name: ".idata$5", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_SECTION } } +6: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +7: Symbol { name: "\u{7f}test_x86_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } .idata$2 relocations (c, Relocation { kind: ImageOffset, encoding: Generic, size: 20, target: Symbol(SymbolIndex(3)), addend: 0, implicit_addend: true, flags: Coff { typ: 7 } }) @@ -215,13 +215,13 @@ Entry Address: 0 Segment { name: ".debug$S", address: 0, size: 0, permissions: R-- } Segment { name: ".idata$5", address: 0, size: 0, permissions: RW- } Segment { name: ".idata$4", address: 0, size: 0, permissions: RW- } -1: Section { name: ".debug$S", address: 0, size: 46, align: 1, kind: Other, flags: Coff { characteristics: 42100040 } } -2: Section { name: ".idata$5", address: 0, size: 8, align: 8, kind: Data, flags: Coff { characteristics: c0400040 } } -3: Section { name: ".idata$4", address: 0, size: 8, align: 8, kind: Data, flags: Coff { characteristics: c0400040 } } +1: Section { name: ".debug$S", address: 0, size: 46, align: 1, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".idata$5", address: 0, size: 8, align: 8, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_8BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +3: Section { name: ".idata$4", address: 0, size: 8, align: 8, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_8BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } Symbols -0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -1: Symbol { name: "\u{7f}test_arm64ec_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } +0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +1: Symbol { name: "\u{7f}test_arm64ec_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } Dynamic symbols @@ -237,12 +237,12 @@ Relative Address Base: 0 Entry Address: 0 Segment { name: ".debug$S", address: 0, size: 0, permissions: R-- } Segment { name: ".idata$3", address: 0, size: 0, permissions: RW- } -1: Section { name: ".debug$S", address: 0, size: 46, align: 1, kind: Other, flags: Coff { characteristics: 42100040 } } -2: Section { name: ".idata$3", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: c0300040 } } +1: Section { name: ".debug$S", address: 0, size: 46, align: 1, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".idata$3", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } Symbols -0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -1: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } +0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +1: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } Dynamic symbols @@ -259,19 +259,19 @@ Entry Address: 0 Segment { name: ".debug$S", address: 0, size: 0, permissions: R-- } Segment { name: ".idata$2", address: 0, size: 0, permissions: RW- } Segment { name: ".idata$6", address: 0, size: 0, permissions: RW- } -1: Section { name: ".debug$S", address: 0, size: 46, align: 1, kind: Other, flags: Coff { characteristics: 42100040 } } -2: Section { name: ".idata$2", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: c0300040 } } -3: Section { name: ".idata$6", address: 0, size: 12, align: 2, kind: Data, flags: Coff { characteristics: c0200040 } } +1: Section { name: ".debug$S", address: 0, size: 46, align: 1, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".idata$2", address: 0, size: 14, align: 4, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +3: Section { name: ".idata$6", address: 0, size: 12, align: 2, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_2BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } Symbols -0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -1: Symbol { name: "__IMPORT_DESCRIPTOR_test_arm64ec", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } -2: Symbol { name: ".idata$2", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 68 } } -3: Symbol { name: ".idata$6", address: 0, size: 0, kind: Data, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -4: Symbol { name: ".idata$4", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 68 } } -5: Symbol { name: ".idata$5", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 68 } } -6: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } -7: Symbol { name: "\u{7f}test_arm64ec_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } +0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +1: Symbol { name: "__IMPORT_DESCRIPTOR_test_arm64ec", address: 0, size: 0, kind: Data, section: Section(SectionIndex(2)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +2: Symbol { name: ".idata$2", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_SECTION } } +3: Symbol { name: ".idata$6", address: 0, size: 0, kind: Data, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +4: Symbol { name: ".idata$4", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_SECTION } } +5: Symbol { name: ".idata$5", address: 0, size: 0, kind: Section, section: Undefined, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_SECTION } } +6: Symbol { name: "__NULL_IMPORT_DESCRIPTOR", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +7: Symbol { name: "\u{7f}test_arm64ec_NULL_THUNK_DATA", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } .idata$2 relocations (c, Relocation { kind: ImageOffset, encoding: Generic, size: 20, target: Symbol(SymbolIndex(3)), addend: 0, implicit_addend: true, flags: Coff { typ: 2 } }) diff --git a/crates/examples/testfiles/coff/import_msvc.lib.readobj b/crates/examples/testfiles/coff/import_msvc.lib.readobj index e8a547e..8e4560d 100644 --- a/crates/examples/testfiles/coff/import_msvc.lib.readobj +++ b/crates/examples/testfiles/coff/import_msvc.lib.readobj @@ -87,10 +87,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 2 @@ -104,10 +104,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0400040 + IMAGE_SCN_ALIGN_8BYTES (0x400000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_8BYTES (0x400000) } ImageSectionHeader { Index: 3 @@ -121,10 +121,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0400040 + IMAGE_SCN_ALIGN_8BYTES (0x400000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_8BYTES (0x400000) } ImageSymbol { Index: 0 @@ -132,8 +132,6 @@ ImageSymbol { Value: 0x1017DD9 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -143,8 +141,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$5" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -172,10 +168,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 2 @@ -189,10 +185,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSymbol { Index: 0 @@ -200,8 +196,6 @@ ImageSymbol { Value: 0x1017DD9 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -211,8 +205,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$3" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -240,10 +232,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 2 @@ -257,10 +249,10 @@ ImageSectionHeader { NumberOfRelocations: 3 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) ImageRelocation { VirtualAddress: 0xC Symbol: ".idata$6" (0x3) @@ -289,10 +281,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0200040 + IMAGE_SCN_ALIGN_2BYTES (0x200000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_2BYTES (0x200000) } ImageSymbol { Index: 0 @@ -300,8 +292,6 @@ ImageSymbol { Value: 0x1017DD9 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -311,8 +301,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$2" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -322,8 +310,6 @@ ImageSymbol { Value: 0xC0000040 Section: ".idata$2" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_SECTION (0x68) NumberOfAuxSymbols: 0x0 } @@ -333,8 +319,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$6" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -344,8 +328,6 @@ ImageSymbol { Value: 0xC0000040 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_SECTION (0x68) NumberOfAuxSymbols: 0x0 } @@ -355,8 +337,6 @@ ImageSymbol { Value: 0xC0000040 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_SECTION (0x68) NumberOfAuxSymbols: 0x0 } @@ -366,8 +346,6 @@ ImageSymbol { Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -377,8 +355,6 @@ ImageSymbol { Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -408,8 +384,7 @@ ImageFileHeader { PointerToSymbolTable: 0xD6 NumberOfSymbols: 2 SizeOfOptionalHeader: 0x0 - Characteristics: 0x100 - IMAGE_FILE_32BIT_MACHINE (0x100) + Characteristics: IMAGE_FILE_32BIT_MACHINE (0x100) } ImageSectionHeader { Index: 1 @@ -423,10 +398,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 2 @@ -440,10 +415,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSectionHeader { Index: 3 @@ -457,10 +432,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSymbol { Index: 0 @@ -468,8 +443,6 @@ ImageSymbol { Value: 0x1017DD9 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -479,8 +452,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$5" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -494,8 +465,7 @@ ImageFileHeader { PointerToSymbolTable: 0xBA NumberOfSymbols: 2 SizeOfOptionalHeader: 0x0 - Characteristics: 0x100 - IMAGE_FILE_32BIT_MACHINE (0x100) + Characteristics: IMAGE_FILE_32BIT_MACHINE (0x100) } ImageSectionHeader { Index: 1 @@ -509,10 +479,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 2 @@ -526,10 +496,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSymbol { Index: 0 @@ -537,8 +507,6 @@ ImageSymbol { Value: 0x1017DD9 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -548,8 +516,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$3" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -563,8 +529,7 @@ ImageFileHeader { PointerToSymbolTable: 0x10E NumberOfSymbols: 8 SizeOfOptionalHeader: 0x0 - Characteristics: 0x100 - IMAGE_FILE_32BIT_MACHINE (0x100) + Characteristics: IMAGE_FILE_32BIT_MACHINE (0x100) } ImageSectionHeader { Index: 1 @@ -578,10 +543,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 2 @@ -595,10 +560,10 @@ ImageSectionHeader { NumberOfRelocations: 3 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) ImageRelocation { VirtualAddress: 0xC Symbol: ".idata$6" (0x3) @@ -627,10 +592,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0200040 + IMAGE_SCN_ALIGN_2BYTES (0x200000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_2BYTES (0x200000) } ImageSymbol { Index: 0 @@ -638,8 +603,6 @@ ImageSymbol { Value: 0x1017DD9 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -649,8 +612,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$2" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -660,8 +621,6 @@ ImageSymbol { Value: 0xC0000040 Section: ".idata$2" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_SECTION (0x68) NumberOfAuxSymbols: 0x0 } @@ -671,8 +630,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$6" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -682,8 +639,6 @@ ImageSymbol { Value: 0xC0000040 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_SECTION (0x68) NumberOfAuxSymbols: 0x0 } @@ -693,8 +648,6 @@ ImageSymbol { Value: 0xC0000040 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_SECTION (0x68) NumberOfAuxSymbols: 0x0 } @@ -704,8 +657,6 @@ ImageSymbol { Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -715,8 +666,6 @@ ImageSymbol { Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -761,10 +710,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 2 @@ -778,10 +727,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0400040 + IMAGE_SCN_ALIGN_8BYTES (0x400000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_8BYTES (0x400000) } ImageSectionHeader { Index: 3 @@ -795,10 +744,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0400040 + IMAGE_SCN_ALIGN_8BYTES (0x400000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_8BYTES (0x400000) } ImageSymbol { Index: 0 @@ -806,8 +755,6 @@ ImageSymbol { Value: 0x1017DD9 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -817,8 +764,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$5" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -846,10 +791,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 2 @@ -863,10 +808,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSymbol { Index: 0 @@ -874,8 +819,6 @@ ImageSymbol { Value: 0x1017DD9 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -885,8 +828,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$3" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -914,10 +855,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 2 @@ -931,10 +872,10 @@ ImageSectionHeader { NumberOfRelocations: 3 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) ImageRelocation { VirtualAddress: 0xC Symbol: ".idata$6" (0x3) @@ -963,10 +904,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0200040 + IMAGE_SCN_ALIGN_2BYTES (0x200000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_2BYTES (0x200000) } ImageSymbol { Index: 0 @@ -974,8 +915,6 @@ ImageSymbol { Value: 0x1017DD9 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -985,8 +924,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$2" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -996,8 +933,6 @@ ImageSymbol { Value: 0xC0000040 Section: ".idata$2" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_SECTION (0x68) NumberOfAuxSymbols: 0x0 } @@ -1007,8 +942,6 @@ ImageSymbol { Value: 0x0 Section: ".idata$6" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -1018,8 +951,6 @@ ImageSymbol { Value: 0xC0000040 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_SECTION (0x68) NumberOfAuxSymbols: 0x0 } @@ -1029,8 +960,6 @@ ImageSymbol { Value: 0xC0000040 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_SECTION (0x68) NumberOfAuxSymbols: 0x0 } @@ -1040,8 +969,6 @@ ImageSymbol { Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -1051,8 +978,6 @@ ImageSymbol { Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } diff --git a/crates/examples/testfiles/pe/base-bigobj.o.objdump b/crates/examples/testfiles/pe/base-bigobj.o.objdump index 878faa6..e6d5a21 100644 --- a/crates/examples/testfiles/pe/base-bigobj.o.objdump +++ b/crates/examples/testfiles/pe/base-bigobj.o.objdump @@ -11,28 +11,28 @@ Segment { name: ".xdata", address: 0, size: 0, permissions: R-- } Segment { name: ".pdata", address: 0, size: 0, permissions: R-- } Segment { name: ".rdata", address: 0, size: 0, permissions: R-- } Segment { name: ".rdata$zzz", address: 0, size: 0, permissions: R-- } -1: Section { name: ".text", address: 0, size: 80, align: 10, kind: Text, flags: Coff { characteristics: 60500020 } } -2: Section { name: ".data", address: 0, size: 0, align: 10, kind: Data, flags: Coff { characteristics: c0500040 } } -3: Section { name: ".bss", address: 0, size: 0, align: 10, kind: UninitializedData, flags: Coff { characteristics: c0500080 } } -4: Section { name: ".xdata", address: 0, size: 18, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: 40300040 } } -5: Section { name: ".pdata", address: 0, size: 18, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: 40300040 } } -6: Section { name: ".rdata", address: 0, size: 10, align: 10, kind: ReadOnlyData, flags: Coff { characteristics: 40500040 } } -7: Section { name: ".rdata$zzz", address: 0, size: 30, align: 10, kind: ReadOnlyData, flags: Coff { characteristics: 40500040 } } +1: Section { name: ".text", address: 0, size: 80, align: 10, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".data", address: 0, size: 0, align: 10, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +3: Section { name: ".bss", address: 0, size: 0, align: 10, kind: UninitializedData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +4: Section { name: ".xdata", address: 0, size: 18, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +5: Section { name: ".pdata", address: 0, size: 18, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +6: Section { name: ".rdata", address: 0, size: 10, align: 10, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +7: Section { name: ".rdata$zzz", address: 0, size: 30, align: 10, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } Symbols -0: Symbol { name: "base.c", address: 0, size: 0, kind: File, section: None, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 67 } } -2: Symbol { name: "printf", address: 0, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: Coff { typ: 20, storage_class: 3 } } -4: Symbol { name: "main", address: 51, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -5: Symbol { name: ".text", address: 0, size: 75, kind: Section, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -7: Symbol { name: ".data", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -9: Symbol { name: ".bss", address: 0, size: 0, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -11: Symbol { name: ".xdata", address: 0, size: 18, kind: Section, section: Section(SectionIndex(4)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -13: Symbol { name: ".pdata", address: 0, size: 18, kind: Section, section: Section(SectionIndex(5)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -15: Symbol { name: ".rdata", address: 0, size: d, kind: Section, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -17: Symbol { name: ".rdata$zzz", address: 0, size: 2b, kind: Section, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -19: Symbol { name: "__imp___acrt_iob_func", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } -20: Symbol { name: "__main", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -21: Symbol { name: "__mingw_vfprintf", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } +0: Symbol { name: "base.c", address: 0, size: 0, kind: File, section: None, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_FILE } } +2: Symbol { name: "printf", address: 0, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_STATIC } } +4: Symbol { name: "main", address: 51, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +5: Symbol { name: ".text", address: 0, size: 75, kind: Section, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +7: Symbol { name: ".data", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +9: Symbol { name: ".bss", address: 0, size: 0, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +11: Symbol { name: ".xdata", address: 0, size: 18, kind: Section, section: Section(SectionIndex(4)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +13: Symbol { name: ".pdata", address: 0, size: 18, kind: Section, section: Section(SectionIndex(5)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +15: Symbol { name: ".rdata", address: 0, size: d, kind: Section, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +17: Symbol { name: ".rdata$zzz", address: 0, size: 2b, kind: Section, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +19: Symbol { name: "__imp___acrt_iob_func", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +20: Symbol { name: "__main", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +21: Symbol { name: "__mingw_vfprintf", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } .text relocations (2f, Relocation { kind: Relative, encoding: Generic, size: 20, target: Symbol(SymbolIndex(13)), addend: fffffffffffffffc, implicit_addend: true, flags: Coff { typ: 4 } }) diff --git a/crates/examples/testfiles/pe/base-bigobj.o.readobj b/crates/examples/testfiles/pe/base-bigobj.o.readobj index 60c6c0e..cefd9c2 100644 --- a/crates/examples/testfiles/pe/base-bigobj.o.readobj +++ b/crates/examples/testfiles/pe/base-bigobj.o.readobj @@ -26,10 +26,10 @@ ImageSectionHeader { NumberOfRelocations: 4 NumberOfLinenumbers: 0 Characteristics: 0x60500020 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) ImageRelocation { VirtualAddress: 0x2F Symbol: "__imp___acrt_iob_func" (0x13) @@ -63,10 +63,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0500040 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 3 @@ -80,10 +80,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0500080 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_UNINITIALIZED_DATA (0x80) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 4 @@ -97,9 +97,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x40300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSectionHeader { Index: 5 @@ -113,9 +113,9 @@ ImageSectionHeader { NumberOfRelocations: 6 NumberOfLinenumbers: 0 Characteristics: 0x40300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) ImageRelocation { VirtualAddress: 0x0 Symbol: ".text" (0x5) @@ -159,9 +159,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x40500040 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 7 @@ -175,9 +175,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x40500040 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSymbol { Index: 0 @@ -185,8 +185,6 @@ ImageSymbol { Value: 0x0 Section: IMAGE_SYM_DEBUG (-2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_FILE (0x67) NumberOfAuxSymbols: 0x1 ImageAuxSymbolFile { @@ -198,9 +196,7 @@ ImageSymbol { Name: "printf" Value: 0x0 Section: ".text" (0x1) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolFunction { @@ -216,9 +212,7 @@ ImageSymbol { Name: "main" Value: 0x51 Section: ".text" (0x1) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -228,8 +222,6 @@ ImageSymbol { Value: 0x0 Section: ".text" (0x1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -249,8 +241,6 @@ ImageSymbol { Value: 0x0 Section: ".data" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -270,8 +260,6 @@ ImageSymbol { Value: 0x0 Section: ".bss" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -291,8 +279,6 @@ ImageSymbol { Value: 0x0 Section: ".xdata" (0x4) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -312,8 +298,6 @@ ImageSymbol { Value: 0x0 Section: ".pdata" (0x5) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -333,8 +317,6 @@ ImageSymbol { Value: 0x0 Section: ".rdata" (0x6) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -354,8 +336,6 @@ ImageSymbol { Value: 0x0 Section: ".rdata$zzz" (0x7) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -375,8 +355,6 @@ ImageSymbol { Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -385,9 +363,7 @@ ImageSymbol { Name: "__main" Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -396,9 +372,7 @@ ImageSymbol { Name: "__mingw_vfprintf" Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } diff --git a/crates/examples/testfiles/pe/base-bigobj.obj.objdump b/crates/examples/testfiles/pe/base-bigobj.obj.objdump index 299fc84..66366a0 100644 --- a/crates/examples/testfiles/pe/base-bigobj.obj.objdump +++ b/crates/examples/testfiles/pe/base-bigobj.obj.objdump @@ -12,37 +12,37 @@ Segment { name: ".text$mn", address: 0, size: 0, permissions: R-X } Segment { name: ".text$mn", address: 0, size: 0, permissions: R-X } Segment { name: ".data", address: 0, size: 0, permissions: RW- } Segment { name: ".chks64", address: 0, size: 0, permissions: --- } -1: Section { name: ".drectve", address: 0, size: 2f, align: 1, kind: Linker, flags: Coff { characteristics: 100a00 } } -2: Section { name: ".debug$S", address: 0, size: 7c, align: 1, kind: Other, flags: Coff { characteristics: 42100040 } } -3: Section { name: ".text$mn", address: 0, size: 14, align: 10, kind: Text, flags: Coff { characteristics: 60500020 } } -4: Section { name: ".text$mn", address: 0, size: a, align: 10, kind: Text, flags: Coff { characteristics: 60501020 } } -5: Section { name: ".text$mn", address: 0, size: 29, align: 10, kind: Text, flags: Coff { characteristics: 60501020 } } -6: Section { name: ".text$mn", address: 0, size: 3a, align: 10, kind: Text, flags: Coff { characteristics: 60501020 } } -7: Section { name: ".data", address: 0, size: d, align: 4, kind: Data, flags: Coff { characteristics: c0300040 } } -8: Section { name: ".chks64", address: 0, size: 40, align: 10, kind: Linker, flags: Coff { characteristics: a00 } } +1: Section { name: ".drectve", address: 0, size: 2f, align: 1, kind: Linker, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_LNK_INFO | IMAGE_SCN_LNK_REMOVE } } +2: Section { name: ".debug$S", address: 0, size: 7c, align: 1, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +3: Section { name: ".text$mn", address: 0, size: 14, align: 10, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +4: Section { name: ".text$mn", address: 0, size: a, align: 10, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_LNK_COMDAT | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +5: Section { name: ".text$mn", address: 0, size: 29, align: 10, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_LNK_COMDAT | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +6: Section { name: ".text$mn", address: 0, size: 3a, align: 10, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_LNK_COMDAT | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +7: Section { name: ".data", address: 0, size: d, align: 4, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +8: Section { name: ".chks64", address: 0, size: 40, align: 10, kind: Linker, flags: Coff { characteristics: IMAGE_SCN_LNK_INFO | IMAGE_SCN_LNK_REMOVE } } Comdat { symbol: SymbolIndex(14), name: "___local_stdio_printf_options", kind: Any } Sections: 4 Comdat { symbol: SymbolIndex(17), name: "__vfprintf_l", kind: Any } Sections: 5 Comdat { symbol: SymbolIndex(18), name: "_printf", kind: Any } Sections: 6 Symbols -0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -1: Symbol { name: "@feat.00", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -2: Symbol { name: ".drectve", address: 0, size: 2f, kind: Section, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -4: Symbol { name: ".debug$S", address: 0, size: 7c, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -6: Symbol { name: ".text$mn", address: 0, size: 14, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -8: Symbol { name: ".text$mn", address: 0, size: a, kind: Section, section: Section(SectionIndex(4)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -10: Symbol { name: ".text$mn", address: 0, size: 29, kind: Section, section: Section(SectionIndex(5)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -12: Symbol { name: ".text$mn", address: 0, size: 3a, kind: Section, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -14: Symbol { name: "___local_stdio_printf_options", address: 0, size: 0, kind: Text, section: Section(SectionIndex(4)), scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -15: Symbol { name: "___acrt_iob_func", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -16: Symbol { name: "___stdio_common_vfprintf", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -17: Symbol { name: "__vfprintf_l", address: 0, size: 0, kind: Text, section: Section(SectionIndex(5)), scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -18: Symbol { name: "_printf", address: 0, size: 0, kind: Text, section: Section(SectionIndex(6)), scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -19: Symbol { name: "_main", address: 0, size: 0, kind: Text, section: Section(SectionIndex(3)), scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -20: Symbol { name: "?_OptionsStorage@?1??__local_stdio_printf_options@@9@9", address: 0, size: 8, kind: Data, section: Common, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } -21: Symbol { name: ".data", address: 0, size: d, kind: Section, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -23: Symbol { name: "$SG9248", address: 0, size: 0, kind: Data, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -24: Symbol { name: ".chks64", address: 0, size: 40, kind: Section, section: Section(SectionIndex(8)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } +0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +1: Symbol { name: "@feat.00", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +2: Symbol { name: ".drectve", address: 0, size: 2f, kind: Section, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +4: Symbol { name: ".debug$S", address: 0, size: 7c, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +6: Symbol { name: ".text$mn", address: 0, size: 14, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +8: Symbol { name: ".text$mn", address: 0, size: a, kind: Section, section: Section(SectionIndex(4)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +10: Symbol { name: ".text$mn", address: 0, size: 29, kind: Section, section: Section(SectionIndex(5)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +12: Symbol { name: ".text$mn", address: 0, size: 3a, kind: Section, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +14: Symbol { name: "___local_stdio_printf_options", address: 0, size: 0, kind: Text, section: Section(SectionIndex(4)), scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +15: Symbol { name: "___acrt_iob_func", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +16: Symbol { name: "___stdio_common_vfprintf", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +17: Symbol { name: "__vfprintf_l", address: 0, size: 0, kind: Text, section: Section(SectionIndex(5)), scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +18: Symbol { name: "_printf", address: 0, size: 0, kind: Text, section: Section(SectionIndex(6)), scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +19: Symbol { name: "_main", address: 0, size: 0, kind: Text, section: Section(SectionIndex(3)), scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +20: Symbol { name: "?_OptionsStorage@?1??__local_stdio_printf_options@@9@9", address: 0, size: 8, kind: Data, section: Common, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +21: Symbol { name: ".data", address: 0, size: d, kind: Section, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +23: Symbol { name: "$SG9248", address: 0, size: 0, kind: Data, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +24: Symbol { name: ".chks64", address: 0, size: 40, kind: Section, section: Section(SectionIndex(8)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } .text$mn relocations (4, Relocation { kind: Absolute, encoding: Generic, size: 20, target: Symbol(SymbolIndex(17)), addend: 0, implicit_addend: true, flags: Coff { typ: 6 } }) diff --git a/crates/examples/testfiles/pe/base-bigobj.obj.readobj b/crates/examples/testfiles/pe/base-bigobj.obj.readobj index 57b9fa1..3ac46c1 100644 --- a/crates/examples/testfiles/pe/base-bigobj.obj.readobj +++ b/crates/examples/testfiles/pe/base-bigobj.obj.readobj @@ -26,9 +26,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x100A00 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_LNK_INFO (0x200) IMAGE_SCN_LNK_REMOVE (0x800) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 2 @@ -42,10 +42,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 3 @@ -59,10 +59,10 @@ ImageSectionHeader { NumberOfRelocations: 2 NumberOfLinenumbers: 0 Characteristics: 0x60500020 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) ImageRelocation { VirtualAddress: 0x4 Symbol: "$SG9248" (0x17) @@ -86,11 +86,11 @@ ImageSectionHeader { NumberOfRelocations: 1 NumberOfLinenumbers: 0 Characteristics: 0x60501020 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_LNK_COMDAT (0x1000) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) ImageRelocation { VirtualAddress: 0x4 Symbol: "?_OptionsStorage@?1??__local_stdio_printf_options@@9@9" (0x14) @@ -109,11 +109,11 @@ ImageSectionHeader { NumberOfRelocations: 2 NumberOfLinenumbers: 0 Characteristics: 0x60501020 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_LNK_COMDAT (0x1000) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) ImageRelocation { VirtualAddress: 0x14 Symbol: "___local_stdio_printf_options" (0xE) @@ -137,11 +137,11 @@ ImageSectionHeader { NumberOfRelocations: 2 NumberOfLinenumbers: 0 Characteristics: 0x60501020 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_LNK_COMDAT (0x1000) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) ImageRelocation { VirtualAddress: 0x19 Symbol: "___acrt_iob_func" (0xF) @@ -165,10 +165,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSectionHeader { Index: 8 @@ -191,8 +191,6 @@ ImageSymbol { Value: 0x1047556 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -202,8 +200,6 @@ ImageSymbol { Value: 0x80010191 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -213,8 +209,6 @@ ImageSymbol { Value: 0x0 Section: ".drectve" (0x1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -234,8 +228,6 @@ ImageSymbol { Value: 0x0 Section: ".debug$S" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -255,8 +247,6 @@ ImageSymbol { Value: 0x0 Section: ".text$mn" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -276,8 +266,6 @@ ImageSymbol { Value: 0x0 Section: ".text$mn" (0x4) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -297,8 +285,6 @@ ImageSymbol { Value: 0x0 Section: ".text$mn" (0x5) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -318,8 +304,6 @@ ImageSymbol { Value: 0x0 Section: ".text$mn" (0x6) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -338,9 +322,7 @@ ImageSymbol { Name: "___local_stdio_printf_options" Value: 0x0 Section: ".text$mn" (0x4) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -349,9 +331,7 @@ ImageSymbol { Name: "___acrt_iob_func" Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -360,9 +340,7 @@ ImageSymbol { Name: "___stdio_common_vfprintf" Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -371,9 +349,7 @@ ImageSymbol { Name: "__vfprintf_l" Value: 0x0 Section: ".text$mn" (0x5) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -382,9 +358,7 @@ ImageSymbol { Name: "_printf" Value: 0x0 Section: ".text$mn" (0x6) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -393,9 +367,7 @@ ImageSymbol { Name: "_main" Value: 0x0 Section: ".text$mn" (0x3) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -405,8 +377,6 @@ ImageSymbol { Value: 0x8 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -416,8 +386,6 @@ ImageSymbol { Value: 0x0 Section: ".data" (0x7) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -437,8 +405,6 @@ ImageSymbol { Value: 0x0 Section: ".data" (0x7) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -448,8 +414,6 @@ ImageSymbol { Value: 0x0 Section: ".chks64" (0x8) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { diff --git a/crates/examples/testfiles/pe/base-gnu.exe.objdump-partial b/crates/examples/testfiles/pe/base-gnu.exe.objdump-partial index 696434e..f27fe00 100644 --- a/crates/examples/testfiles/pe/base-gnu.exe.objdump-partial +++ b/crates/examples/testfiles/pe/base-gnu.exe.objdump-partial @@ -1,7 +1,7 @@ Format: Pe Little-endian 64-bit Kind: Executable Architecture: X86_64 -Flags: Coff { characteristics: 26 } +Flags: Coff { characteristics: IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_LARGE_ADDRESS_AWARE } Relative Address Base: 140000000 Entry Address: 1400014d0 Segment { name: ".text", address: 140001000, size: 6bf8, permissions: R-X } @@ -23,46 +23,46 @@ Segment { name: ".debug_frame", address: 140032000, size: 2198, permissions: R-- Segment { name: ".debug_str", address: 140035000, size: 87d, permissions: R-- } Segment { name: ".debug_loc", address: 140036000, size: 121dc, permissions: R-- } Segment { name: ".debug_ranges", address: 140049000, size: 14f0, permissions: R-- } -1: Section { name: ".text", address: 140001000, size: 6bf8, align: 1000, kind: Text, flags: Coff { characteristics: 60500060 } } -2: Section { name: ".data", address: 140008000, size: f0, align: 1000, kind: Data, flags: Coff { characteristics: c0500040 } } -3: Section { name: ".rdata", address: 140009000, size: 1000, align: 1000, kind: ReadOnlyData, flags: Coff { characteristics: 40600040 } } -4: Section { name: ".pdata", address: 14000a000, size: 474, align: 1000, kind: ReadOnlyData, flags: Coff { characteristics: 40300040 } } -5: Section { name: ".xdata", address: 14000b000, size: 428, align: 1000, kind: ReadOnlyData, flags: Coff { characteristics: 40300040 } } -6: Section { name: ".bss", address: 14000c000, size: b80, align: 1000, kind: UninitializedData, flags: Coff { characteristics: c0600080 } } -7: Section { name: ".idata", address: 14000d000, size: 710, align: 1000, kind: Data, flags: Coff { characteristics: c0300040 } } -8: Section { name: ".CRT", address: 14000e000, size: 60, align: 1000, kind: Data, flags: Coff { characteristics: c0400040 } } -9: Section { name: ".tls", address: 14000f000, size: 10, align: 1000, kind: Data, flags: Coff { characteristics: c0400040 } } -10: Section { name: ".rsrc", address: 140010000, size: 4e8, align: 1000, kind: Data, flags: Coff { characteristics: c0300040 } } -11: Section { name: ".reloc", address: 140011000, size: 84, align: 1000, kind: Other, flags: Coff { characteristics: 42300040 } } -12: Section { name: ".debug_aranges", address: 140012000, size: 6a0, align: 1000, kind: Other, flags: Coff { characteristics: 42500040 } } -13: Section { name: ".debug_info", address: 140013000, size: 12b4c, align: 1000, kind: Other, flags: Coff { characteristics: 42100040 } } -14: Section { name: ".debug_abbrev", address: 140026000, size: 3035, align: 1000, kind: Other, flags: Coff { characteristics: 42100040 } } -15: Section { name: ".debug_line", address: 14002a000, size: 7c26, align: 1000, kind: Other, flags: Coff { characteristics: 42100040 } } -16: Section { name: ".debug_frame", address: 140032000, size: 2198, align: 1000, kind: Other, flags: Coff { characteristics: 42400040 } } -17: Section { name: ".debug_str", address: 140035000, size: 87d, align: 1000, kind: Other, flags: Coff { characteristics: 42100040 } } -18: Section { name: ".debug_loc", address: 140036000, size: 121dc, align: 1000, kind: Other, flags: Coff { characteristics: 42100040 } } -19: Section { name: ".debug_ranges", address: 140049000, size: 14f0, align: 1000, kind: Other, flags: Coff { characteristics: 42100040 } } +1: Section { name: ".text", address: 140001000, size: 6bf8, align: 1000, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".data", address: 140008000, size: f0, align: 1000, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +3: Section { name: ".rdata", address: 140009000, size: 1000, align: 1000, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_32BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +4: Section { name: ".pdata", address: 14000a000, size: 474, align: 1000, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +5: Section { name: ".xdata", address: 14000b000, size: 428, align: 1000, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +6: Section { name: ".bss", address: 14000c000, size: b80, align: 1000, kind: UninitializedData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_32BYTES | IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +7: Section { name: ".idata", address: 14000d000, size: 710, align: 1000, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +8: Section { name: ".CRT", address: 14000e000, size: 60, align: 1000, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_8BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +9: Section { name: ".tls", address: 14000f000, size: 10, align: 1000, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_8BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +10: Section { name: ".rsrc", address: 140010000, size: 4e8, align: 1000, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +11: Section { name: ".reloc", address: 140011000, size: 84, align: 1000, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +12: Section { name: ".debug_aranges", address: 140012000, size: 6a0, align: 1000, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +13: Section { name: ".debug_info", address: 140013000, size: 12b4c, align: 1000, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +14: Section { name: ".debug_abbrev", address: 140026000, size: 3035, align: 1000, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +15: Section { name: ".debug_line", address: 14002a000, size: 7c26, align: 1000, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +16: Section { name: ".debug_frame", address: 140032000, size: 2198, align: 1000, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_8BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +17: Section { name: ".debug_str", address: 140035000, size: 87d, align: 1000, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +18: Section { name: ".debug_loc", address: 140036000, size: 121dc, align: 1000, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +19: Section { name: ".debug_ranges", address: 140049000, size: 14f0, align: 1000, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } Symbols -0: Symbol { name: "crtexe.c", address: 0, size: 0, kind: File, section: None, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 67 } } -2: Symbol { name: "__mingw_invalidParameterHandler", address: 140001000, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: Coff { typ: 20, storage_class: 3 } } -4: Symbol { name: "pre_c_init", address: 140001010, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: Coff { typ: 20, storage_class: 3 } } -5: Symbol { name: ".rdata$.refptr.__mingw_initltsdrot_force", address: 140009740, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -7: Symbol { name: ".rdata$.refptr.__mingw_initltsdyn_force", address: 140009750, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -9: Symbol { name: ".rdata$.refptr.__mingw_initltssuo_force", address: 140009760, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -11: Symbol { name: ".rdata$.refptr.__image_base__", address: 1400096e0, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -13: Symbol { name: ".rdata$.refptr.__mingw_app_type", address: 140009730, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -15: Symbol { name: "managedapp", address: 14000c020, size: 0, kind: Data, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -16: Symbol { name: ".rdata$.refptr._fmode", address: 140009810, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -18: Symbol { name: ".rdata$.refptr._commode", address: 1400097f0, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -20: Symbol { name: ".rdata$.refptr._MINGW_INSTALL_DEBUG_MATHERR", address: 140009690, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -22: Symbol { name: "pre_cpp_init", address: 140001130, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: Coff { typ: 20, storage_class: 3 } } -23: Symbol { name: ".rdata$.refptr._newmode", address: 140009840, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -25: Symbol { name: "envp", address: 14000c028, size: 0, kind: Data, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -26: Symbol { name: "argv", address: 14000c030, size: 0, kind: Data, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -27: Symbol { name: "argc", address: 14000c038, size: 0, kind: Data, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -28: Symbol { name: "startinfo", address: 14000c018, size: 0, kind: Data, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -29: Symbol { name: ".rdata$.refptr._dowildcard", address: 140009800, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } +0: Symbol { name: "crtexe.c", address: 0, size: 0, kind: File, section: None, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_FILE } } +2: Symbol { name: "__mingw_invalidParameterHandler", address: 140001000, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_STATIC } } +4: Symbol { name: "pre_c_init", address: 140001010, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_STATIC } } +5: Symbol { name: ".rdata$.refptr.__mingw_initltsdrot_force", address: 140009740, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +7: Symbol { name: ".rdata$.refptr.__mingw_initltsdyn_force", address: 140009750, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +9: Symbol { name: ".rdata$.refptr.__mingw_initltssuo_force", address: 140009760, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +11: Symbol { name: ".rdata$.refptr.__image_base__", address: 1400096e0, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +13: Symbol { name: ".rdata$.refptr.__mingw_app_type", address: 140009730, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +15: Symbol { name: "managedapp", address: 14000c020, size: 0, kind: Data, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +16: Symbol { name: ".rdata$.refptr._fmode", address: 140009810, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +18: Symbol { name: ".rdata$.refptr._commode", address: 1400097f0, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +20: Symbol { name: ".rdata$.refptr._MINGW_INSTALL_DEBUG_MATHERR", address: 140009690, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +22: Symbol { name: "pre_cpp_init", address: 140001130, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_STATIC } } +23: Symbol { name: ".rdata$.refptr._newmode", address: 140009840, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +25: Symbol { name: "envp", address: 14000c028, size: 0, kind: Data, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +26: Symbol { name: "argv", address: 14000c030, size: 0, kind: Data, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +27: Symbol { name: "argc", address: 14000c038, size: 0, kind: Data, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +28: Symbol { name: "startinfo", address: 14000c018, size: 0, kind: Data, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +29: Symbol { name: ".rdata$.refptr._dowildcard", address: 140009800, size: 8, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } Dynamic symbols diff --git a/crates/examples/testfiles/pe/base-gnu.exe.readobj-partial b/crates/examples/testfiles/pe/base-gnu.exe.readobj-partial index 6a1bcaf..ca768aa 100644 --- a/crates/examples/testfiles/pe/base-gnu.exe.readobj-partial +++ b/crates/examples/testfiles/pe/base-gnu.exe.readobj-partial @@ -159,11 +159,11 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x60500060 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 2 @@ -177,10 +177,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0500040 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 3 @@ -194,9 +194,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x40600040 + IMAGE_SCN_ALIGN_32BYTES (0x600000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_32BYTES (0x600000) } ImageSectionHeader { Index: 4 @@ -210,9 +210,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x40300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSectionHeader { Index: 5 @@ -226,9 +226,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x40300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSectionHeader { Index: 6 @@ -242,10 +242,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0600080 + IMAGE_SCN_ALIGN_32BYTES (0x600000) IMAGE_SCN_CNT_UNINITIALIZED_DATA (0x80) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_32BYTES (0x600000) } ImageSectionHeader { Index: 7 @@ -259,10 +259,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSectionHeader { Index: 8 @@ -276,10 +276,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0400040 + IMAGE_SCN_ALIGN_8BYTES (0x400000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_8BYTES (0x400000) } ImageSectionHeader { Index: 9 @@ -293,10 +293,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0400040 + IMAGE_SCN_ALIGN_8BYTES (0x400000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_8BYTES (0x400000) } ImageSectionHeader { Index: 10 @@ -310,10 +310,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSectionHeader { Index: 11 @@ -327,10 +327,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSectionHeader { Index: 12 @@ -344,10 +344,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42500040 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 13 @@ -361,10 +361,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 14 @@ -378,10 +378,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 15 @@ -395,10 +395,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 16 @@ -412,10 +412,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42400040 + IMAGE_SCN_ALIGN_8BYTES (0x400000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_8BYTES (0x400000) } ImageSectionHeader { Index: 17 @@ -429,10 +429,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 18 @@ -446,10 +446,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 19 @@ -463,10 +463,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSymbol { Index: 0 @@ -474,8 +474,6 @@ ImageSymbol { Value: 0x5F Section: IMAGE_SYM_DEBUG (-2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_FILE (0x67) NumberOfAuxSymbols: 0x1 ImageAuxSymbolFile { @@ -487,9 +485,7 @@ ImageSymbol { Name: "__mingw_invalidParameterHandler" Value: 0x0 Section: ".text" (0x1) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolFunction { @@ -505,9 +501,7 @@ ImageSymbol { Name: "pre_c_init" Value: 0x10 Section: ".text" (0x1) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -517,8 +511,6 @@ ImageSymbol { Value: 0x740 Section: ".rdata" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -538,8 +530,6 @@ ImageSymbol { Value: 0x750 Section: ".rdata" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -559,8 +549,6 @@ ImageSymbol { Value: 0x760 Section: ".rdata" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -580,8 +568,6 @@ ImageSymbol { Value: 0x6E0 Section: ".rdata" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -601,8 +587,6 @@ ImageSymbol { Value: 0x730 Section: ".rdata" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -622,8 +606,6 @@ ImageSymbol { Value: 0x20 Section: ".bss" (0x6) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -633,8 +615,6 @@ ImageSymbol { Value: 0x810 Section: ".rdata" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -654,8 +634,6 @@ ImageSymbol { Value: 0x7F0 Section: ".rdata" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -675,8 +653,6 @@ ImageSymbol { Value: 0x690 Section: ".rdata" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -695,9 +671,7 @@ ImageSymbol { Name: "pre_cpp_init" Value: 0x130 Section: ".text" (0x1) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -707,8 +681,6 @@ ImageSymbol { Value: 0x840 Section: ".rdata" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -728,8 +700,6 @@ ImageSymbol { Value: 0x28 Section: ".bss" (0x6) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -739,8 +709,6 @@ ImageSymbol { Value: 0x30 Section: ".bss" (0x6) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -750,8 +718,6 @@ ImageSymbol { Value: 0x38 Section: ".bss" (0x6) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -761,8 +727,6 @@ ImageSymbol { Value: 0x18 Section: ".bss" (0x6) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -772,8 +736,6 @@ ImageSymbol { Value: 0x800 Section: ".rdata" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -792,9 +754,7 @@ ImageSymbol { Name: "__tmainCRTStartup" Value: 0x180 Section: ".text" (0x1) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } diff --git a/crates/examples/testfiles/pe/base.exe.objdump b/crates/examples/testfiles/pe/base.exe.objdump index 36bf54b..ed6896b 100644 --- a/crates/examples/testfiles/pe/base.exe.objdump +++ b/crates/examples/testfiles/pe/base.exe.objdump @@ -1,17 +1,17 @@ Format: Pe Little-endian 32-bit Kind: Executable Architecture: I386 -Flags: Coff { characteristics: 102 } +Flags: Coff { characteristics: IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_32BIT_MACHINE } Relative Address Base: 400000 Entry Address: 4012e1 Segment { name: ".text", address: 401000, size: 104d3, permissions: R-X } Segment { name: ".rdata", address: 412000, size: 6808, permissions: R-- } Segment { name: ".data", address: 419000, size: 12f4, permissions: RW- } Segment { name: ".reloc", address: 41b000, size: ec8, permissions: R-- } -1: Section { name: ".text", address: 401000, size: 104d3, align: 1000, kind: Text, flags: Coff { characteristics: 60000020 } } -2: Section { name: ".rdata", address: 412000, size: 6808, align: 1000, kind: ReadOnlyData, flags: Coff { characteristics: 40000040 } } -3: Section { name: ".data", address: 419000, size: 12f4, align: 1000, kind: Data, flags: Coff { characteristics: c0000040 } } -4: Section { name: ".reloc", address: 41b000, size: ec8, align: 1000, kind: Other, flags: Coff { characteristics: 42000040 } } +1: Section { name: ".text", address: 401000, size: 104d3, align: 1000, kind: Text, flags: Coff { characteristics: IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".rdata", address: 412000, size: 6808, align: 1000, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +3: Section { name: ".data", address: 419000, size: 12f4, align: 1000, kind: Data, flags: Coff { characteristics: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +4: Section { name: ".reloc", address: 41b000, size: ec8, align: 1000, kind: Other, flags: Coff { characteristics: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } Symbols diff --git a/crates/examples/testfiles/pe/base.o.objdump b/crates/examples/testfiles/pe/base.o.objdump index 69d87b5..b662844 100644 --- a/crates/examples/testfiles/pe/base.o.objdump +++ b/crates/examples/testfiles/pe/base.o.objdump @@ -1,7 +1,7 @@ Format: Coff Little-endian 32-bit Kind: Relocatable Architecture: X86_64 -Flags: Coff { characteristics: 4 } +Flags: Coff { characteristics: IMAGE_FILE_LINE_NUMS_STRIPPED } Relative Address Base: 0 Entry Address: 0 Segment { name: ".text", address: 0, size: 0, permissions: R-X } @@ -11,28 +11,28 @@ Segment { name: ".xdata", address: 0, size: 0, permissions: R-- } Segment { name: ".pdata", address: 0, size: 0, permissions: R-- } Segment { name: ".rdata", address: 0, size: 0, permissions: R-- } Segment { name: ".rdata$zzz", address: 0, size: 0, permissions: R-- } -1: Section { name: ".text", address: 0, size: 80, align: 10, kind: Text, flags: Coff { characteristics: 60500020 } } -2: Section { name: ".data", address: 0, size: 0, align: 10, kind: Data, flags: Coff { characteristics: c0500040 } } -3: Section { name: ".bss", address: 0, size: 0, align: 10, kind: UninitializedData, flags: Coff { characteristics: c0500080 } } -4: Section { name: ".xdata", address: 0, size: 18, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: 40300040 } } -5: Section { name: ".pdata", address: 0, size: 18, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: 40300040 } } -6: Section { name: ".rdata", address: 0, size: 10, align: 10, kind: ReadOnlyData, flags: Coff { characteristics: 40500040 } } -7: Section { name: ".rdata$zzz", address: 0, size: 30, align: 10, kind: ReadOnlyData, flags: Coff { characteristics: 40500040 } } +1: Section { name: ".text", address: 0, size: 80, align: 10, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".data", address: 0, size: 0, align: 10, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +3: Section { name: ".bss", address: 0, size: 0, align: 10, kind: UninitializedData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +4: Section { name: ".xdata", address: 0, size: 18, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +5: Section { name: ".pdata", address: 0, size: 18, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +6: Section { name: ".rdata", address: 0, size: 10, align: 10, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +7: Section { name: ".rdata$zzz", address: 0, size: 30, align: 10, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } Symbols -0: Symbol { name: "base.c", address: 0, size: 0, kind: File, section: None, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 67 } } -2: Symbol { name: "printf", address: 0, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: Coff { typ: 20, storage_class: 3 } } -4: Symbol { name: "main", address: 51, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -5: Symbol { name: ".text", address: 0, size: 75, kind: Section, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -7: Symbol { name: ".data", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -9: Symbol { name: ".bss", address: 0, size: 0, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -11: Symbol { name: ".xdata", address: 0, size: 18, kind: Section, section: Section(SectionIndex(4)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -13: Symbol { name: ".pdata", address: 0, size: 18, kind: Section, section: Section(SectionIndex(5)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -15: Symbol { name: ".rdata", address: 0, size: d, kind: Section, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -17: Symbol { name: ".rdata$zzz", address: 0, size: 2b, kind: Section, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -19: Symbol { name: "__imp___acrt_iob_func", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } -20: Symbol { name: "__main", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -21: Symbol { name: "__mingw_vfprintf", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } +0: Symbol { name: "base.c", address: 0, size: 0, kind: File, section: None, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_FILE } } +2: Symbol { name: "printf", address: 0, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_STATIC } } +4: Symbol { name: "main", address: 51, size: 0, kind: Text, section: Section(SectionIndex(1)), scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +5: Symbol { name: ".text", address: 0, size: 75, kind: Section, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +7: Symbol { name: ".data", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +9: Symbol { name: ".bss", address: 0, size: 0, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +11: Symbol { name: ".xdata", address: 0, size: 18, kind: Section, section: Section(SectionIndex(4)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +13: Symbol { name: ".pdata", address: 0, size: 18, kind: Section, section: Section(SectionIndex(5)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +15: Symbol { name: ".rdata", address: 0, size: d, kind: Section, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +17: Symbol { name: ".rdata$zzz", address: 0, size: 2b, kind: Section, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +19: Symbol { name: "__imp___acrt_iob_func", address: 0, size: 0, kind: Data, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +20: Symbol { name: "__main", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +21: Symbol { name: "__mingw_vfprintf", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } .text relocations (2f, Relocation { kind: Relative, encoding: Generic, size: 20, target: Symbol(SymbolIndex(13)), addend: fffffffffffffffc, implicit_addend: true, flags: Coff { typ: 4 } }) diff --git a/crates/examples/testfiles/pe/base.o.readobj b/crates/examples/testfiles/pe/base.o.readobj index c8f9487..9a972de 100644 --- a/crates/examples/testfiles/pe/base.o.readobj +++ b/crates/examples/testfiles/pe/base.o.readobj @@ -6,8 +6,7 @@ ImageFileHeader { PointerToSymbolTable: 0x280 NumberOfSymbols: 22 SizeOfOptionalHeader: 0x0 - Characteristics: 0x4 - IMAGE_FILE_LINE_NUMS_STRIPPED (0x4) + Characteristics: IMAGE_FILE_LINE_NUMS_STRIPPED (0x4) } ImageSectionHeader { Index: 1 @@ -21,10 +20,10 @@ ImageSectionHeader { NumberOfRelocations: 4 NumberOfLinenumbers: 0 Characteristics: 0x60500020 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) ImageRelocation { VirtualAddress: 0x2F Symbol: "__imp___acrt_iob_func" (0x13) @@ -58,10 +57,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0500040 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 3 @@ -75,10 +74,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0500080 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_UNINITIALIZED_DATA (0x80) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 4 @@ -92,9 +91,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x40300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSectionHeader { Index: 5 @@ -108,9 +107,9 @@ ImageSectionHeader { NumberOfRelocations: 6 NumberOfLinenumbers: 0 Characteristics: 0x40300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) ImageRelocation { VirtualAddress: 0x0 Symbol: ".text" (0x5) @@ -154,9 +153,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x40500040 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 7 @@ -170,9 +169,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x40500040 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSymbol { Index: 0 @@ -180,8 +179,6 @@ ImageSymbol { Value: 0x0 Section: IMAGE_SYM_DEBUG (-2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_FILE (0x67) NumberOfAuxSymbols: 0x1 ImageAuxSymbolFile { @@ -193,9 +190,7 @@ ImageSymbol { Name: "printf" Value: 0x0 Section: ".text" (0x1) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolFunction { @@ -211,9 +206,7 @@ ImageSymbol { Name: "main" Value: 0x51 Section: ".text" (0x1) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -223,8 +216,6 @@ ImageSymbol { Value: 0x0 Section: ".text" (0x1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -244,8 +235,6 @@ ImageSymbol { Value: 0x0 Section: ".data" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -265,8 +254,6 @@ ImageSymbol { Value: 0x0 Section: ".bss" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -286,8 +273,6 @@ ImageSymbol { Value: 0x0 Section: ".xdata" (0x4) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -307,8 +292,6 @@ ImageSymbol { Value: 0x0 Section: ".pdata" (0x5) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -328,8 +311,6 @@ ImageSymbol { Value: 0x0 Section: ".rdata" (0x6) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -349,8 +330,6 @@ ImageSymbol { Value: 0x0 Section: ".rdata$zzz" (0x7) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -370,8 +349,6 @@ ImageSymbol { Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -380,9 +357,7 @@ ImageSymbol { Name: "__main" Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -391,9 +366,7 @@ ImageSymbol { Name: "__mingw_vfprintf" Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } diff --git a/crates/examples/testfiles/pe/base.obj.objdump b/crates/examples/testfiles/pe/base.obj.objdump index 299fc84..66366a0 100644 --- a/crates/examples/testfiles/pe/base.obj.objdump +++ b/crates/examples/testfiles/pe/base.obj.objdump @@ -12,37 +12,37 @@ Segment { name: ".text$mn", address: 0, size: 0, permissions: R-X } Segment { name: ".text$mn", address: 0, size: 0, permissions: R-X } Segment { name: ".data", address: 0, size: 0, permissions: RW- } Segment { name: ".chks64", address: 0, size: 0, permissions: --- } -1: Section { name: ".drectve", address: 0, size: 2f, align: 1, kind: Linker, flags: Coff { characteristics: 100a00 } } -2: Section { name: ".debug$S", address: 0, size: 7c, align: 1, kind: Other, flags: Coff { characteristics: 42100040 } } -3: Section { name: ".text$mn", address: 0, size: 14, align: 10, kind: Text, flags: Coff { characteristics: 60500020 } } -4: Section { name: ".text$mn", address: 0, size: a, align: 10, kind: Text, flags: Coff { characteristics: 60501020 } } -5: Section { name: ".text$mn", address: 0, size: 29, align: 10, kind: Text, flags: Coff { characteristics: 60501020 } } -6: Section { name: ".text$mn", address: 0, size: 3a, align: 10, kind: Text, flags: Coff { characteristics: 60501020 } } -7: Section { name: ".data", address: 0, size: d, align: 4, kind: Data, flags: Coff { characteristics: c0300040 } } -8: Section { name: ".chks64", address: 0, size: 40, align: 10, kind: Linker, flags: Coff { characteristics: a00 } } +1: Section { name: ".drectve", address: 0, size: 2f, align: 1, kind: Linker, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_LNK_INFO | IMAGE_SCN_LNK_REMOVE } } +2: Section { name: ".debug$S", address: 0, size: 7c, align: 1, kind: Other, flags: Coff { characteristics: IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_READ } } +3: Section { name: ".text$mn", address: 0, size: 14, align: 10, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +4: Section { name: ".text$mn", address: 0, size: a, align: 10, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_LNK_COMDAT | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +5: Section { name: ".text$mn", address: 0, size: 29, align: 10, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_LNK_COMDAT | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +6: Section { name: ".text$mn", address: 0, size: 3a, align: 10, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_LNK_COMDAT | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +7: Section { name: ".data", address: 0, size: d, align: 4, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +8: Section { name: ".chks64", address: 0, size: 40, align: 10, kind: Linker, flags: Coff { characteristics: IMAGE_SCN_LNK_INFO | IMAGE_SCN_LNK_REMOVE } } Comdat { symbol: SymbolIndex(14), name: "___local_stdio_printf_options", kind: Any } Sections: 4 Comdat { symbol: SymbolIndex(17), name: "__vfprintf_l", kind: Any } Sections: 5 Comdat { symbol: SymbolIndex(18), name: "_printf", kind: Any } Sections: 6 Symbols -0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -1: Symbol { name: "@feat.00", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -2: Symbol { name: ".drectve", address: 0, size: 2f, kind: Section, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -4: Symbol { name: ".debug$S", address: 0, size: 7c, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -6: Symbol { name: ".text$mn", address: 0, size: 14, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -8: Symbol { name: ".text$mn", address: 0, size: a, kind: Section, section: Section(SectionIndex(4)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -10: Symbol { name: ".text$mn", address: 0, size: 29, kind: Section, section: Section(SectionIndex(5)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -12: Symbol { name: ".text$mn", address: 0, size: 3a, kind: Section, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 2, associative_section: None } } -14: Symbol { name: "___local_stdio_printf_options", address: 0, size: 0, kind: Text, section: Section(SectionIndex(4)), scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -15: Symbol { name: "___acrt_iob_func", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -16: Symbol { name: "___stdio_common_vfprintf", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -17: Symbol { name: "__vfprintf_l", address: 0, size: 0, kind: Text, section: Section(SectionIndex(5)), scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -18: Symbol { name: "_printf", address: 0, size: 0, kind: Text, section: Section(SectionIndex(6)), scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -19: Symbol { name: "_main", address: 0, size: 0, kind: Text, section: Section(SectionIndex(3)), scope: Linkage, weak: false, flags: Coff { typ: 20, storage_class: 2 } } -20: Symbol { name: "?_OptionsStorage@?1??__local_stdio_printf_options@@9@9", address: 0, size: 8, kind: Data, section: Common, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } -21: Symbol { name: ".data", address: 0, size: d, kind: Section, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -23: Symbol { name: "$SG9248", address: 0, size: 0, kind: Data, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 3 } } -24: Symbol { name: ".chks64", address: 0, size: 40, kind: Section, section: Section(SectionIndex(8)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } +0: Symbol { name: "@comp.id", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +1: Symbol { name: "@feat.00", address: 0, size: 0, kind: Data, section: Absolute, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +2: Symbol { name: ".drectve", address: 0, size: 2f, kind: Section, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +4: Symbol { name: ".debug$S", address: 0, size: 7c, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +6: Symbol { name: ".text$mn", address: 0, size: 14, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +8: Symbol { name: ".text$mn", address: 0, size: a, kind: Section, section: Section(SectionIndex(4)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +10: Symbol { name: ".text$mn", address: 0, size: 29, kind: Section, section: Section(SectionIndex(5)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +12: Symbol { name: ".text$mn", address: 0, size: 3a, kind: Section, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: IMAGE_COMDAT_SELECT_ANY, associative_section: None } } +14: Symbol { name: "___local_stdio_printf_options", address: 0, size: 0, kind: Text, section: Section(SectionIndex(4)), scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +15: Symbol { name: "___acrt_iob_func", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +16: Symbol { name: "___stdio_common_vfprintf", address: 0, size: 0, kind: Text, section: Undefined, scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +17: Symbol { name: "__vfprintf_l", address: 0, size: 0, kind: Text, section: Section(SectionIndex(5)), scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +18: Symbol { name: "_printf", address: 0, size: 0, kind: Text, section: Section(SectionIndex(6)), scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +19: Symbol { name: "_main", address: 0, size: 0, kind: Text, section: Section(SectionIndex(3)), scope: Linkage, weak: false, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +20: Symbol { name: "?_OptionsStorage@?1??__local_stdio_printf_options@@9@9", address: 0, size: 8, kind: Data, section: Common, scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +21: Symbol { name: ".data", address: 0, size: d, kind: Section, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +23: Symbol { name: "$SG9248", address: 0, size: 0, kind: Data, section: Section(SectionIndex(7)), scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC } } +24: Symbol { name: ".chks64", address: 0, size: 40, kind: Section, section: Section(SectionIndex(8)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } .text$mn relocations (4, Relocation { kind: Absolute, encoding: Generic, size: 20, target: Symbol(SymbolIndex(17)), addend: 0, implicit_addend: true, flags: Coff { typ: 6 } }) diff --git a/crates/examples/testfiles/pe/base.obj.readobj b/crates/examples/testfiles/pe/base.obj.readobj index f316bab..f936b47 100644 --- a/crates/examples/testfiles/pe/base.obj.readobj +++ b/crates/examples/testfiles/pe/base.obj.readobj @@ -20,9 +20,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x100A00 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_LNK_INFO (0x200) IMAGE_SCN_LNK_REMOVE (0x800) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 2 @@ -36,10 +36,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x42100040 + IMAGE_SCN_ALIGN_1BYTES (0x100000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_DISCARDABLE (0x2000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_1BYTES (0x100000) } ImageSectionHeader { Index: 3 @@ -53,10 +53,10 @@ ImageSectionHeader { NumberOfRelocations: 2 NumberOfLinenumbers: 0 Characteristics: 0x60500020 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) ImageRelocation { VirtualAddress: 0x4 Symbol: "$SG9248" (0x17) @@ -80,11 +80,11 @@ ImageSectionHeader { NumberOfRelocations: 1 NumberOfLinenumbers: 0 Characteristics: 0x60501020 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_LNK_COMDAT (0x1000) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) ImageRelocation { VirtualAddress: 0x4 Symbol: "?_OptionsStorage@?1??__local_stdio_printf_options@@9@9" (0x14) @@ -103,11 +103,11 @@ ImageSectionHeader { NumberOfRelocations: 2 NumberOfLinenumbers: 0 Characteristics: 0x60501020 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_LNK_COMDAT (0x1000) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) ImageRelocation { VirtualAddress: 0x14 Symbol: "___local_stdio_printf_options" (0xE) @@ -131,11 +131,11 @@ ImageSectionHeader { NumberOfRelocations: 2 NumberOfLinenumbers: 0 Characteristics: 0x60501020 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_LNK_COMDAT (0x1000) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) ImageRelocation { VirtualAddress: 0x19 Symbol: "___acrt_iob_func" (0xF) @@ -159,10 +159,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSectionHeader { Index: 8 @@ -185,8 +185,6 @@ ImageSymbol { Value: 0x1047556 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -196,8 +194,6 @@ ImageSymbol { Value: 0x80010191 Section: IMAGE_SYM_ABSOLUTE (-1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -207,8 +203,6 @@ ImageSymbol { Value: 0x0 Section: ".drectve" (0x1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -228,8 +222,6 @@ ImageSymbol { Value: 0x0 Section: ".debug$S" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -249,8 +241,6 @@ ImageSymbol { Value: 0x0 Section: ".text$mn" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -270,8 +260,6 @@ ImageSymbol { Value: 0x0 Section: ".text$mn" (0x4) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -291,8 +279,6 @@ ImageSymbol { Value: 0x0 Section: ".text$mn" (0x5) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -312,8 +298,6 @@ ImageSymbol { Value: 0x0 Section: ".text$mn" (0x6) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -332,9 +316,7 @@ ImageSymbol { Name: "___local_stdio_printf_options" Value: 0x0 Section: ".text$mn" (0x4) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -343,9 +325,7 @@ ImageSymbol { Name: "___acrt_iob_func" Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -354,9 +334,7 @@ ImageSymbol { Name: "___stdio_common_vfprintf" Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -365,9 +343,7 @@ ImageSymbol { Name: "__vfprintf_l" Value: 0x0 Section: ".text$mn" (0x5) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -376,9 +352,7 @@ ImageSymbol { Name: "_printf" Value: 0x0 Section: ".text$mn" (0x6) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -387,9 +361,7 @@ ImageSymbol { Name: "_main" Value: 0x0 Section: ".text$mn" (0x3) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -399,8 +371,6 @@ ImageSymbol { Value: 0x8 Section: IMAGE_SYM_UNDEFINED (0) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -410,8 +380,6 @@ ImageSymbol { Value: 0x0 Section: ".data" (0x7) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -431,8 +399,6 @@ ImageSymbol { Value: 0x0 Section: ".data" (0x7) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x0 } @@ -442,8 +408,6 @@ ImageSymbol { Value: 0x0 Section: ".chks64" (0x8) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { diff --git a/crates/examples/testfiles/pe/weak-extern.o.objdump b/crates/examples/testfiles/pe/weak-extern.o.objdump index a3f51bf..f089e42 100644 --- a/crates/examples/testfiles/pe/weak-extern.o.objdump +++ b/crates/examples/testfiles/pe/weak-extern.o.objdump @@ -1,7 +1,7 @@ Format: Coff Little-endian 32-bit Kind: Relocatable Architecture: X86_64 -Flags: Coff { characteristics: 4 } +Flags: Coff { characteristics: IMAGE_FILE_LINE_NUMS_STRIPPED } Relative Address Base: 0 Entry Address: 0 Segment { name: ".text", address: 0, size: 0, permissions: R-X } @@ -10,23 +10,23 @@ Segment { name: ".bss", address: 0, size: 0, permissions: RW- } Segment { name: ".xdata", address: 0, size: 0, permissions: R-- } Segment { name: ".pdata", address: 0, size: 0, permissions: R-- } Segment { name: ".rdata$zzz", address: 0, size: 0, permissions: R-- } -1: Section { name: ".text", address: 0, size: 10, align: 10, kind: Text, flags: Coff { characteristics: 60500020 } } -2: Section { name: ".data", address: 0, size: 0, align: 10, kind: Data, flags: Coff { characteristics: c0500040 } } -3: Section { name: ".bss", address: 0, size: 0, align: 10, kind: UninitializedData, flags: Coff { characteristics: c0500080 } } -4: Section { name: ".xdata", address: 0, size: 8, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: 40300040 } } -5: Section { name: ".pdata", address: 0, size: c, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: 40300040 } } -6: Section { name: ".rdata$zzz", address: 0, size: 40, align: 10, kind: ReadOnlyData, flags: Coff { characteristics: 40500040 } } +1: Section { name: ".text", address: 0, size: 10, align: 10, kind: Text, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ } } +2: Section { name: ".data", address: 0, size: 0, align: 10, kind: Data, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +3: Section { name: ".bss", address: 0, size: 0, align: 10, kind: UninitializedData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE } } +4: Section { name: ".xdata", address: 0, size: 8, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +5: Section { name: ".pdata", address: 0, size: c, align: 4, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } +6: Section { name: ".rdata$zzz", address: 0, size: 40, align: 10, kind: ReadOnlyData, flags: Coff { characteristics: IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } } Symbols -0: Symbol { name: "weak-extern.c", address: 0, size: 0, kind: File, section: None, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: 67 } } -2: Symbol { name: ".text", address: 0, size: 7, kind: Section, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -4: Symbol { name: ".data", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -6: Symbol { name: ".bss", address: 0, size: 0, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -8: Symbol { name: ".xdata", address: 0, size: 8, kind: Section, section: Section(SectionIndex(4)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -10: Symbol { name: ".pdata", address: 0, size: c, kind: Section, section: Section(SectionIndex(5)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -12: Symbol { name: ".rdata$zzz", address: 0, size: 38, kind: Section, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: 3, selection: 0, associative_section: None } } -14: Symbol { name: ".weak.weak_symbol.", address: 0, size: 0, kind: Data, section: Section(SectionIndex(1)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: 2 } } -15: Symbol { name: "weak_symbol", address: 0, size: 0, kind: Text, section: Unknown, scope: Linkage, weak: true, flags: Coff { typ: 20, storage_class: 69 } } +0: Symbol { name: "weak-extern.c", address: 0, size: 0, kind: File, section: None, scope: Compilation, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_FILE } } +2: Symbol { name: ".text", address: 0, size: 7, kind: Section, section: Section(SectionIndex(1)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +4: Symbol { name: ".data", address: 0, size: 0, kind: Section, section: Section(SectionIndex(2)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +6: Symbol { name: ".bss", address: 0, size: 0, kind: Section, section: Section(SectionIndex(3)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +8: Symbol { name: ".xdata", address: 0, size: 8, kind: Section, section: Section(SectionIndex(4)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +10: Symbol { name: ".pdata", address: 0, size: c, kind: Section, section: Section(SectionIndex(5)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +12: Symbol { name: ".rdata$zzz", address: 0, size: 38, kind: Section, section: Section(SectionIndex(6)), scope: Compilation, weak: false, flags: CoffSection { typ: 0, storage_class: IMAGE_SYM_CLASS_STATIC, selection: 0, associative_section: None } } +14: Symbol { name: ".weak.weak_symbol.", address: 0, size: 0, kind: Data, section: Section(SectionIndex(1)), scope: Linkage, weak: false, flags: Coff { typ: 0, storage_class: IMAGE_SYM_CLASS_EXTERNAL } } +15: Symbol { name: "weak_symbol", address: 0, size: 0, kind: Text, section: Unknown, scope: Linkage, weak: true, flags: Coff { typ: IMAGE_SYM_DTYPE_FUNCTION, storage_class: IMAGE_SYM_CLASS_WEAK_EXTERNAL } } .pdata relocations (0, Relocation { kind: ImageOffset, encoding: Generic, size: 20, target: Symbol(SymbolIndex(2)), addend: 0, implicit_addend: true, flags: Coff { typ: 3 } }) diff --git a/crates/examples/testfiles/pe/weak-extern.o.readobj b/crates/examples/testfiles/pe/weak-extern.o.readobj index f14e2e3..9a2a703 100644 --- a/crates/examples/testfiles/pe/weak-extern.o.readobj +++ b/crates/examples/testfiles/pe/weak-extern.o.readobj @@ -6,8 +6,7 @@ ImageFileHeader { PointerToSymbolTable: 0x186 NumberOfSymbols: 17 SizeOfOptionalHeader: 0x0 - Characteristics: 0x4 - IMAGE_FILE_LINE_NUMS_STRIPPED (0x4) + Characteristics: IMAGE_FILE_LINE_NUMS_STRIPPED (0x4) } ImageSectionHeader { Index: 1 @@ -21,10 +20,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x60500020 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_CODE (0x20) IMAGE_SCN_MEM_EXECUTE (0x20000000) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 2 @@ -38,10 +37,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0500040 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 3 @@ -55,10 +54,10 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0xC0500080 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_UNINITIALIZED_DATA (0x80) IMAGE_SCN_MEM_READ (0x40000000) IMAGE_SCN_MEM_WRITE (0x80000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSectionHeader { Index: 4 @@ -72,9 +71,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x40300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) } ImageSectionHeader { Index: 5 @@ -88,9 +87,9 @@ ImageSectionHeader { NumberOfRelocations: 3 NumberOfLinenumbers: 0 Characteristics: 0x40300040 + IMAGE_SCN_ALIGN_4BYTES (0x300000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_4BYTES (0x300000) ImageRelocation { VirtualAddress: 0x0 Symbol: ".text" (0x2) @@ -119,9 +118,9 @@ ImageSectionHeader { NumberOfRelocations: 0 NumberOfLinenumbers: 0 Characteristics: 0x40500040 + IMAGE_SCN_ALIGN_16BYTES (0x500000) IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) IMAGE_SCN_MEM_READ (0x40000000) - IMAGE_SCN_ALIGN_16BYTES (0x500000) } ImageSymbol { Index: 0 @@ -129,8 +128,6 @@ ImageSymbol { Value: 0x0 Section: IMAGE_SYM_DEBUG (-2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_FILE (0x67) NumberOfAuxSymbols: 0x1 ImageAuxSymbolFile { @@ -143,8 +140,6 @@ ImageSymbol { Value: 0x0 Section: ".text" (0x1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -164,8 +159,6 @@ ImageSymbol { Value: 0x0 Section: ".data" (0x2) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -185,8 +178,6 @@ ImageSymbol { Value: 0x0 Section: ".bss" (0x3) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -206,8 +197,6 @@ ImageSymbol { Value: 0x0 Section: ".xdata" (0x4) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -227,8 +216,6 @@ ImageSymbol { Value: 0x0 Section: ".pdata" (0x5) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -248,8 +235,6 @@ ImageSymbol { Value: 0x0 Section: ".rdata$zzz" (0x6) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_STATIC (0x3) NumberOfAuxSymbols: 0x1 ImageAuxSymbolSection { @@ -269,8 +254,6 @@ ImageSymbol { Value: 0x0 Section: ".text" (0x1) Type: 0x0 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_NULL (0x0) StorageClass: IMAGE_SYM_CLASS_EXTERNAL (0x2) NumberOfAuxSymbols: 0x0 } @@ -279,9 +262,7 @@ ImageSymbol { Name: "weak_symbol" Value: 0x0 Section: IMAGE_SYM_UNDEFINED (0) - Type: 0x20 - BaseType: IMAGE_SYM_TYPE_NULL (0x0) - DerivedType: IMAGE_SYM_DTYPE_FUNCTION (0x2) + Type: IMAGE_SYM_DTYPE_FUNCTION (0x20) StorageClass: IMAGE_SYM_CLASS_WEAK_EXTERNAL (0x69) NumberOfAuxSymbols: 0x1 ImageAuxWeak { diff --git a/src/common.rs b/src/common.rs index 50b9791..f8da8e1 100644 --- a/src/common.rs +++ b/src/common.rs @@ -495,7 +495,7 @@ pub enum FileFlags { #[cfg(feature = "coff")] Coff { /// `Characteristics` field in the COFF file header. - characteristics: u16, + characteristics: crate::pe::FileFlags, }, /// XCOFF file flags. #[cfg(feature = "xcoff")] @@ -533,7 +533,7 @@ pub enum SegmentFlags { #[cfg(feature = "coff")] Coff { /// `Characteristics` field in the segment header. - characteristics: u32, + characteristics: crate::pe::SectionFlags, }, } @@ -630,7 +630,7 @@ pub enum SectionFlags { #[cfg(feature = "coff")] Coff { /// `Characteristics` field in the section header. - characteristics: u32, + characteristics: crate::pe::SectionFlags, }, /// XCOFF section flags. #[cfg(feature = "xcoff")] @@ -666,19 +666,19 @@ pub enum SymbolFlags { #[cfg(feature = "coff")] Coff { /// `Type` field in the COFF symbol. - typ: u16, + typ: crate::pe::SymbolType, /// `StorageClass` field in the COFF symbol. - storage_class: u8, + storage_class: crate::pe::SymbolClass, }, /// COFF flags for a section symbol with an auxiliary symbol. #[cfg(feature = "coff")] CoffSection { /// `Type` field in the COFF symbol. - typ: u16, + typ: crate::pe::SymbolType, /// `StorageClass` field in the COFF symbol. - storage_class: u8, + storage_class: crate::pe::SymbolClass, /// `Selection` field in the auxiliary symbol for the section. - selection: u8, + selection: crate::pe::ComdatSelection, /// `Number` field in the auxiliary symbol for the section. associative_section: Option
, }, diff --git a/src/pe.rs b/src/pe.rs index 0727c0f..34d859b 100644 --- a/src/pe.rs +++ b/src/pe.rs @@ -37,7 +37,7 @@ pub const fn constants() -> &'static Constants { /// /// Note that these also include the values returned by [`constants`]. #[cfg(feature = "names")] -pub const fn machine_constants(machine: u16) -> &'static Constants { +pub const fn machine_constants(machine: Machine) -> &'static Constants { match machine { IMAGE_FILE_MACHINE_I386 => I386::constants(), IMAGE_FILE_MACHINE_MIPS16 | IMAGE_FILE_MACHINE_MIPSFPU | IMAGE_FILE_MACHINE_MIPSFPU16 => { @@ -323,119 +323,133 @@ pub struct MaskedRichHeaderEntry { #[derive(Debug, Clone, Copy)] #[repr(C)] pub struct ImageFileHeader { - pub machine: U16, + pub machine: U16, pub number_of_sections: U16, pub time_date_stamp: U32, pub pointer_to_symbol_table: U32, pub number_of_symbols: U32, pub size_of_optional_header: U16, - pub characteristics: U16, + pub characteristics: U16, } pub const IMAGE_SIZEOF_FILE_HEADER: usize = 20; -/// Relocation info stripped from file. -pub const IMAGE_FILE_RELOCS_STRIPPED: u16 = 0x0001; -/// File is executable (i.e. no unresolved external references). -pub const IMAGE_FILE_EXECUTABLE_IMAGE: u16 = 0x0002; -/// Line numbers stripped from file. -pub const IMAGE_FILE_LINE_NUMS_STRIPPED: u16 = 0x0004; -/// Local symbols stripped from file. -pub const IMAGE_FILE_LOCAL_SYMS_STRIPPED: u16 = 0x0008; -/// Aggressively trim working set -pub const IMAGE_FILE_AGGRESIVE_WS_TRIM: u16 = 0x0010; -/// App can handle >2gb addresses -pub const IMAGE_FILE_LARGE_ADDRESS_AWARE: u16 = 0x0020; -/// Bytes of machine word are reversed. -pub const IMAGE_FILE_BYTES_REVERSED_LO: u16 = 0x0080; -/// 32 bit word machine. -pub const IMAGE_FILE_32BIT_MACHINE: u16 = 0x0100; -/// Debugging info stripped from file in .DBG file -pub const IMAGE_FILE_DEBUG_STRIPPED: u16 = 0x0200; -/// If Image is on removable media, copy and run from the swap file. -pub const IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP: u16 = 0x0400; -/// If Image is on Net, copy and run from the swap file. -pub const IMAGE_FILE_NET_RUN_FROM_SWAP: u16 = 0x0800; -/// System File. -pub const IMAGE_FILE_SYSTEM: u16 = 0x1000; -/// File is a DLL. -pub const IMAGE_FILE_DLL: u16 = 0x2000; -/// File should only be run on a UP machine -pub const IMAGE_FILE_UP_SYSTEM_ONLY: u16 = 0x4000; -/// Bytes of machine word are reversed. -pub const IMAGE_FILE_BYTES_REVERSED_HI: u16 = 0x8000; +newtype!( + /// Values for `ImageFileHeader::characteristics`. + struct FileFlags(u16); +); -pub const IMAGE_FILE_MACHINE_UNKNOWN: u16 = 0; -/// Useful for indicating we want to interact with the host and not a WoW guest. -pub const IMAGE_FILE_MACHINE_TARGET_HOST: u16 = 0x0001; -/// Intel 386. -pub const IMAGE_FILE_MACHINE_I386: u16 = 0x014c; -/// MIPS little-endian, 0x160 big-endian -pub const IMAGE_FILE_MACHINE_R3000: u16 = 0x0162; -/// MIPS little-endian -pub const IMAGE_FILE_MACHINE_R4000: u16 = 0x0166; -/// MIPS little-endian -pub const IMAGE_FILE_MACHINE_R10000: u16 = 0x0168; -/// MIPS little-endian WCE v2 -pub const IMAGE_FILE_MACHINE_WCEMIPSV2: u16 = 0x0169; -/// Alpha_AXP -pub const IMAGE_FILE_MACHINE_ALPHA: u16 = 0x0184; -/// SH3 little-endian -pub const IMAGE_FILE_MACHINE_SH3: u16 = 0x01a2; -pub const IMAGE_FILE_MACHINE_SH3DSP: u16 = 0x01a3; -/// SH3E little-endian -pub const IMAGE_FILE_MACHINE_SH3E: u16 = 0x01a4; -/// SH4 little-endian -pub const IMAGE_FILE_MACHINE_SH4: u16 = 0x01a6; -/// SH5 -pub const IMAGE_FILE_MACHINE_SH5: u16 = 0x01a8; -/// ARM Little-Endian -pub const IMAGE_FILE_MACHINE_ARM: u16 = 0x01c0; -/// ARM Thumb/Thumb-2 Little-Endian -pub const IMAGE_FILE_MACHINE_THUMB: u16 = 0x01c2; -/// ARM Thumb-2 Little-Endian -pub const IMAGE_FILE_MACHINE_ARMNT: u16 = 0x01c4; -pub const IMAGE_FILE_MACHINE_AM33: u16 = 0x01d3; -/// IBM PowerPC Little-Endian -pub const IMAGE_FILE_MACHINE_POWERPC: u16 = 0x01F0; -pub const IMAGE_FILE_MACHINE_POWERPCFP: u16 = 0x01f1; -/// IBM PowerPC Big-Endian -pub const IMAGE_FILE_MACHINE_POWERPCBE: u16 = 0x01f2; -/// Intel 64 -pub const IMAGE_FILE_MACHINE_IA64: u16 = 0x0200; -/// MIPS -pub const IMAGE_FILE_MACHINE_MIPS16: u16 = 0x0266; -/// ALPHA64 -pub const IMAGE_FILE_MACHINE_ALPHA64: u16 = 0x0284; -/// MIPS -pub const IMAGE_FILE_MACHINE_MIPSFPU: u16 = 0x0366; -/// MIPS -pub const IMAGE_FILE_MACHINE_MIPSFPU16: u16 = 0x0466; -pub const IMAGE_FILE_MACHINE_AXP64: u16 = IMAGE_FILE_MACHINE_ALPHA64; -/// Infineon -pub const IMAGE_FILE_MACHINE_TRICORE: u16 = 0x0520; -pub const IMAGE_FILE_MACHINE_CEF: u16 = 0x0CEF; -/// EFI Byte Code -pub const IMAGE_FILE_MACHINE_EBC: u16 = 0x0EBC; -/// AMD64 (K8) -pub const IMAGE_FILE_MACHINE_AMD64: u16 = 0x8664; -/// M32R little-endian -pub const IMAGE_FILE_MACHINE_M32R: u16 = 0x9041; -/// ARM64 Little-Endian -pub const IMAGE_FILE_MACHINE_ARM64: u16 = 0xAA64; -/// ARM64EC ("Emulation Compatible") -pub const IMAGE_FILE_MACHINE_ARM64EC: u16 = 0xA641; -pub const IMAGE_FILE_MACHINE_CEE: u16 = 0xC0EE; -/// RISCV32 -pub const IMAGE_FILE_MACHINE_RISCV32: u16 = 0x5032; -/// RISCV64 -pub const IMAGE_FILE_MACHINE_RISCV64: u16 = 0x5064; -/// RISCV128 -pub const IMAGE_FILE_MACHINE_RISCV128: u16 = 0x5128; -/// ARM64X (Mixed ARM64 and ARM64EC) -pub const IMAGE_FILE_MACHINE_ARM64X: u16 = 0xA64E; -/// CHPE x86 ("Compiled Hybrid Portable Executable") -pub const IMAGE_FILE_MACHINE_CHPE_X86: u16 = 0x3A64; +newtype_flag_names!(NAMES_FILE_FLAGS: FileFlags(u16) = { + /// Relocation info stripped from file. + IMAGE_FILE_RELOCS_STRIPPED = 0x0001, + /// File is executable (i.e. no unresolved external references). + IMAGE_FILE_EXECUTABLE_IMAGE = 0x0002, + /// Line numbers stripped from file. + IMAGE_FILE_LINE_NUMS_STRIPPED = 0x0004, + /// Local symbols stripped from file. + IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0x0008, + /// Aggressively trim working set + IMAGE_FILE_AGGRESIVE_WS_TRIM = 0x0010, + /// App can handle >2gb addresses + IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x0020, + /// Bytes of machine word are reversed. + IMAGE_FILE_BYTES_REVERSED_LO = 0x0080, + /// 32 bit word machine. + IMAGE_FILE_32BIT_MACHINE = 0x0100, + /// Debugging info stripped from file in .DBG file + IMAGE_FILE_DEBUG_STRIPPED = 0x0200, + /// If Image is on removable media, copy and run from the swap file. + IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400, + /// If Image is on Net, copy and run from the swap file. + IMAGE_FILE_NET_RUN_FROM_SWAP = 0x0800, + /// System File. + IMAGE_FILE_SYSTEM = 0x1000, + /// File is a DLL. + IMAGE_FILE_DLL = 0x2000, + /// File should only be run on a UP machine + IMAGE_FILE_UP_SYSTEM_ONLY = 0x4000, + /// Bytes of machine word are reversed. + IMAGE_FILE_BYTES_REVERSED_HI = 0x8000, +}); + +newtype!( + /// Values for the `machine` field in file headers. + struct Machine(u16); +); + +newtype_constant_names!(NAMES_MACHINE: Machine(u16) = { + IMAGE_FILE_MACHINE_UNKNOWN = 0, + /// Useful for indicating we want to interact with the host and not a WoW guest. + IMAGE_FILE_MACHINE_TARGET_HOST = 0x0001, + /// Intel 386. + IMAGE_FILE_MACHINE_I386 = 0x014c, + /// MIPS little-endian, 0x160 big-endian + IMAGE_FILE_MACHINE_R3000 = 0x0162, + /// MIPS little-endian + IMAGE_FILE_MACHINE_R4000 = 0x0166, + /// MIPS little-endian + IMAGE_FILE_MACHINE_R10000 = 0x0168, + /// MIPS little-endian WCE v2 + IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x0169, + /// Alpha_AXP + IMAGE_FILE_MACHINE_ALPHA = 0x0184, + /// SH3 little-endian + IMAGE_FILE_MACHINE_SH3 = 0x01a2, + IMAGE_FILE_MACHINE_SH3DSP = 0x01a3, + /// SH3E little-endian + IMAGE_FILE_MACHINE_SH3E = 0x01a4, + /// SH4 little-endian + IMAGE_FILE_MACHINE_SH4 = 0x01a6, + /// SH5 + IMAGE_FILE_MACHINE_SH5 = 0x01a8, + /// ARM Little-Endian + IMAGE_FILE_MACHINE_ARM = 0x01c0, + /// ARM Thumb/Thumb-2 Little-Endian + IMAGE_FILE_MACHINE_THUMB = 0x01c2, + /// ARM Thumb-2 Little-Endian + IMAGE_FILE_MACHINE_ARMNT = 0x01c4, + IMAGE_FILE_MACHINE_AM33 = 0x01d3, + /// IBM PowerPC Little-Endian + IMAGE_FILE_MACHINE_POWERPC = 0x01F0, + IMAGE_FILE_MACHINE_POWERPCFP = 0x01f1, + /// IBM PowerPC Big-Endian + IMAGE_FILE_MACHINE_POWERPCBE = 0x01f2, + /// Intel 64 + IMAGE_FILE_MACHINE_IA64 = 0x0200, + /// MIPS + IMAGE_FILE_MACHINE_MIPS16 = 0x0266, + /// ALPHA64 + IMAGE_FILE_MACHINE_ALPHA64 = 0x0284, + /// MIPS + IMAGE_FILE_MACHINE_MIPSFPU = 0x0366, + /// MIPS + IMAGE_FILE_MACHINE_MIPSFPU16 = 0x0466, + IMAGE_FILE_MACHINE_AXP64 = IMAGE_FILE_MACHINE_ALPHA64.0, + /// Infineon + IMAGE_FILE_MACHINE_TRICORE = 0x0520, + IMAGE_FILE_MACHINE_CEF = 0x0CEF, + /// EFI Byte Code + IMAGE_FILE_MACHINE_EBC = 0x0EBC, + /// AMD64 (K8) + IMAGE_FILE_MACHINE_AMD64 = 0x8664, + /// M32R little-endian + IMAGE_FILE_MACHINE_M32R = 0x9041, + /// ARM64 Little-Endian + IMAGE_FILE_MACHINE_ARM64 = 0xAA64, + /// ARM64EC ("Emulation Compatible") + IMAGE_FILE_MACHINE_ARM64EC = 0xA641, + IMAGE_FILE_MACHINE_CEE = 0xC0EE, + /// RISCV32 + IMAGE_FILE_MACHINE_RISCV32 = 0x5032, + /// RISCV64 + IMAGE_FILE_MACHINE_RISCV64 = 0x5064, + /// RISCV128 + IMAGE_FILE_MACHINE_RISCV128 = 0x5128, + /// ARM64X (Mixed ARM64 and ARM64EC) + IMAGE_FILE_MACHINE_ARM64X = 0xA64E, + /// CHPE x86 ("Compiled Hybrid Portable Executable") + IMAGE_FILE_MACHINE_CHPE_X86 = 0x3A64, +}); // // Directory format. @@ -482,8 +496,8 @@ pub struct ImageOptionalHeader32 { pub size_of_image: U32, pub size_of_headers: U32, pub check_sum: U32, - pub subsystem: U16, - pub dll_characteristics: U16, + pub subsystem: U16, + pub dll_characteristics: U16, pub size_of_stack_reserve: U32, pub size_of_stack_commit: U32, pub size_of_heap_reserve: U32, @@ -535,8 +549,8 @@ pub struct ImageOptionalHeader64 { pub size_of_image: U32, pub size_of_headers: U32, pub check_sum: U32, - pub subsystem: U16, - pub dll_characteristics: U16, + pub subsystem: U16, + pub dll_characteristics: U16, pub size_of_stack_reserve: U64, pub size_of_stack_commit: U64, pub size_of_heap_reserve: U64, @@ -573,93 +587,106 @@ pub struct ImageRomHeaders { pub optional_header: ImageRomOptionalHeader, } -// Values for `ImageOptionalHeader*::subsystem`. +newtype!( + /// Values for `ImageOptionalHeader*::subsystem`. + struct Subsystem(u16); +); -/// Unknown subsystem. -pub const IMAGE_SUBSYSTEM_UNKNOWN: u16 = 0; -/// Image doesn't require a subsystem. -pub const IMAGE_SUBSYSTEM_NATIVE: u16 = 1; -/// Image runs in the Windows GUI subsystem. -pub const IMAGE_SUBSYSTEM_WINDOWS_GUI: u16 = 2; -/// Image runs in the Windows character subsystem. -pub const IMAGE_SUBSYSTEM_WINDOWS_CUI: u16 = 3; -/// image runs in the OS/2 character subsystem. -pub const IMAGE_SUBSYSTEM_OS2_CUI: u16 = 5; -/// image runs in the Posix character subsystem. -pub const IMAGE_SUBSYSTEM_POSIX_CUI: u16 = 7; -/// image is a native Win9x driver. -pub const IMAGE_SUBSYSTEM_NATIVE_WINDOWS: u16 = 8; -/// Image runs in the Windows CE subsystem. -pub const IMAGE_SUBSYSTEM_WINDOWS_CE_GUI: u16 = 9; -pub const IMAGE_SUBSYSTEM_EFI_APPLICATION: u16 = 10; -pub const IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER: u16 = 11; -pub const IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER: u16 = 12; -pub const IMAGE_SUBSYSTEM_EFI_ROM: u16 = 13; -pub const IMAGE_SUBSYSTEM_XBOX: u16 = 14; -pub const IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION: u16 = 16; -pub const IMAGE_SUBSYSTEM_XBOX_CODE_CATALOG: u16 = 17; +newtype_constant_names!(NAMES_SUBSYSTEM: Subsystem(u16) = { + /// Unknown subsystem. + IMAGE_SUBSYSTEM_UNKNOWN = 0, + /// Image doesn't require a subsystem. + IMAGE_SUBSYSTEM_NATIVE = 1, + /// Image runs in the Windows GUI subsystem. + IMAGE_SUBSYSTEM_WINDOWS_GUI = 2, + /// Image runs in the Windows character subsystem. + IMAGE_SUBSYSTEM_WINDOWS_CUI = 3, + /// image runs in the OS/2 character subsystem. + IMAGE_SUBSYSTEM_OS2_CUI = 5, + /// image runs in the Posix character subsystem. + IMAGE_SUBSYSTEM_POSIX_CUI = 7, + /// image is a native Win9x driver. + IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8, + /// Image runs in the Windows CE subsystem. + IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9, + IMAGE_SUBSYSTEM_EFI_APPLICATION = 10, + IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11, + IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12, + IMAGE_SUBSYSTEM_EFI_ROM = 13, + IMAGE_SUBSYSTEM_XBOX = 14, + IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16, + IMAGE_SUBSYSTEM_XBOX_CODE_CATALOG = 17, +}); -// Values for `ImageOptionalHeader*::dll_characteristics`. +newtype!( + /// Values for `ImageOptionalHeader*::dll_characteristics`. + struct DllFlags(u16); +); -// IMAGE_LIBRARY_PROCESS_INIT 0x0001 // Reserved. -// IMAGE_LIBRARY_PROCESS_TERM 0x0002 // Reserved. -// IMAGE_LIBRARY_THREAD_INIT 0x0004 // Reserved. -// IMAGE_LIBRARY_THREAD_TERM 0x0008 // Reserved. -/// Image can handle a high entropy 64-bit virtual address space. -pub const IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA: u16 = 0x0020; -/// DLL can move. -pub const IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE: u16 = 0x0040; -/// Code Integrity Image -pub const IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY: u16 = 0x0080; -/// Image is NX compatible -pub const IMAGE_DLLCHARACTERISTICS_NX_COMPAT: u16 = 0x0100; -/// Image understands isolation and doesn't want it -pub const IMAGE_DLLCHARACTERISTICS_NO_ISOLATION: u16 = 0x0200; -/// Image does not use SEH. No SE handler may reside in this image -pub const IMAGE_DLLCHARACTERISTICS_NO_SEH: u16 = 0x0400; -/// Do not bind this image. -pub const IMAGE_DLLCHARACTERISTICS_NO_BIND: u16 = 0x0800; -/// Image should execute in an AppContainer -pub const IMAGE_DLLCHARACTERISTICS_APPCONTAINER: u16 = 0x1000; -/// Driver uses WDM model -pub const IMAGE_DLLCHARACTERISTICS_WDM_DRIVER: u16 = 0x2000; -/// Image supports Control Flow Guard. -pub const IMAGE_DLLCHARACTERISTICS_GUARD_CF: u16 = 0x4000; -pub const IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE: u16 = 0x8000; +newtype_flag_names!(NAMES_DLL_FLAGS: DllFlags(u16) = { + // IMAGE_LIBRARY_PROCESS_INIT 0x0001 // Reserved. + // IMAGE_LIBRARY_PROCESS_TERM 0x0002 // Reserved. + // IMAGE_LIBRARY_THREAD_INIT 0x0004 // Reserved. + // IMAGE_LIBRARY_THREAD_TERM 0x0008 // Reserved. + /// Image can handle a high entropy 64-bit virtual address space. + IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA = 0x0020, + /// DLL can move. + IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040, + /// Code Integrity Image + IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY = 0x0080, + /// Image is NX compatible + IMAGE_DLLCHARACTERISTICS_NX_COMPAT = 0x0100, + /// Image understands isolation and doesn't want it + IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = 0x0200, + /// Image does not use SEH. No SE handler may reside in this image + IMAGE_DLLCHARACTERISTICS_NO_SEH = 0x0400, + /// Do not bind this image. + IMAGE_DLLCHARACTERISTICS_NO_BIND = 0x0800, + /// Image should execute in an AppContainer + IMAGE_DLLCHARACTERISTICS_APPCONTAINER = 0x1000, + /// Driver uses WDM model + IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = 0x2000, + /// Image supports Control Flow Guard. + IMAGE_DLLCHARACTERISTICS_GUARD_CF = 0x4000, + IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000, +}); -// Indices for `ImageOptionalHeader*::data_directory`. +/// Indices for `ImageOptionalHeader*::data_directory`. +#[cfg(feature = "names")] +pub const NAMES_DIRECTORY_ENTRY: &ConstantNames = &_NAMES_DIRECTORY_ENTRY; -/// Export Directory -pub const IMAGE_DIRECTORY_ENTRY_EXPORT: usize = 0; -/// Import Directory -pub const IMAGE_DIRECTORY_ENTRY_IMPORT: usize = 1; -/// Resource Directory -pub const IMAGE_DIRECTORY_ENTRY_RESOURCE: usize = 2; -/// Exception Directory -pub const IMAGE_DIRECTORY_ENTRY_EXCEPTION: usize = 3; -/// Security Directory -pub const IMAGE_DIRECTORY_ENTRY_SECURITY: usize = 4; -/// Base Relocation Table -pub const IMAGE_DIRECTORY_ENTRY_BASERELOC: usize = 5; -/// Debug Directory -pub const IMAGE_DIRECTORY_ENTRY_DEBUG: usize = 6; -// IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage) -/// Architecture Specific Data -pub const IMAGE_DIRECTORY_ENTRY_ARCHITECTURE: usize = 7; -/// RVA of GP -pub const IMAGE_DIRECTORY_ENTRY_GLOBALPTR: usize = 8; -/// TLS Directory -pub const IMAGE_DIRECTORY_ENTRY_TLS: usize = 9; -/// Load Configuration Directory -pub const IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG: usize = 10; -/// Bound Import Directory in headers -pub const IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT: usize = 11; -/// Import Address Table -pub const IMAGE_DIRECTORY_ENTRY_IAT: usize = 12; -/// Delay Load Import Descriptors -pub const IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT: usize = 13; -/// COM Runtime descriptor -pub const IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR: usize = 14; +constant_names!(_NAMES_DIRECTORY_ENTRY: usize = { + /// Export Directory + IMAGE_DIRECTORY_ENTRY_EXPORT = 0, + /// Import Directory + IMAGE_DIRECTORY_ENTRY_IMPORT = 1, + /// Resource Directory + IMAGE_DIRECTORY_ENTRY_RESOURCE = 2, + /// Exception Directory + IMAGE_DIRECTORY_ENTRY_EXCEPTION = 3, + /// Security Directory + IMAGE_DIRECTORY_ENTRY_SECURITY = 4, + /// Base Relocation Table + IMAGE_DIRECTORY_ENTRY_BASERELOC = 5, + /// Debug Directory + IMAGE_DIRECTORY_ENTRY_DEBUG = 6, + /// Architecture Specific Data + IMAGE_DIRECTORY_ENTRY_ARCHITECTURE = 7, + /// RVA of GP + IMAGE_DIRECTORY_ENTRY_GLOBALPTR = 8, + /// TLS Directory + IMAGE_DIRECTORY_ENTRY_TLS = 9, + /// Load Configuration Directory + IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG = 10, + /// Bound Import Directory in headers + IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT = 11, + /// Import Address Table + IMAGE_DIRECTORY_ENTRY_IAT = 12, + /// Delay Load Import Descriptors + IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT = 13, + /// COM Runtime descriptor + IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR = 14, +}); #[derive(Debug, Clone, Copy, PartialEq, Eq)] #[repr(C)] @@ -694,12 +721,12 @@ pub use Guid as ClsId; #[repr(C)] pub struct AnonObjectHeader { /// Must be IMAGE_FILE_MACHINE_UNKNOWN - pub sig1: U16, + pub sig1: U16, /// Must be 0xffff pub sig2: U16, /// >= 1 (implies the ClsId field is present) pub version: U16, - pub machine: U16, + pub machine: U16, pub time_date_stamp: U32, /// Used to invoke CoCreateInstance pub class_id: ClsId, @@ -711,12 +738,12 @@ pub struct AnonObjectHeader { #[repr(C)] pub struct AnonObjectHeaderV2 { /// Must be IMAGE_FILE_MACHINE_UNKNOWN - pub sig1: U16, + pub sig1: U16, /// Must be 0xffff pub sig2: U16, /// >= 2 (implies the Flags field is present - otherwise V1) pub version: U16, - pub machine: U16, + pub machine: U16, pub time_date_stamp: U32, /// Used to invoke CoCreateInstance pub class_id: ClsId, @@ -740,13 +767,13 @@ pub const ANON_OBJECT_HEADER_BIGOBJ_CLASS_ID: ClsId = ClsId([ pub struct AnonObjectHeaderBigobj { /* same as ANON_OBJECT_HEADER_V2 */ /// Must be IMAGE_FILE_MACHINE_UNKNOWN - pub sig1: U16, + pub sig1: U16, /// Must be 0xffff pub sig2: U16, /// >= 2 (implies the Flags field is present) pub version: U16, /// Actual machine - IMAGE_FILE_MACHINE_xxx - pub machine: U16, + pub machine: U16, pub time_date_stamp: U32, /// Must be `ANON_OBJECT_HEADER_BIGOBJ_CLASS_ID`. pub class_id: ClsId, @@ -784,84 +811,104 @@ pub struct ImageSectionHeader { pub pointer_to_linenumbers: U32, pub number_of_relocations: U16, pub number_of_linenumbers: U16, - pub characteristics: U32, + pub characteristics: U32, } pub const IMAGE_SIZEOF_SECTION_HEADER: usize = 40; -// Values for `ImageSectionHeader::characteristics`. +newtype!( + /// Values for `ImageSectionHeader::characteristics`. + struct SectionFlags(u32); +); -// IMAGE_SCN_TYPE_REG 0x00000000 // Reserved. -// IMAGE_SCN_TYPE_DSECT 0x00000001 // Reserved. -// IMAGE_SCN_TYPE_NOLOAD 0x00000002 // Reserved. -// IMAGE_SCN_TYPE_GROUP 0x00000004 // Reserved. -/// Reserved. -pub const IMAGE_SCN_TYPE_NO_PAD: u32 = 0x0000_0008; -// IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved. +impl SectionFlags { + /// Return the alignment. + pub fn align(self) -> SectionFlags { + SectionFlags(self.0 & IMAGE_SCN_ALIGN_MASK) + } -/// Section contains code. -pub const IMAGE_SCN_CNT_CODE: u32 = 0x0000_0020; -/// Section contains initialized data. -pub const IMAGE_SCN_CNT_INITIALIZED_DATA: u32 = 0x0000_0040; -/// Section contains uninitialized data. -pub const IMAGE_SCN_CNT_UNINITIALIZED_DATA: u32 = 0x0000_0080; + /// Replace the alignment. + pub fn with_align(self, align: SectionFlags) -> SectionFlags { + SectionFlags(self.0 & !IMAGE_SCN_ALIGN_MASK | align.0 & IMAGE_SCN_ALIGN_MASK) + } +} -/// Reserved. -pub const IMAGE_SCN_LNK_OTHER: u32 = 0x0000_0100; -/// Section contains comments or some other type of information. -pub const IMAGE_SCN_LNK_INFO: u32 = 0x0000_0200; -// IMAGE_SCN_TYPE_OVER 0x00000400 // Reserved. -/// Section contents will not become part of image. -pub const IMAGE_SCN_LNK_REMOVE: u32 = 0x0000_0800; -/// Section contents comdat. -pub const IMAGE_SCN_LNK_COMDAT: u32 = 0x0000_1000; -// 0x00002000 // Reserved. -// IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000 -/// Reset speculative exceptions handling bits in the TLB entries for this section. -pub const IMAGE_SCN_NO_DEFER_SPEC_EXC: u32 = 0x0000_4000; -/// Section content can be accessed relative to GP -pub const IMAGE_SCN_GPREL: u32 = 0x0000_8000; -pub const IMAGE_SCN_MEM_FARDATA: u32 = 0x0000_8000; -// IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000 -pub const IMAGE_SCN_MEM_PURGEABLE: u32 = 0x0002_0000; -pub const IMAGE_SCN_MEM_16BIT: u32 = 0x0002_0000; -pub const IMAGE_SCN_MEM_LOCKED: u32 = 0x0004_0000; -pub const IMAGE_SCN_MEM_PRELOAD: u32 = 0x0008_0000; +newtype_flag_names!(NAMES_SCN_FLAGS: SectionFlags(u32) = { + // IMAGE_SCN_TYPE_REG 0x00000000 // Reserved. + // IMAGE_SCN_TYPE_DSECT 0x00000001 // Reserved. + // IMAGE_SCN_TYPE_NOLOAD 0x00000002 // Reserved. + // IMAGE_SCN_TYPE_GROUP 0x00000004 // Reserved. + /// Reserved. + IMAGE_SCN_TYPE_NO_PAD = 0x0000_0008, + // IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved. -pub const IMAGE_SCN_ALIGN_1BYTES: u32 = 0x0010_0000; -pub const IMAGE_SCN_ALIGN_2BYTES: u32 = 0x0020_0000; -pub const IMAGE_SCN_ALIGN_4BYTES: u32 = 0x0030_0000; -pub const IMAGE_SCN_ALIGN_8BYTES: u32 = 0x0040_0000; -/// Default alignment if no others are specified. -pub const IMAGE_SCN_ALIGN_16BYTES: u32 = 0x0050_0000; -pub const IMAGE_SCN_ALIGN_32BYTES: u32 = 0x0060_0000; -pub const IMAGE_SCN_ALIGN_64BYTES: u32 = 0x0070_0000; -pub const IMAGE_SCN_ALIGN_128BYTES: u32 = 0x0080_0000; -pub const IMAGE_SCN_ALIGN_256BYTES: u32 = 0x0090_0000; -pub const IMAGE_SCN_ALIGN_512BYTES: u32 = 0x00A0_0000; -pub const IMAGE_SCN_ALIGN_1024BYTES: u32 = 0x00B0_0000; -pub const IMAGE_SCN_ALIGN_2048BYTES: u32 = 0x00C0_0000; -pub const IMAGE_SCN_ALIGN_4096BYTES: u32 = 0x00D0_0000; -pub const IMAGE_SCN_ALIGN_8192BYTES: u32 = 0x00E0_0000; -// Unused 0x00F0_0000 -pub const IMAGE_SCN_ALIGN_MASK: u32 = 0x00F0_0000; + /// Section contains code. + IMAGE_SCN_CNT_CODE = 0x0000_0020, + /// Section contains initialized data. + IMAGE_SCN_CNT_INITIALIZED_DATA = 0x0000_0040, + /// Section contains uninitialized data. + IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x0000_0080, -/// Section contains extended relocations. -pub const IMAGE_SCN_LNK_NRELOC_OVFL: u32 = 0x0100_0000; -/// Section can be discarded. -pub const IMAGE_SCN_MEM_DISCARDABLE: u32 = 0x0200_0000; -/// Section is not cacheable. -pub const IMAGE_SCN_MEM_NOT_CACHED: u32 = 0x0400_0000; -/// Section is not pageable. -pub const IMAGE_SCN_MEM_NOT_PAGED: u32 = 0x0800_0000; -/// Section is shareable. -pub const IMAGE_SCN_MEM_SHARED: u32 = 0x1000_0000; -/// Section is executable. -pub const IMAGE_SCN_MEM_EXECUTE: u32 = 0x2000_0000; -/// Section is readable. -pub const IMAGE_SCN_MEM_READ: u32 = 0x4000_0000; -/// Section is writeable. -pub const IMAGE_SCN_MEM_WRITE: u32 = 0x8000_0000; + /// Reserved. + IMAGE_SCN_LNK_OTHER = 0x0000_0100, + /// Section contains comments or some other type of information. + IMAGE_SCN_LNK_INFO = 0x0000_0200, + // IMAGE_SCN_TYPE_OVER 0x00000400 // Reserved. + /// Section contents will not become part of image. + IMAGE_SCN_LNK_REMOVE = 0x0000_0800, + /// Section contents comdat. + IMAGE_SCN_LNK_COMDAT = 0x0000_1000, + // 0x00002000 // Reserved. + // IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000 + /// Reset speculative exceptions handling bits in the TLB entries for this section. + IMAGE_SCN_NO_DEFER_SPEC_EXC = 0x0000_4000, + /// Section content can be accessed relative to GP + IMAGE_SCN_GPREL = 0x0000_8000, + IMAGE_SCN_MEM_FARDATA = 0x0000_8000, + // IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000 + IMAGE_SCN_MEM_PURGEABLE = 0x0002_0000, + IMAGE_SCN_MEM_16BIT = 0x0002_0000, + IMAGE_SCN_MEM_LOCKED = 0x0004_0000, + IMAGE_SCN_MEM_PRELOAD = 0x0008_0000, + + IMAGE_SCN_ALIGN_MASK = 0x00F0_0000 => NAMES_SCN_ALIGN, + + /// Section contains extended relocations. + IMAGE_SCN_LNK_NRELOC_OVFL = 0x0100_0000, + /// Section can be discarded. + IMAGE_SCN_MEM_DISCARDABLE = 0x0200_0000, + /// Section is not cacheable. + IMAGE_SCN_MEM_NOT_CACHED = 0x0400_0000, + /// Section is not pageable. + IMAGE_SCN_MEM_NOT_PAGED = 0x0800_0000, + /// Section is shareable. + IMAGE_SCN_MEM_SHARED = 0x1000_0000, + /// Section is executable. + IMAGE_SCN_MEM_EXECUTE = 0x2000_0000, + /// Section is readable. + IMAGE_SCN_MEM_READ = 0x4000_0000, + /// Section is writeable. + IMAGE_SCN_MEM_WRITE = 0x8000_0000, +}); + +constant_names!(NAMES_SCN_ALIGN: SectionFlags(u32) = { + IMAGE_SCN_ALIGN_1BYTES = 0x0010_0000, + IMAGE_SCN_ALIGN_2BYTES = 0x0020_0000, + IMAGE_SCN_ALIGN_4BYTES = 0x0030_0000, + IMAGE_SCN_ALIGN_8BYTES = 0x0040_0000, + /// Default alignment if no others are specified. + IMAGE_SCN_ALIGN_16BYTES = 0x0050_0000, + IMAGE_SCN_ALIGN_32BYTES = 0x0060_0000, + IMAGE_SCN_ALIGN_64BYTES = 0x0070_0000, + IMAGE_SCN_ALIGN_128BYTES = 0x0080_0000, + IMAGE_SCN_ALIGN_256BYTES = 0x0090_0000, + IMAGE_SCN_ALIGN_512BYTES = 0x00A0_0000, + IMAGE_SCN_ALIGN_1024BYTES = 0x00B0_0000, + IMAGE_SCN_ALIGN_2048BYTES = 0x00C0_0000, + IMAGE_SCN_ALIGN_4096BYTES = 0x00D0_0000, + IMAGE_SCN_ALIGN_8192BYTES = 0x00E0_0000, + // Unused 0x00F0_0000 +}); // // TLS Characteristic Flags @@ -880,8 +927,8 @@ pub struct ImageSymbol { pub name: [u8; 8], pub value: U32, pub section_number: U16, - pub typ: U16, - pub storage_class: u8, + pub typ: U16, + pub storage_class: SymbolClass, pub number_of_aux_symbols: u8, } @@ -897,9 +944,9 @@ pub struct ImageSymbolEx { /// If first 4 bytes are 0, then second 4 bytes are offset into string table. pub name: [u8; 8], pub value: U32, - pub section_number: I32, - pub typ: U16, - pub storage_class: u8, + pub section_number: I32, + pub typ: U16, + pub storage_class: SymbolClass, pub number_of_aux_symbols: u8, } @@ -909,90 +956,181 @@ pub const IMAGE_SIZEOF_SYMBOL_EX: usize = 20; #[repr(C)] pub struct ImageSymbolExBytes(pub [u8; IMAGE_SIZEOF_SYMBOL_EX]); -// Values for `ImageSymbol::section_number`. -// +newtype!( + /// Values for `ImageSymbol::section_number` and `ImageSymbolEx::section_number`. + struct SymbolSection(i32); +); + +impl SymbolSection { + /// Return true if this is a reserved value. + pub fn is_reserved(self) -> bool { + self.0 <= 0 + } + + /// Return the 1-based section index, or `None` if this is a reserved value. + pub fn index(self) -> Option { + if self.0 > 0 { + Some(self.0 as u32) + } else { + None + } + } +} + // Symbols have a section number of the section in which they are // defined. Otherwise, section numbers have the following meanings: +newtype_constant_names!(NAMES_IMAGE_SYM: SymbolSection(i32) = { + /// Symbol is undefined or is common. + IMAGE_SYM_UNDEFINED = 0, + /// Symbol is an absolute value. + IMAGE_SYM_ABSOLUTE = -1, + /// Symbol is a special debug item. + IMAGE_SYM_DEBUG = -2, +}); -/// Symbol is undefined or is common. -pub const IMAGE_SYM_UNDEFINED: i32 = 0; -/// Symbol is an absolute value. -pub const IMAGE_SYM_ABSOLUTE: i32 = -1; -/// Symbol is a special debug item. -pub const IMAGE_SYM_DEBUG: i32 = -2; /// Values 0xFF00-0xFFFF are special pub const IMAGE_SYM_SECTION_MAX: u16 = 0xFEFF; pub const IMAGE_SYM_SECTION_MAX_EX: u32 = 0x7fff_ffff; -// Values for `ImageSymbol::typ` (basic component). +newtype!( + /// Values for `ImageSymbol::typ`. + struct SymbolType(u16); +); + +impl SymbolType { + /// Construct a symbol type from base and derived types. + /// + /// You should generally never need to call this. In practice, only + /// a couple of symbol types are used. Instead, use `SymbolType(0)` + /// or `IMAGE_SYM_DTYPE_FUNCTION.into()`. + pub fn new(base_type: SymbolBaseType, derived_type: SymbolDerivedType) -> Self { + SymbolType(SymbolType::from(base_type).0 | SymbolType::from(derived_type).0) + } + + /// Return the base type component. + pub fn base_type(self) -> SymbolBaseType { + SymbolBaseType(self.0 & N_BTMASK) + } + + /// Return the derived type component. + pub fn derived_type(self) -> SymbolDerivedType { + SymbolDerivedType((self.0 & N_TMASK) >> N_BTSHFT) + } +} + +newtype_flag_names!(NAMES_SYMBOL_TYPE: SymbolType(u16) = { + _ = N_BTMASK => NAMES_IMAGE_SYM_TYPE, + _ = N_TMASK => NAMES_IMAGE_SYM_DTYPE, + IMAGE_SYM_TYPE_PCODE = 0x8000, +}); + +newtype!( + /// Values for `ImageSymbol::typ` (basic component). + struct SymbolBaseType(u16); +); + +impl From for SymbolType { + fn from(base: SymbolBaseType) -> Self { + SymbolType(base.0 & N_BTMASK) + } +} + +impl From for SymbolBaseType { + fn from(value: SymbolType) -> Self { + value.base_type() + } +} /// no type. -pub const IMAGE_SYM_TYPE_NULL: u16 = 0x0000; -pub const IMAGE_SYM_TYPE_VOID: u16 = 0x0001; -/// type character. -pub const IMAGE_SYM_TYPE_CHAR: u16 = 0x0002; -/// type short integer. -pub const IMAGE_SYM_TYPE_SHORT: u16 = 0x0003; -pub const IMAGE_SYM_TYPE_INT: u16 = 0x0004; -pub const IMAGE_SYM_TYPE_LONG: u16 = 0x0005; -pub const IMAGE_SYM_TYPE_FLOAT: u16 = 0x0006; -pub const IMAGE_SYM_TYPE_DOUBLE: u16 = 0x0007; -pub const IMAGE_SYM_TYPE_STRUCT: u16 = 0x0008; -pub const IMAGE_SYM_TYPE_UNION: u16 = 0x0009; -/// enumeration. -pub const IMAGE_SYM_TYPE_ENUM: u16 = 0x000A; -/// member of enumeration. -pub const IMAGE_SYM_TYPE_MOE: u16 = 0x000B; -pub const IMAGE_SYM_TYPE_BYTE: u16 = 0x000C; -pub const IMAGE_SYM_TYPE_WORD: u16 = 0x000D; -pub const IMAGE_SYM_TYPE_UINT: u16 = 0x000E; -pub const IMAGE_SYM_TYPE_DWORD: u16 = 0x000F; -pub const IMAGE_SYM_TYPE_PCODE: u16 = 0x8000; +pub const IMAGE_SYM_TYPE_NULL: SymbolBaseType = SymbolBaseType(0); -// Values for `ImageSymbol::typ` (derived component). +newtype_constant_names!(NAMES_IMAGE_SYM_TYPE: SymbolBaseType(u16) = { + IMAGE_SYM_TYPE_VOID = 0x0001, + /// type character. + IMAGE_SYM_TYPE_CHAR = 0x0002, + /// type short integer. + IMAGE_SYM_TYPE_SHORT = 0x0003, + IMAGE_SYM_TYPE_INT = 0x0004, + IMAGE_SYM_TYPE_LONG = 0x0005, + IMAGE_SYM_TYPE_FLOAT = 0x0006, + IMAGE_SYM_TYPE_DOUBLE = 0x0007, + IMAGE_SYM_TYPE_STRUCT = 0x0008, + IMAGE_SYM_TYPE_UNION = 0x0009, + /// enumeration. + IMAGE_SYM_TYPE_ENUM = 0x000A, + /// member of enumeration. + IMAGE_SYM_TYPE_MOE = 0x000B, + IMAGE_SYM_TYPE_BYTE = 0x000C, + IMAGE_SYM_TYPE_WORD = 0x000D, + IMAGE_SYM_TYPE_UINT = 0x000E, + IMAGE_SYM_TYPE_DWORD = 0x000F, +}); + +newtype!( + /// Values for `ImageSymbol::typ` (derived component). + struct SymbolDerivedType(u16); +); + +impl From for SymbolType { + fn from(derived: SymbolDerivedType) -> Self { + SymbolType((derived.0 << N_BTSHFT) & N_TMASK) + } +} + +impl From for SymbolDerivedType { + fn from(value: SymbolType) -> Self { + value.derived_type() + } +} /// no derived type. -pub const IMAGE_SYM_DTYPE_NULL: u16 = 0; -/// pointer. -pub const IMAGE_SYM_DTYPE_POINTER: u16 = 1; -/// function. -pub const IMAGE_SYM_DTYPE_FUNCTION: u16 = 2; -/// array. -pub const IMAGE_SYM_DTYPE_ARRAY: u16 = 3; +pub const IMAGE_SYM_DTYPE_NULL: SymbolDerivedType = SymbolDerivedType(0); -// Values for `ImageSymbol::storage_class`. -pub const IMAGE_SYM_CLASS_END_OF_FUNCTION: u8 = 0xff; -pub const IMAGE_SYM_CLASS_NULL: u8 = 0x00; -pub const IMAGE_SYM_CLASS_AUTOMATIC: u8 = 0x01; -pub const IMAGE_SYM_CLASS_EXTERNAL: u8 = 0x02; -pub const IMAGE_SYM_CLASS_STATIC: u8 = 0x03; -pub const IMAGE_SYM_CLASS_REGISTER: u8 = 0x04; -pub const IMAGE_SYM_CLASS_EXTERNAL_DEF: u8 = 0x05; -pub const IMAGE_SYM_CLASS_LABEL: u8 = 0x06; -pub const IMAGE_SYM_CLASS_UNDEFINED_LABEL: u8 = 0x07; -pub const IMAGE_SYM_CLASS_MEMBER_OF_STRUCT: u8 = 0x08; -pub const IMAGE_SYM_CLASS_ARGUMENT: u8 = 0x09; -pub const IMAGE_SYM_CLASS_STRUCT_TAG: u8 = 0x0A; -pub const IMAGE_SYM_CLASS_MEMBER_OF_UNION: u8 = 0x0B; -pub const IMAGE_SYM_CLASS_UNION_TAG: u8 = 0x0C; -pub const IMAGE_SYM_CLASS_TYPE_DEFINITION: u8 = 0x0D; -pub const IMAGE_SYM_CLASS_UNDEFINED_STATIC: u8 = 0x0E; -pub const IMAGE_SYM_CLASS_ENUM_TAG: u8 = 0x0F; -pub const IMAGE_SYM_CLASS_MEMBER_OF_ENUM: u8 = 0x10; -pub const IMAGE_SYM_CLASS_REGISTER_PARAM: u8 = 0x11; -pub const IMAGE_SYM_CLASS_BIT_FIELD: u8 = 0x12; +newtype_constant_names!(NAMES_IMAGE_SYM_DTYPE: SymbolDerivedType(u16) = { + /// pointer. + IMAGE_SYM_DTYPE_POINTER = 1, + /// function. + IMAGE_SYM_DTYPE_FUNCTION = 2, + /// array. + IMAGE_SYM_DTYPE_ARRAY = 3, +}); -pub const IMAGE_SYM_CLASS_FAR_EXTERNAL: u8 = 0x44; +newtype!( + /// Values for `ImageSymbol::storage_class`. + #[repr(transparent)] + struct SymbolClass(u8); +); -pub const IMAGE_SYM_CLASS_BLOCK: u8 = 0x64; -pub const IMAGE_SYM_CLASS_FUNCTION: u8 = 0x65; -pub const IMAGE_SYM_CLASS_END_OF_STRUCT: u8 = 0x66; -pub const IMAGE_SYM_CLASS_FILE: u8 = 0x67; -// new -pub const IMAGE_SYM_CLASS_SECTION: u8 = 0x68; -pub const IMAGE_SYM_CLASS_WEAK_EXTERNAL: u8 = 0x69; - -pub const IMAGE_SYM_CLASS_CLR_TOKEN: u8 = 0x6B; +newtype_constant_names!(NAMES_IMAGE_SYM_CLASS: SymbolClass(u8) = { + IMAGE_SYM_CLASS_END_OF_FUNCTION = 0xff, + IMAGE_SYM_CLASS_NULL = 0x00, + IMAGE_SYM_CLASS_AUTOMATIC = 0x01, + IMAGE_SYM_CLASS_EXTERNAL = 0x02, + IMAGE_SYM_CLASS_STATIC = 0x03, + IMAGE_SYM_CLASS_REGISTER = 0x04, + IMAGE_SYM_CLASS_EXTERNAL_DEF = 0x05, + IMAGE_SYM_CLASS_LABEL = 0x06, + IMAGE_SYM_CLASS_UNDEFINED_LABEL = 0x07, + IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = 0x08, + IMAGE_SYM_CLASS_ARGUMENT = 0x09, + IMAGE_SYM_CLASS_STRUCT_TAG = 0x0A, + IMAGE_SYM_CLASS_MEMBER_OF_UNION = 0x0B, + IMAGE_SYM_CLASS_UNION_TAG = 0x0C, + IMAGE_SYM_CLASS_TYPE_DEFINITION = 0x0D, + IMAGE_SYM_CLASS_UNDEFINED_STATIC = 0x0E, + IMAGE_SYM_CLASS_ENUM_TAG = 0x0F, + IMAGE_SYM_CLASS_MEMBER_OF_ENUM = 0x10, + IMAGE_SYM_CLASS_REGISTER_PARAM = 0x11, + IMAGE_SYM_CLASS_BIT_FIELD = 0x12, + IMAGE_SYM_CLASS_FAR_EXTERNAL = 0x44, + IMAGE_SYM_CLASS_BLOCK = 0x64, + IMAGE_SYM_CLASS_FUNCTION = 0x65, + IMAGE_SYM_CLASS_END_OF_STRUCT = 0x66, + IMAGE_SYM_CLASS_FILE = 0x67, + IMAGE_SYM_CLASS_SECTION = 0x68, + IMAGE_SYM_CLASS_WEAK_EXTERNAL = 0x69, + IMAGE_SYM_CLASS_CLR_TOKEN = 0x6B, +}); // type packing constants @@ -1057,7 +1195,7 @@ pub struct ImageAuxSymbolFunctionBeginEnd { pub struct ImageAuxSymbolWeak { /// the weak extern default symbol index pub weak_default_sym_index: U32, - pub weak_search_type: U32, + pub weak_search_type: U32, } /// Auxiliary symbol format 5: sections. @@ -1078,7 +1216,7 @@ pub struct ImageAuxSymbolSection { /// section number to associate with pub number: U16, /// communal selection type - pub selection: u8, + pub selection: ComdatSelection, pub reserved: u8, /// high bits of the section number pub high_number: U16, @@ -1096,18 +1234,33 @@ pub struct ImageAuxSymbolCrc { // Communal selection types. // -pub const IMAGE_COMDAT_SELECT_NODUPLICATES: u8 = 1; -pub const IMAGE_COMDAT_SELECT_ANY: u8 = 2; -pub const IMAGE_COMDAT_SELECT_SAME_SIZE: u8 = 3; -pub const IMAGE_COMDAT_SELECT_EXACT_MATCH: u8 = 4; -pub const IMAGE_COMDAT_SELECT_ASSOCIATIVE: u8 = 5; -pub const IMAGE_COMDAT_SELECT_LARGEST: u8 = 6; -pub const IMAGE_COMDAT_SELECT_NEWEST: u8 = 7; +newtype!( + /// Values for `ImageAuxSymbolSection::selection`. + #[repr(transparent)] + struct ComdatSelection(u8); +); -pub const IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY: u32 = 1; -pub const IMAGE_WEAK_EXTERN_SEARCH_LIBRARY: u32 = 2; -pub const IMAGE_WEAK_EXTERN_SEARCH_ALIAS: u32 = 3; -pub const IMAGE_WEAK_EXTERN_ANTI_DEPENDENCY: u32 = 4; +newtype_constant_names!(NAMES_IMAGE_COMDAT_SELECT: ComdatSelection(u8) = { + IMAGE_COMDAT_SELECT_NODUPLICATES = 1, + IMAGE_COMDAT_SELECT_ANY = 2, + IMAGE_COMDAT_SELECT_SAME_SIZE = 3, + IMAGE_COMDAT_SELECT_EXACT_MATCH = 4, + IMAGE_COMDAT_SELECT_ASSOCIATIVE = 5, + IMAGE_COMDAT_SELECT_LARGEST = 6, + IMAGE_COMDAT_SELECT_NEWEST = 7, +}); + +newtype!( + /// Values for `ImageAuxSymbolWeak::weak_search_type`. + struct WeakExternSearch(u32); +); + +newtype_constant_names!(NAMES_IMAGE_WEAK_EXTERN: WeakExternSearch(u32) = { + IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY = 1, + IMAGE_WEAK_EXTERN_SEARCH_LIBRARY = 2, + IMAGE_WEAK_EXTERN_SEARCH_ALIAS = 3, + IMAGE_WEAK_EXTERN_ANTI_DEPENDENCY = 4, +}); // // Relocation format. @@ -2295,48 +2448,56 @@ pub struct ImageResourceDataEntry { // Resource type: https://docs.microsoft.com/en-us/windows/win32/menurc/resource-types -/// ID for: Hardware-dependent cursor resource. -pub const RT_CURSOR: u16 = 1; -/// ID for: Bitmap resource. -pub const RT_BITMAP: u16 = 2; -/// ID for: Hardware-dependent icon resource. -pub const RT_ICON: u16 = 3; -/// ID for: Menu resource. -pub const RT_MENU: u16 = 4; -/// ID for: Dialog box. -pub const RT_DIALOG: u16 = 5; -/// ID for: String-table entry. -pub const RT_STRING: u16 = 6; -/// ID for: Font directory resource. -pub const RT_FONTDIR: u16 = 7; -/// ID for: Font resource. -pub const RT_FONT: u16 = 8; -/// ID for: Accelerator table. -pub const RT_ACCELERATOR: u16 = 9; -/// ID for: Application-defined resource (raw data). -pub const RT_RCDATA: u16 = 10; -/// ID for: Message-table entry. -pub const RT_MESSAGETABLE: u16 = 11; -/// ID for: Hardware-independent cursor resource. -pub const RT_GROUP_CURSOR: u16 = 12; -/// ID for: Hardware-independent icon resource. -pub const RT_GROUP_ICON: u16 = 14; -/// ID for: Version resource. -pub const RT_VERSION: u16 = 16; -/// ID for: Allows a resource editing tool to associate a string with an .rc file. -pub const RT_DLGINCLUDE: u16 = 17; -/// ID for: Plug and Play resource. -pub const RT_PLUGPLAY: u16 = 19; -/// ID for: VXD. -pub const RT_VXD: u16 = 20; -/// ID for: Animated cursor. -pub const RT_ANICURSOR: u16 = 21; -/// ID for: Animated icon. -pub const RT_ANIICON: u16 = 22; -/// ID for: HTML resource. -pub const RT_HTML: u16 = 23; -/// ID for: Side-by-Side Assembly Manifest. -pub const RT_MANIFEST: u16 = 24; +/// Values for resource types. +/// +/// These are used in `ImageResourceDirectoryEntry::name_or_id` at level 0 of the tree. +#[cfg(feature = "names")] +pub const NAMES_RT: &ConstantNames = &_NAMES_RT; + +constant_names!(_NAMES_RT: u16 = { + /// ID for: Hardware-dependent cursor resource. + RT_CURSOR = 1, + /// ID for: Bitmap resource. + RT_BITMAP = 2, + /// ID for: Hardware-dependent icon resource. + RT_ICON = 3, + /// ID for: Menu resource. + RT_MENU = 4, + /// ID for: Dialog box. + RT_DIALOG = 5, + /// ID for: String-table entry. + RT_STRING = 6, + /// ID for: Font directory resource. + RT_FONTDIR = 7, + /// ID for: Font resource. + RT_FONT = 8, + /// ID for: Accelerator table. + RT_ACCELERATOR = 9, + /// ID for: Application-defined resource (raw data). + RT_RCDATA = 10, + /// ID for: Message-table entry. + RT_MESSAGETABLE = 11, + /// ID for: Hardware-independent cursor resource. + RT_GROUP_CURSOR = 12, + /// ID for: Hardware-independent icon resource. + RT_GROUP_ICON = 14, + /// ID for: Version resource. + RT_VERSION = 16, + /// ID for: Allows a resource editing tool to associate a string with an .rc file. + RT_DLGINCLUDE = 17, + /// ID for: Plug and Play resource. + RT_PLUGPLAY = 19, + /// ID for: VXD. + RT_VXD = 20, + /// ID for: Animated cursor. + RT_ANICURSOR = 21, + /// ID for: Animated icon. + RT_ANIICON = 22, + /// ID for: HTML resource. + RT_HTML = 23, + /// ID for: Side-by-Side Assembly Manifest. + RT_MANIFEST = 24, +}); // // Code Integrity in loadconfig (CI) @@ -2373,7 +2534,7 @@ pub struct ImageDynamicRelocationTable { #[derive(Debug, Clone, Copy)] #[repr(C)] pub struct ImageDynamicRelocation32 { - pub symbol: U32, + pub symbol: U32, pub base_reloc_size: U32, // BaseRelocations: [ImageBaseRelocation; 0], } @@ -2381,7 +2542,7 @@ pub struct ImageDynamicRelocation32 { #[derive(Debug, Clone, Copy)] #[repr(C)] pub struct ImageDynamicRelocation64 { - pub symbol: U64, + pub symbol: U64, pub base_reloc_size: U32, // BaseRelocations: [ImageBaseRelocation; 0], } @@ -2391,7 +2552,7 @@ pub struct ImageDynamicRelocation64 { pub struct ImageDynamicRelocation32V2 { pub header_size: U32, pub fixup_info_size: U32, - pub symbol: U32, + pub symbol: U32, pub symbol_group: U32, pub flags: U32, // ... variable length header fields @@ -2403,7 +2564,7 @@ pub struct ImageDynamicRelocation32V2 { pub struct ImageDynamicRelocation64V2 { pub header_size: U32, pub fixup_info_size: U32, - pub symbol: U64, + pub symbol: U64, pub symbol_group: U32, pub flags: U32, // ... variable length header fields @@ -2413,12 +2574,20 @@ pub struct ImageDynamicRelocation64V2 { // // Defined symbolic dynamic relocation entries. // +newtype!( + /// Values for `ImageDynamicRelocation*::symbol`. + /// + /// Small values have special meaning. Other values are RVAs. + struct DynamicRelocationSymbol(u64); +); -pub const IMAGE_DYNAMIC_RELOCATION_GUARD_RF_PROLOGUE: u32 = 0x0000_0001; -pub const IMAGE_DYNAMIC_RELOCATION_GUARD_RF_EPILOGUE: u32 = 0x0000_0002; -pub const IMAGE_DYNAMIC_RELOCATION_GUARD_IMPORT_CONTROL_TRANSFER: u32 = 0x0000_0003; -pub const IMAGE_DYNAMIC_RELOCATION_GUARD_INDIR_CONTROL_TRANSFER: u32 = 0x0000_0004; -pub const IMAGE_DYNAMIC_RELOCATION_GUARD_SWITCHTABLE_BRANCH: u32 = 0x0000_0005; +newtype_constant_names!(NAMES_DYNAMIC_RELOCATION: DynamicRelocationSymbol(u64) = { + IMAGE_DYNAMIC_RELOCATION_GUARD_RF_PROLOGUE = 0x0000_0001, + IMAGE_DYNAMIC_RELOCATION_GUARD_RF_EPILOGUE = 0x0000_0002, + IMAGE_DYNAMIC_RELOCATION_GUARD_IMPORT_CONTROL_TRANSFER = 0x0000_0003, + IMAGE_DYNAMIC_RELOCATION_GUARD_INDIR_CONTROL_TRANSFER = 0x0000_0004, + IMAGE_DYNAMIC_RELOCATION_GUARD_SWITCHTABLE_BRANCH = 0x0000_0005, +}); // This struct has alignment 1. #[derive(Debug, Clone, Copy)] @@ -2509,7 +2678,7 @@ pub struct ImageLoadConfigDirectory32 { /// VA pub guard_cf_function_table: U32, pub guard_cf_function_count: U32, - pub guard_flags: U32, + pub guard_flags: U32, pub code_integrity: ImageLoadConfigCodeIntegrity, /// VA pub guard_address_taken_iat_entry_table: U32, @@ -2571,7 +2740,7 @@ pub struct ImageLoadConfigDirectory64 { /// VA pub guard_cf_function_table: U64, pub guard_cf_function_count: U64, - pub guard_flags: U32, + pub guard_flags: U32, pub code_integrity: ImageLoadConfigCodeIntegrity, /// VA pub guard_address_taken_iat_entry_table: U64, @@ -2618,7 +2787,7 @@ pub struct ImageHotPatchInfo { #[repr(C)] pub struct ImageHotPatchBase { pub sequence_number: U32, - pub flags: U32, + pub flags: U32, pub original_time_date_stamp: U32, pub original_check_sum: U32, pub code_integrity_info: U32, @@ -2635,54 +2804,80 @@ pub struct ImageHotPatchHashes { pub sha1: [u8; 20], } -pub const IMAGE_HOT_PATCH_BASE_OBLIGATORY: u32 = 0x0000_0001; -pub const IMAGE_HOT_PATCH_BASE_CAN_ROLL_BACK: u32 = 0x0000_0002; +newtype!( + /// Values for `ImageHotPatchBase::flags`. + struct HotPatchBaseFlags(u32); +); + +newtype_flag_names!(NAMES_HOT_PATCH_BASE: HotPatchBaseFlags(u32) = { + IMAGE_HOT_PATCH_BASE_OBLIGATORY = 0x0000_0001, + IMAGE_HOT_PATCH_BASE_CAN_ROLL_BACK = 0x0000_0002, +}); + +newtype!( + struct HotPatchChunkFlags(u32); +); + +// TODO: convenience methods for subfields + +newtype_flag_names!(NAMES_HOT_PATCH_CHUNK: HotPatchChunkFlags(u32) = { + IMAGE_HOT_PATCH_CHUNK_INVERSE = 0x8000_0000, + IMAGE_HOT_PATCH_CHUNK_OBLIGATORY = 0x4000_0000, + _ = IMAGE_HOT_PATCH_CHUNK_TYPE => NAMES_HOT_PATCH_CHUNK_TYPE, +}); -pub const IMAGE_HOT_PATCH_CHUNK_INVERSE: u32 = 0x8000_0000; -pub const IMAGE_HOT_PATCH_CHUNK_OBLIGATORY: u32 = 0x4000_0000; pub const IMAGE_HOT_PATCH_CHUNK_RESERVED: u32 = 0x3FF0_3000; pub const IMAGE_HOT_PATCH_CHUNK_TYPE: u32 = 0x000F_C000; pub const IMAGE_HOT_PATCH_CHUNK_SOURCE_RVA: u32 = 0x0000_8000; pub const IMAGE_HOT_PATCH_CHUNK_TARGET_RVA: u32 = 0x0000_4000; pub const IMAGE_HOT_PATCH_CHUNK_SIZE: u32 = 0x0000_0FFF; -pub const IMAGE_HOT_PATCH_NONE: u32 = 0x0000_0000; -pub const IMAGE_HOT_PATCH_FUNCTION: u32 = 0x0001_C000; -pub const IMAGE_HOT_PATCH_ABSOLUTE: u32 = 0x0002_C000; -pub const IMAGE_HOT_PATCH_REL32: u32 = 0x0003_C000; -pub const IMAGE_HOT_PATCH_CALL_TARGET: u32 = 0x0004_4000; -pub const IMAGE_HOT_PATCH_INDIRECT: u32 = 0x0005_C000; -pub const IMAGE_HOT_PATCH_NO_CALL_TARGET: u32 = 0x0006_4000; -pub const IMAGE_HOT_PATCH_DYNAMIC_VALUE: u32 = 0x0007_8000; +constant_names!(NAMES_HOT_PATCH_CHUNK_TYPE: HotPatchChunkFlags(u32) = { + IMAGE_HOT_PATCH_NONE = 0x0000_0000, + IMAGE_HOT_PATCH_FUNCTION = 0x0001_C000, + IMAGE_HOT_PATCH_ABSOLUTE = 0x0002_C000, + IMAGE_HOT_PATCH_REL32 = 0x0003_C000, + IMAGE_HOT_PATCH_CALL_TARGET = 0x0004_4000, + IMAGE_HOT_PATCH_INDIRECT = 0x0005_C000, + IMAGE_HOT_PATCH_NO_CALL_TARGET = 0x0006_4000, + IMAGE_HOT_PATCH_DYNAMIC_VALUE = 0x0007_8000, +}); -/// Module performs control flow integrity checks using system-supplied support -pub const IMAGE_GUARD_CF_INSTRUMENTED: u32 = 0x0000_0100; -/// Module performs control flow and write integrity checks -pub const IMAGE_GUARD_CFW_INSTRUMENTED: u32 = 0x0000_0200; -/// Module contains valid control flow target metadata -pub const IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT: u32 = 0x0000_0400; -/// Module does not make use of the /GS security cookie -pub const IMAGE_GUARD_SECURITY_COOKIE_UNUSED: u32 = 0x0000_0800; -/// Module supports read only delay load IAT -pub const IMAGE_GUARD_PROTECT_DELAYLOAD_IAT: u32 = 0x0000_1000; -/// Delayload import table in its own .didat section (with nothing else in it) that can be freely reprotected -pub const IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION: u32 = 0x0000_2000; -/// Module contains suppressed export information. -/// -/// This also infers that the address taken taken IAT table is also present in the load config. -pub const IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT: u32 = 0x0000_4000; -/// Module enables suppression of exports -pub const IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION: u32 = 0x0000_8000; -/// Module contains longjmp target information -pub const IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT: u32 = 0x0001_0000; -/// Module contains return flow instrumentation and metadata -pub const IMAGE_GUARD_RF_INSTRUMENTED: u32 = 0x0002_0000; -/// Module requests that the OS enable return flow protection -pub const IMAGE_GUARD_RF_ENABLE: u32 = 0x0004_0000; -/// Module requests that the OS enable return flow protection in strict mode -pub const IMAGE_GUARD_RF_STRICT: u32 = 0x0008_0000; -/// Module was built with retpoline support -pub const IMAGE_GUARD_RETPOLINE_PRESENT: u32 = 0x0010_0000; +newtype!( + /// Values for `ImageLoadConfigDirectory*::guard_flags`. + struct GuardFlags(u32); +); + +newtype_flag_names!(NAMES_GUARD: GuardFlags(u32) = { + /// Module performs control flow integrity checks using system-supplied support + IMAGE_GUARD_CF_INSTRUMENTED = 0x0000_0100, + /// Module performs control flow and write integrity checks + IMAGE_GUARD_CFW_INSTRUMENTED = 0x0000_0200, + /// Module contains valid control flow target metadata + IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT = 0x0000_0400, + /// Module does not make use of the /GS security cookie + IMAGE_GUARD_SECURITY_COOKIE_UNUSED = 0x0000_0800, + /// Module supports read only delay load IAT + IMAGE_GUARD_PROTECT_DELAYLOAD_IAT = 0x0000_1000, + /// Delayload import table in its own .didat section (with nothing else in it) that can be freely reprotected + IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION = 0x0000_2000, + /// Module contains suppressed export information. + /// + /// This also infers that the address taken taken IAT table is also present in the load config. + IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT = 0x0000_4000, + /// Module enables suppression of exports + IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION = 0x0000_8000, + /// Module contains longjmp target information + IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT = 0x0001_0000, + /// Module contains return flow instrumentation and metadata + IMAGE_GUARD_RF_INSTRUMENTED = 0x0002_0000, + /// Module requests that the OS enable return flow protection + IMAGE_GUARD_RF_ENABLE = 0x0004_0000, + /// Module requests that the OS enable return flow protection in strict mode + IMAGE_GUARD_RF_STRICT = 0x0008_0000, + /// Module was built with retpoline support + IMAGE_GUARD_RETPOLINE_PRESENT = 0x0010_0000, +}); /// Stride of Guard CF function table encoded in these bits (additional count of bytes per element) pub const IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK: u32 = 0xF000_0000; @@ -2693,10 +2888,17 @@ pub const IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT: u32 = 28; // GFIDS table entry flags. // -/// The containing GFID entry is suppressed -pub const IMAGE_GUARD_FLAG_FID_SUPPRESSED: u16 = 0x01; -/// The containing GFID entry is export suppressed -pub const IMAGE_GUARD_FLAG_EXPORT_SUPPRESSED: u16 = 0x02; +newtype!( + /// Values for flags in the Guard CF function table entries. + struct GuardFunctionFlags(u16); +); + +newtype_flag_names!(NAMES_GUARD_FLAG: GuardFunctionFlags(u16) = { + /// The containing GFID entry is suppressed + IMAGE_GUARD_FLAG_FID_SUPPRESSED = 0x01, + /// The containing GFID entry is export suppressed + IMAGE_GUARD_FLAG_EXPORT_SUPPRESSED = 0x02, +}); // // WIN CE Exception table format @@ -2774,7 +2976,7 @@ pub const IMAGE_ENCLAVE_SHORT_ID_LENGTH: usize = 16; pub struct ImageEnclaveConfig32 { pub size: U32, pub minimum_required_config_size: U32, - pub policy_flags: U32, + pub policy_flags: U32, pub number_of_imports: U32, pub import_list: U32, pub import_entry_size: U32, @@ -2784,7 +2986,7 @@ pub struct ImageEnclaveConfig32 { pub security_version: U32, pub enclave_size: U32, pub number_of_threads: U32, - pub enclave_flags: U32, + pub enclave_flags: U32, } #[derive(Debug, Clone, Copy)] @@ -2792,7 +2994,7 @@ pub struct ImageEnclaveConfig32 { pub struct ImageEnclaveConfig64 { pub size: U32, pub minimum_required_config_size: U32, - pub policy_flags: U32, + pub policy_flags: U32, pub number_of_imports: U32, pub import_list: U32, pub import_entry_size: U32, @@ -2802,19 +3004,29 @@ pub struct ImageEnclaveConfig64 { pub security_version: U32, pub enclave_size: U64, pub number_of_threads: U32, - pub enclave_flags: U32, + pub enclave_flags: U32, } //pub const IMAGE_ENCLAVE_MINIMUM_CONFIG_SIZE: usize = FIELD_OFFSET(IMAGE_ENCLAVE_CONFIG, EnclaveFlags); -pub const IMAGE_ENCLAVE_POLICY_DEBUGGABLE: u32 = 0x0000_0001; +newtype!( + struct EnclavePolicyFlags(u32); +); +newtype_flag_names!(NAMES_IMAGE_ENCLAVE_POLICY: EnclavePolicyFlags(u32) = { + IMAGE_ENCLAVE_POLICY_DEBUGGABLE = 0x0000_0001, +}); -pub const IMAGE_ENCLAVE_FLAG_PRIMARY_IMAGE: u32 = 0x0000_0001; +newtype!( + struct EnclaveFlags(u32); +); +newtype_flag_names!(NAMES_IMAGE_ENCLAVE_FLAG: EnclaveFlags(u32) = { + IMAGE_ENCLAVE_FLAG_PRIMARY_IMAGE = 0x0000_0001, +}); #[derive(Debug, Clone, Copy)] #[repr(C)] pub struct ImageEnclaveImport { - pub match_type: U32, + pub match_type: U32, pub minimum_security_version: U32, pub unique_or_author_id: [u8; IMAGE_ENCLAVE_LONG_ID_LENGTH], pub family_id: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH], @@ -2823,11 +3035,17 @@ pub struct ImageEnclaveImport { pub reserved: U32, } -pub const IMAGE_ENCLAVE_IMPORT_MATCH_NONE: u32 = 0x0000_0000; -pub const IMAGE_ENCLAVE_IMPORT_MATCH_UNIQUE_ID: u32 = 0x0000_0001; -pub const IMAGE_ENCLAVE_IMPORT_MATCH_AUTHOR_ID: u32 = 0x0000_0002; -pub const IMAGE_ENCLAVE_IMPORT_MATCH_FAMILY_ID: u32 = 0x0000_0003; -pub const IMAGE_ENCLAVE_IMPORT_MATCH_IMAGE_ID: u32 = 0x0000_0004; +newtype!( + /// Values for `ImageEnclaveImport::match_type`. + struct EnclaveImportMatchType(u32); +); +newtype_constant_names!(NAMES_ENCLAVE_IMPORT_MATCH: EnclaveImportMatchType(u32) = { + IMAGE_ENCLAVE_IMPORT_MATCH_NONE = 0x0000_0000, + IMAGE_ENCLAVE_IMPORT_MATCH_UNIQUE_ID = 0x0000_0001, + IMAGE_ENCLAVE_IMPORT_MATCH_AUTHOR_ID = 0x0000_0002, + IMAGE_ENCLAVE_IMPORT_MATCH_FAMILY_ID = 0x0000_0003, + IMAGE_ENCLAVE_IMPORT_MATCH_IMAGE_ID = 0x0000_0004, +}); // // Debug Format @@ -2840,29 +3058,36 @@ pub struct ImageDebugDirectory { pub time_date_stamp: U32, pub major_version: U16, pub minor_version: U16, - pub typ: U32, + pub typ: U32, pub size_of_data: U32, pub address_of_raw_data: U32, pub pointer_to_raw_data: U32, } -pub const IMAGE_DEBUG_TYPE_UNKNOWN: u32 = 0; -pub const IMAGE_DEBUG_TYPE_COFF: u32 = 1; -pub const IMAGE_DEBUG_TYPE_CODEVIEW: u32 = 2; -pub const IMAGE_DEBUG_TYPE_FPO: u32 = 3; -pub const IMAGE_DEBUG_TYPE_MISC: u32 = 4; -pub const IMAGE_DEBUG_TYPE_EXCEPTION: u32 = 5; -pub const IMAGE_DEBUG_TYPE_FIXUP: u32 = 6; -pub const IMAGE_DEBUG_TYPE_OMAP_TO_SRC: u32 = 7; -pub const IMAGE_DEBUG_TYPE_OMAP_FROM_SRC: u32 = 8; -pub const IMAGE_DEBUG_TYPE_BORLAND: u32 = 9; -pub const IMAGE_DEBUG_TYPE_RESERVED10: u32 = 10; -pub const IMAGE_DEBUG_TYPE_CLSID: u32 = 11; -pub const IMAGE_DEBUG_TYPE_VC_FEATURE: u32 = 12; -pub const IMAGE_DEBUG_TYPE_POGO: u32 = 13; -pub const IMAGE_DEBUG_TYPE_ILTCG: u32 = 14; -pub const IMAGE_DEBUG_TYPE_MPX: u32 = 15; -pub const IMAGE_DEBUG_TYPE_REPRO: u32 = 16; +newtype!( + /// Values for `ImageDebugDirectory::typ`. + struct DebugType(u32); +); + +newtype_constant_names!(NAMES_DEBUG_TYPE: DebugType(u32) = { + IMAGE_DEBUG_TYPE_UNKNOWN = 0, + IMAGE_DEBUG_TYPE_COFF = 1, + IMAGE_DEBUG_TYPE_CODEVIEW = 2, + IMAGE_DEBUG_TYPE_FPO = 3, + IMAGE_DEBUG_TYPE_MISC = 4, + IMAGE_DEBUG_TYPE_EXCEPTION = 5, + IMAGE_DEBUG_TYPE_FIXUP = 6, + IMAGE_DEBUG_TYPE_OMAP_TO_SRC = 7, + IMAGE_DEBUG_TYPE_OMAP_FROM_SRC = 8, + IMAGE_DEBUG_TYPE_BORLAND = 9, + IMAGE_DEBUG_TYPE_RESERVED10 = 10, + IMAGE_DEBUG_TYPE_CLSID = 11, + IMAGE_DEBUG_TYPE_VC_FEATURE = 12, + IMAGE_DEBUG_TYPE_POGO = 13, + IMAGE_DEBUG_TYPE_ILTCG = 14, + IMAGE_DEBUG_TYPE_MPX = 15, + IMAGE_DEBUG_TYPE_REPRO = 16, +}); #[derive(Debug, Clone, Copy)] #[repr(C)] @@ -2877,10 +3102,16 @@ pub struct ImageCoffSymbolsHeader { pub rva_to_last_byte_of_data: U32, } -pub const FRAME_FPO: u16 = 0; -pub const FRAME_TRAP: u16 = 1; -pub const FRAME_TSS: u16 = 2; -pub const FRAME_NONFPO: u16 = 3; +newtype!( + /// Values for `FpoData::cbFrame`. + struct FrameType(u8); +); +newtype_constant_names!(NAMES_FRAME: FrameType(u8) = { + FRAME_FPO = 0, + FRAME_TRAP = 1, + FRAME_TSS = 2, + FRAME_NONFPO = 3, +}); /* // TODO? bitfields @@ -2974,7 +3205,7 @@ pub struct ImageFunctionEntry64 { pub struct ImageSeparateDebugHeader { pub signature: U16, pub flags: U16, - pub machine: U16, + pub machine: U16, pub characteristics: U16, pub time_date_stamp: U32, pub check_sum: U32, @@ -2993,7 +3224,7 @@ pub struct NonPagedDebugInfo { pub signature: U16, pub flags: U16, pub size: U32, - pub machine: U16, + pub machine: U16, pub characteristics: U16, pub time_date_stamp: U32, pub check_sum: U32, @@ -3057,11 +3288,11 @@ pub const IMPORT_OBJECT_HDR_SIG2: u16 = 0xffff; #[repr(C)] pub struct ImportObjectHeader { /// Must be IMAGE_FILE_MACHINE_UNKNOWN - pub sig1: U16, + pub sig1: U16, /// Must be IMPORT_OBJECT_HDR_SIG2. pub sig2: U16, pub version: U16, - pub machine: U16, + pub machine: U16, /// Time/date stamp pub time_date_stamp: U32, /// particularly useful for incremental links @@ -3073,36 +3304,110 @@ pub struct ImportObjectHeader { // WORD Type : 2; // WORD NameType : 3; // WORD Reserved : 11; - pub name_type: U16, + pub name_type: U16, +} + +newtype!( + /// Values for `ImportObjectHeader::name_type`. + struct ImportObjectFlags(u16); +); + +newtype_flag_names!(NAMES_IMPORT_OBJECT: ImportObjectFlags(u16) = { + _ = IMPORT_OBJECT_TYPE_MASK << IMPORT_OBJECT_TYPE_SHIFT => NAMES_IMPORT_OBJECT_TYPE, + _ = IMPORT_OBJECT_NAME_MASK << IMPORT_OBJECT_NAME_SHIFT => NAMES_IMPORT_OBJECT_NAME, +}); + +impl ImportObjectFlags { + /// Construct the flags from its subfields. + pub fn new(import_type: ImportObjectType, name_type: ImportObjectNameType) -> Self { + ImportObjectFlags( + ImportObjectFlags::from(import_type).0 | ImportObjectFlags::from(name_type).0, + ) + } + + /// Return the import type field. + pub fn import_type(self) -> ImportObjectType { + ImportObjectType(self.0 & IMPORT_OBJECT_TYPE_MASK) + } + + /// Return the name type field. + pub fn name_type(self) -> ImportObjectNameType { + ImportObjectNameType((self.0 >> IMPORT_OBJECT_NAME_SHIFT) & IMPORT_OBJECT_NAME_MASK) + } +} + +newtype!( + /// Values for the import type subfield of `ImportObjectHeader::name_type`. + struct ImportObjectType(u16); +); + +impl From for ImportObjectFlags { + fn from(import_type: ImportObjectType) -> Self { + ImportObjectFlags(import_type.0 & IMPORT_OBJECT_TYPE_MASK) + } +} + +impl From for ImportObjectType { + fn from(value: ImportObjectFlags) -> Self { + value.import_type() + } } pub const IMPORT_OBJECT_TYPE_MASK: u16 = 0b11; pub const IMPORT_OBJECT_TYPE_SHIFT: u16 = 0; -pub const IMPORT_OBJECT_CODE: u16 = 0; -pub const IMPORT_OBJECT_DATA: u16 = 1; -pub const IMPORT_OBJECT_CONST: u16 = 2; + +newtype_constant_names!(NAMES_IMPORT_OBJECT_TYPE: ImportObjectType(u16) = { + IMPORT_OBJECT_CODE = 0, + IMPORT_OBJECT_DATA = 1, + IMPORT_OBJECT_CONST = 2, +}); + +newtype!( + /// Values for the name type subfield of `ImportObjectHeader::name_type`. + struct ImportObjectNameType(u16); +); + +impl From for ImportObjectFlags { + fn from(name_type: ImportObjectNameType) -> Self { + ImportObjectFlags((name_type.0 & IMPORT_OBJECT_NAME_MASK) << IMPORT_OBJECT_NAME_SHIFT) + } +} + +impl From for ImportObjectNameType { + fn from(value: ImportObjectFlags) -> Self { + value.name_type() + } +} pub const IMPORT_OBJECT_NAME_MASK: u16 = 0b111; pub const IMPORT_OBJECT_NAME_SHIFT: u16 = 2; -/// Import by ordinal -pub const IMPORT_OBJECT_ORDINAL: u16 = 0; -/// Import name == public symbol name. -pub const IMPORT_OBJECT_NAME: u16 = 1; -/// Import name == public symbol name skipping leading ?, @, or optionally _. -pub const IMPORT_OBJECT_NAME_NO_PREFIX: u16 = 2; -/// Import name == public symbol name skipping leading ?, @, or optionally _ and truncating at first @. -pub const IMPORT_OBJECT_NAME_UNDECORATE: u16 = 3; -/// Import name == a name is explicitly provided after the DLL name. -pub const IMPORT_OBJECT_NAME_EXPORTAS: u16 = 4; -// COM+ Header entry point flags. -pub const COMIMAGE_FLAGS_ILONLY: u32 = 0x0000_0001; -pub const COMIMAGE_FLAGS_32BITREQUIRED: u32 = 0x0000_0002; -pub const COMIMAGE_FLAGS_IL_LIBRARY: u32 = 0x0000_0004; -pub const COMIMAGE_FLAGS_STRONGNAMESIGNED: u32 = 0x0000_0008; -pub const COMIMAGE_FLAGS_NATIVE_ENTRYPOINT: u32 = 0x0000_0010; -pub const COMIMAGE_FLAGS_TRACKDEBUGDATA: u32 = 0x0001_0000; -pub const COMIMAGE_FLAGS_32BITPREFERRED: u32 = 0x0002_0000; +newtype_constant_names!(NAMES_IMPORT_OBJECT_NAME: ImportObjectNameType(u16) = { + /// Import by ordinal + IMPORT_OBJECT_ORDINAL = 0, + /// Import name == public symbol name. + IMPORT_OBJECT_NAME = 1, + /// Import name == public symbol name skipping leading ?, @, or optionally _. + IMPORT_OBJECT_NAME_NO_PREFIX = 2, + /// Import name == public symbol name skipping leading ?, @, or optionally _ and truncating at first @. + IMPORT_OBJECT_NAME_UNDECORATE = 3, + /// Import name == a name is explicitly provided after the DLL name. + IMPORT_OBJECT_NAME_EXPORTAS = 4, +}); + +newtype!( + /// Values for `ImageCor20Header::flags`. + struct CorFlags(u32); +); +newtype_flag_names!(NAMES_COMIMAGE_FLAGS: CorFlags(u32) = { + COMIMAGE_FLAGS_ILONLY = 0x0000_0001, + COMIMAGE_FLAGS_32BITREQUIRED = 0x0000_0002, + COMIMAGE_FLAGS_IL_LIBRARY = 0x0000_0004, + COMIMAGE_FLAGS_STRONGNAMESIGNED = 0x0000_0008, + COMIMAGE_FLAGS_NATIVE_ENTRYPOINT = 0x0000_0010, + COMIMAGE_FLAGS_TRACKDEBUGDATA = 0x0001_0000, + COMIMAGE_FLAGS_32BITPREFERRED = 0x0002_0000, +}); // Version flags for image. pub const COR_VERSION_MAJOR_V2: u16 = 2; @@ -3121,16 +3426,21 @@ pub const IMAGE_COR_MIH_EHRVA: u16 = 0x02; pub const IMAGE_COR_MIH_BASICBLOCK: u16 = 0x08; // V-table constants -/// V-table slots are 32-bits in size. -pub const COR_VTABLE_32BIT: u16 = 0x01; -/// V-table slots are 64-bits in size. -pub const COR_VTABLE_64BIT: u16 = 0x02; -/// If set, transition from unmanaged. -pub const COR_VTABLE_FROM_UNMANAGED: u16 = 0x04; -/// If set, transition from unmanaged with keeping the current appdomain. -pub const COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN: u16 = 0x08; -/// Call most derived method described by -pub const COR_VTABLE_CALL_MOST_DERIVED: u16 = 0x10; +newtype!( + struct CorVtableFlags(u16); +); +newtype_flag_names!(NAMES_COR_VTABLE: CorVtableFlags(u16) = { + /// V-table slots are 32-bits in size. + COR_VTABLE_32BIT = 0x01, + /// V-table slots are 64-bits in size. + COR_VTABLE_64BIT = 0x02, + /// If set, transition from unmanaged. + COR_VTABLE_FROM_UNMANAGED = 0x04, + /// If set, transition from unmanaged with keeping the current appdomain. + COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN = 0x08, + /// Call most derived method described by + COR_VTABLE_CALL_MOST_DERIVED = 0x10, +}); // EATJ constants /// Size of a jump thunk reserved range. @@ -3151,7 +3461,7 @@ pub struct ImageCor20Header { // Symbol table and startup information pub meta_data: ImageDataDirectory, - pub flags: U32, + pub flags: U32, // If COMIMAGE_FLAGS_NATIVE_ENTRYPOINT is not set, EntryPointToken represents a managed entrypoint. // If COMIMAGE_FLAGS_NATIVE_ENTRYPOINT is set, EntryPointRVA represents an RVA to a native entrypoint. diff --git a/src/read/coff/comdat.rs b/src/read/coff/comdat.rs index 464d238..d54f030 100644 --- a/src/read/coff/comdat.rs +++ b/src/read/coff/comdat.rs @@ -69,7 +69,8 @@ pub struct CoffComdat< file: &'file CoffFile<'data, R, Coff>, symbol_index: SymbolIndex, symbol: &'data Coff::ImageSymbol, - selection: u8, + section_index: u32, + selection: pe::ComdatSelection, } impl<'data, 'file, R: ReadRef<'data>, Coff: CoffHeader> CoffComdat<'data, 'file, R, Coff> { @@ -82,18 +83,20 @@ impl<'data, 'file, R: ReadRef<'data>, Coff: CoffHeader> CoffComdat<'data, 'file, if !section_symbol.has_aux_section() { return None; } + // Must have a valid section index. + let section_number = section_symbol.section_number(); + let section_index = section_number.index()?; // Auxiliary record must have a non-associative selection. let aux = file.common.symbols.aux_section(index).ok()?; let selection = aux.selection; - if selection == 0 || selection == pe::IMAGE_COMDAT_SELECT_ASSOCIATIVE { + if selection == pe::ComdatSelection(0) || selection == pe::IMAGE_COMDAT_SELECT_ASSOCIATIVE { return None; } // Find the COMDAT symbol. let mut symbol_index = index; let mut symbol = section_symbol; - let section_number = section_symbol.section_number(); loop { symbol_index.0 += 1 + symbol.number_of_aux_symbols() as usize; symbol = file.common.symbols.symbol(symbol_index).ok()?; @@ -106,6 +109,7 @@ impl<'data, 'file, R: ReadRef<'data>, Coff: CoffHeader> CoffComdat<'data, 'file, file, symbol_index, symbol, + section_index, selection, }) } @@ -157,7 +161,7 @@ impl<'data, 'file, R: ReadRef<'data>, Coff: CoffHeader> ObjectComdat<'data> fn sections(&self) -> Self::SectionIterator { CoffComdatSectionIterator { file: self.file, - section_number: self.symbol.section_number(), + section_index: self.section_index, index: SymbolIndex(0), } } @@ -176,7 +180,7 @@ pub struct CoffComdatSectionIterator< Coff: CoffHeader = pe::ImageFileHeader, > { file: &'file CoffFile<'data, R, Coff>, - section_number: i32, + section_index: u32, index: SymbolIndex, } @@ -198,7 +202,9 @@ impl<'data, 'file, R: ReadRef<'data>, Coff: CoffHeader> Iterator continue; } - let section_number = symbol.section_number(); + let Some(section_index) = symbol.section_number().index() else { + continue; + }; let aux = self.file.common.symbols.aux_section(index).ok()?; if aux.selection == pe::IMAGE_COMDAT_SELECT_ASSOCIATIVE { @@ -207,12 +213,12 @@ impl<'data, 'file, R: ReadRef<'data>, Coff: CoffHeader> Iterator } else { u32::from(aux.number.get(LE)) }; - if number as i32 == self.section_number { - return Some(SectionIndex(section_number as usize)); + if number == self.section_index { + return Some(SectionIndex(section_index as usize)); } - } else if aux.selection != 0 { - if section_number == self.section_number { - return Some(SectionIndex(section_number as usize)); + } else if aux.selection != pe::ComdatSelection(0) { + if section_index == self.section_index { + return Some(SectionIndex(section_index as usize)); } } } diff --git a/src/read/coff/file.rs b/src/read/coff/file.rs index d43ddc4..a53a43a 100644 --- a/src/read/coff/file.rs +++ b/src/read/coff/file.rs @@ -299,11 +299,11 @@ pub trait CoffHeader: Debug + Pod { /// This is a property of the type, not a value in the header data. fn is_type_bigobj() -> bool; - fn machine(&self) -> u16; + fn machine(&self) -> pe::Machine; fn number_of_sections(&self) -> u32; fn pointer_to_symbol_table(&self) -> u32; fn number_of_symbols(&self) -> u32; - fn characteristics(&self) -> u16; + fn characteristics(&self) -> pe::FileFlags; /// Read the file header. /// @@ -345,7 +345,7 @@ impl CoffHeader for pe::ImageFileHeader { false } - fn machine(&self) -> u16 { + fn machine(&self) -> pe::Machine { self.machine.get(LE) } @@ -361,7 +361,7 @@ impl CoffHeader for pe::ImageFileHeader { self.number_of_symbols.get(LE) } - fn characteristics(&self) -> u16 { + fn characteristics(&self) -> pe::FileFlags { self.characteristics.get(LE) } @@ -388,7 +388,7 @@ impl CoffHeader for pe::AnonObjectHeaderBigobj { true } - fn machine(&self) -> u16 { + fn machine(&self) -> pe::Machine { self.machine.get(LE) } @@ -404,8 +404,8 @@ impl CoffHeader for pe::AnonObjectHeaderBigobj { self.number_of_symbols.get(LE) } - fn characteristics(&self) -> u16 { - 0 + fn characteristics(&self) -> pe::FileFlags { + pe::FileFlags(0) } fn parse<'data, R: ReadRef<'data>>(data: R, offset: &mut u64) -> read::Result<&'data Self> { diff --git a/src/read/coff/import.rs b/src/read/coff/import.rs index 91f9fd7..54b71d6 100644 --- a/src/read/coff/import.rs +++ b/src/read/coff/import.rs @@ -138,7 +138,9 @@ impl pe::ImportObjectHeader { let header = data .read::(offset) .read_error("Invalid COFF import library header size")?; - if header.sig1.get(LE) != 0 || header.sig2.get(LE) != pe::IMPORT_OBJECT_HDR_SIG2 { + if header.sig1.get(LE) != pe::IMAGE_FILE_MACHINE_UNKNOWN + || header.sig2.get(LE) != pe::IMPORT_OBJECT_HDR_SIG2 + { Err(Error("Invalid COFF import library header")) } else if header.version.get(LE) != 0 { Err(Error("Unknown COFF import library header version")) @@ -181,17 +183,13 @@ impl pe::ImportObjectHeader { } /// The type of import. - /// - /// This is one of the `IMPORT_OBJECT_*` constants. - pub fn import_type(&self) -> u16 { - self.name_type.get(LE) & pe::IMPORT_OBJECT_TYPE_MASK + pub fn import_type(&self) -> pe::ImportObjectType { + self.name_type.get(LE).import_type() } /// The type of import name. - /// - /// This is one of the `IMPORT_OBJECT_*` constants. - pub fn name_type(&self) -> u16 { - (self.name_type.get(LE) >> pe::IMPORT_OBJECT_NAME_SHIFT) & pe::IMPORT_OBJECT_NAME_MASK + pub fn name_type(&self) -> pe::ImportObjectNameType { + self.name_type.get(LE).name_type() } } diff --git a/src/read/coff/section.rs b/src/read/coff/section.rs index 1bbf3ab..0d4caad 100644 --- a/src/read/coff/section.rs +++ b/src/read/coff/section.rs @@ -250,9 +250,9 @@ impl<'data, 'file, R: ReadRef<'data>, Coff: CoffHeader> ObjectSegment<'data> fn permissions(&self) -> Permissions { let characteristics = self.section.characteristics.get(LE); Permissions::new( - characteristics & pe::IMAGE_SCN_MEM_READ != 0, - characteristics & pe::IMAGE_SCN_MEM_WRITE != 0, - characteristics & pe::IMAGE_SCN_MEM_EXECUTE != 0, + characteristics.contains(pe::IMAGE_SCN_MEM_READ), + characteristics.contains(pe::IMAGE_SCN_MEM_WRITE), + characteristics.contains(pe::IMAGE_SCN_MEM_EXECUTE), ) } } @@ -441,19 +441,19 @@ impl<'data, 'file, R: ReadRef<'data>, Coff: CoffHeader> ObjectSection<'data> impl pe::ImageSectionHeader { pub(crate) fn kind(&self) -> SectionKind { let characteristics = self.characteristics.get(LE); - if characteristics & (pe::IMAGE_SCN_CNT_CODE | pe::IMAGE_SCN_MEM_EXECUTE) != 0 { + if characteristics.intersects(pe::IMAGE_SCN_CNT_CODE | pe::IMAGE_SCN_MEM_EXECUTE) { SectionKind::Text - } else if characteristics & pe::IMAGE_SCN_CNT_INITIALIZED_DATA != 0 { - if characteristics & pe::IMAGE_SCN_MEM_DISCARDABLE != 0 { + } else if characteristics.contains(pe::IMAGE_SCN_CNT_INITIALIZED_DATA) { + if characteristics.contains(pe::IMAGE_SCN_MEM_DISCARDABLE) { SectionKind::Other - } else if characteristics & pe::IMAGE_SCN_MEM_WRITE != 0 { + } else if characteristics.contains(pe::IMAGE_SCN_MEM_WRITE) { SectionKind::Data } else { SectionKind::ReadOnlyData } - } else if characteristics & pe::IMAGE_SCN_CNT_UNINITIALIZED_DATA != 0 { + } else if characteristics.contains(pe::IMAGE_SCN_CNT_UNINITIALIZED_DATA) { SectionKind::UninitializedData - } else if characteristics & pe::IMAGE_SCN_LNK_INFO != 0 { + } else if characteristics.contains(pe::IMAGE_SCN_LNK_INFO) { SectionKind::Linker } else { SectionKind::Unknown @@ -532,7 +532,11 @@ impl pe::ImageSectionHeader { /// /// Returns `None` for sections that have no data in the file. pub fn coff_file_range(&self) -> Option<(u32, u32)> { - if self.characteristics.get(LE) & pe::IMAGE_SCN_CNT_UNINITIALIZED_DATA != 0 { + if self + .characteristics + .get(LE) + .contains(pe::IMAGE_SCN_CNT_UNINITIALIZED_DATA) + { None } else { let offset = self.pointer_to_raw_data.get(LE); @@ -558,7 +562,7 @@ impl pe::ImageSectionHeader { /// /// This is only valid for sections in a COFF file. pub fn coff_alignment(&self) -> u64 { - match self.characteristics.get(LE) & pe::IMAGE_SCN_ALIGN_MASK { + match self.characteristics.get(LE).align() { pe::IMAGE_SCN_ALIGN_1BYTES => 1, pe::IMAGE_SCN_ALIGN_2BYTES => 2, pe::IMAGE_SCN_ALIGN_4BYTES => 4, @@ -587,7 +591,10 @@ impl pe::ImageSectionHeader { let mut pointer = self.pointer_to_relocations.get(LE).into(); let mut number: usize = self.number_of_relocations.get(LE).into(); if number == u16::MAX.into() - && self.characteristics.get(LE) & pe::IMAGE_SCN_LNK_NRELOC_OVFL != 0 + && self + .characteristics + .get(LE) + .contains(pe::IMAGE_SCN_LNK_NRELOC_OVFL) { // Extended relocations. Read first relocation (which contains extended count) & adjust // relocations pointer. diff --git a/src/read/coff/symbol.rs b/src/read/coff/symbol.rs index 4a2ce35..feff3be 100644 --- a/src/read/coff/symbol.rs +++ b/src/read/coff/symbol.rs @@ -451,8 +451,10 @@ impl<'data, 'file, R: ReadRef<'data>, Coff: CoffHeader> ObjectSymbol<'data> SymbolSection::Unknown } } - index if index > 0 => SymbolSection::Section(SectionIndex(index as usize)), - _ => SymbolSection::Unknown, + n => match n.index() { + Some(i) => SymbolSection::Section(SectionIndex(i as usize)), + None => SymbolSection::Unknown, + }, } } @@ -536,9 +538,9 @@ impl<'data, 'file, R: ReadRef<'data>, Coff: CoffHeader> ObjectSymbol<'data> pub trait ImageSymbol: Debug + Pod { fn raw_name(&self) -> &[u8; 8]; fn value(&self) -> u32; - fn section_number(&self) -> i32; - fn typ(&self) -> u16; - fn storage_class(&self) -> u8; + fn section_number(&self) -> pe::SymbolSection; + fn typ(&self) -> pe::SymbolType; + fn storage_class(&self) -> pe::SymbolClass; fn number_of_aux_symbols(&self) -> u8; /// Parse a COFF symbol name. @@ -588,17 +590,14 @@ pub trait ImageSymbol: Debug + Pod { /// Return the section index for the symbol. fn section(&self) -> Option { - let section_number = self.section_number(); - if section_number > 0 { - Some(SectionIndex(section_number as usize)) - } else { - None - } + self.section_number() + .index() + .map(|i| SectionIndex(i as usize)) } /// Return true if the symbol is a definition of a function or data object. fn is_definition(&self) -> bool { - if self.section_number() <= 0 { + if self.section_number().is_reserved() { return false; } match self.storage_class() { @@ -625,7 +624,7 @@ pub trait ImageSymbol: Debug + Pod { fn has_aux_section(&self) -> bool { self.number_of_aux_symbols() > 0 && self.storage_class() == pe::IMAGE_SYM_CLASS_STATIC - && self.typ() == 0 + && self.typ().0 == 0 } /// Return true if the symbol has an auxiliary weak external symbol. @@ -636,12 +635,12 @@ pub trait ImageSymbol: Debug + Pod { && self.value() == 0 } - fn base_type(&self) -> u16 { - self.typ() & pe::N_BTMASK + fn base_type(&self) -> pe::SymbolBaseType { + self.typ().base_type() } - fn derived_type(&self) -> u16 { - (self.typ() & pe::N_TMASK) >> pe::N_BTSHFT + fn derived_type(&self) -> pe::SymbolDerivedType { + self.typ().derived_type() } } @@ -652,18 +651,18 @@ impl ImageSymbol for pe::ImageSymbol { fn value(&self) -> u32 { self.value.get(LE) } - fn section_number(&self) -> i32 { + fn section_number(&self) -> pe::SymbolSection { let section_number = self.section_number.get(LE); - if section_number >= pe::IMAGE_SYM_SECTION_MAX { - (section_number as i16) as i32 + if section_number > pe::IMAGE_SYM_SECTION_MAX { + pe::SymbolSection((section_number as i16) as i32) } else { - section_number as i32 + pe::SymbolSection(section_number as i32) } } - fn typ(&self) -> u16 { + fn typ(&self) -> pe::SymbolType { self.typ.get(LE) } - fn storage_class(&self) -> u8 { + fn storage_class(&self) -> pe::SymbolClass { self.storage_class } fn number_of_aux_symbols(&self) -> u8 { @@ -678,13 +677,13 @@ impl ImageSymbol for pe::ImageSymbolEx { fn value(&self) -> u32 { self.value.get(LE) } - fn section_number(&self) -> i32 { + fn section_number(&self) -> pe::SymbolSection { self.section_number.get(LE) } - fn typ(&self) -> u16 { + fn typ(&self) -> pe::SymbolType { self.typ.get(LE) } - fn storage_class(&self) -> u8 { + fn storage_class(&self) -> pe::SymbolClass { self.storage_class } fn number_of_aux_symbols(&self) -> u8 { diff --git a/src/read/pe/file.rs b/src/read/pe/file.rs index 9138cc8..7b5972d 100644 --- a/src/read/pe/file.rs +++ b/src/read/pe/file.rs @@ -233,9 +233,9 @@ where fn kind(&self) -> ObjectKind { let characteristics = self.nt_headers.file_header().characteristics.get(LE); - if characteristics & pe::IMAGE_FILE_DLL != 0 { + if characteristics.contains(pe::IMAGE_FILE_DLL) { ObjectKind::Dynamic - } else if characteristics & pe::IMAGE_FILE_SYSTEM != 0 { + } else if characteristics.contains(pe::IMAGE_FILE_SYSTEM) { ObjectKind::Unknown } else { ObjectKind::Executable @@ -707,8 +707,8 @@ pub trait ImageOptionalHeader: Debug + Pod { fn size_of_image(&self) -> u32; fn size_of_headers(&self) -> u32; fn check_sum(&self) -> u32; - fn subsystem(&self) -> u16; - fn dll_characteristics(&self) -> u16; + fn subsystem(&self) -> pe::Subsystem; + fn dll_characteristics(&self) -> pe::DllFlags; fn size_of_stack_reserve(&self) -> u64; fn size_of_stack_commit(&self) -> u64; fn size_of_heap_reserve(&self) -> u64; @@ -859,12 +859,12 @@ impl ImageOptionalHeader for pe::ImageOptionalHeader32 { } #[inline] - fn subsystem(&self) -> u16 { + fn subsystem(&self) -> pe::Subsystem { self.subsystem.get(LE) } #[inline] - fn dll_characteristics(&self) -> u16 { + fn dll_characteristics(&self) -> pe::DllFlags { self.dll_characteristics.get(LE) } @@ -1041,12 +1041,12 @@ impl ImageOptionalHeader for pe::ImageOptionalHeader64 { } #[inline] - fn subsystem(&self) -> u16 { + fn subsystem(&self) -> pe::Subsystem { self.subsystem.get(LE) } #[inline] - fn dll_characteristics(&self) -> u16 { + fn dll_characteristics(&self) -> pe::DllFlags { self.dll_characteristics.get(LE) } diff --git a/src/read/pe/section.rs b/src/read/pe/section.rs index 03873ac..8fd2b89 100644 --- a/src/read/pe/section.rs +++ b/src/read/pe/section.rs @@ -154,9 +154,9 @@ where fn permissions(&self) -> Permissions { let characteristics = self.section.characteristics.get(LE); Permissions::new( - characteristics & pe::IMAGE_SCN_MEM_READ != 0, - characteristics & pe::IMAGE_SCN_MEM_WRITE != 0, - characteristics & pe::IMAGE_SCN_MEM_EXECUTE != 0, + characteristics.contains(pe::IMAGE_SCN_MEM_READ), + characteristics.contains(pe::IMAGE_SCN_MEM_WRITE), + characteristics.contains(pe::IMAGE_SCN_MEM_EXECUTE), ) } } diff --git a/src/write/coff/object.rs b/src/write/coff/object.rs index f527af7..db6702a 100644 --- a/src/write/coff/object.rs +++ b/src/write/coff/object.rs @@ -11,7 +11,7 @@ struct SectionOffsets { name: writer::Name, offset: u32, reloc_offset: u32, - selection: u8, + selection: coff::ComdatSelection, associative_section: u32, } @@ -134,9 +134,9 @@ impl<'a> Object<'a> { pub(crate) fn coff_symbol_flags(&self, symbol: &Symbol) -> SymbolFlags { let typ = if symbol.kind == SymbolKind::Text { - coff::IMAGE_SYM_DTYPE_FUNCTION << coff::IMAGE_SYM_DTYPE_SHIFT + coff::IMAGE_SYM_DTYPE_FUNCTION.into() } else { - coff::IMAGE_SYM_TYPE_NULL + coff::SymbolType(0) }; let storage_class = match symbol.kind { _ if symbol.weak => coff::IMAGE_SYM_CLASS_WEAK_EXTERNAL, @@ -622,7 +622,7 @@ impl<'a> Object<'a> { time_date_stamp: 0, characteristics: match self.flags { FileFlags::Coff { characteristics } => characteristics, - _ => 0, + _ => coff::FileFlags(0), }, })?; @@ -639,13 +639,13 @@ impl<'a> Object<'a> { section.kind ))); }; - if section_offsets[index].selection != 0 { + if section_offsets[index].selection.0 != 0 { characteristics |= coff::IMAGE_SCN_LNK_COMDAT; }; if section.relocations.len() > 0xffff { characteristics |= coff::IMAGE_SCN_LNK_NRELOC_OVFL; } - characteristics |= match section.align { + characteristics = characteristics.with_align(match section.align { 1 => coff::IMAGE_SCN_ALIGN_1BYTES, 2 => coff::IMAGE_SCN_ALIGN_2BYTES, 4 => coff::IMAGE_SCN_ALIGN_4BYTES, @@ -667,7 +667,7 @@ impl<'a> Object<'a> { section.align ))); } - }; + }); writer.write_section_header(writer::SectionHeader { name: section_offsets[index].name, size_of_raw_data: section.size as u32, @@ -713,15 +713,15 @@ impl<'a> Object<'a> { }; let section_number = match symbol.section { // weak symbols are always undefined - _ if symbol.weak => coff::IMAGE_SYM_UNDEFINED as u16, + _ if symbol.weak => coff::IMAGE_SYM_UNDEFINED, SymbolSection::None => { debug_assert_eq!(symbol.kind, SymbolKind::File); - coff::IMAGE_SYM_DEBUG as u16 + coff::IMAGE_SYM_DEBUG } - SymbolSection::Undefined => coff::IMAGE_SYM_UNDEFINED as u16, - SymbolSection::Absolute => coff::IMAGE_SYM_ABSOLUTE as u16, - SymbolSection::Common => coff::IMAGE_SYM_UNDEFINED as u16, - SymbolSection::Section(id) => id.0 as u16 + 1, + SymbolSection::Undefined => coff::IMAGE_SYM_UNDEFINED, + SymbolSection::Absolute => coff::IMAGE_SYM_ABSOLUTE, + SymbolSection::Common => coff::IMAGE_SYM_UNDEFINED, + SymbolSection::Section(id) => coff::SymbolSection(id.0 as i32 + 1), }; let number_of_aux_symbols = symbol_offsets[index].aux_count; let value = if symbol.weak { @@ -743,8 +743,8 @@ impl<'a> Object<'a> { name: weak_default_symbol.name, value: symbol.value as u32, section_number: match symbol.section { - SymbolSection::Section(id) => id.0 as u16 + 1, - SymbolSection::Undefined => coff::IMAGE_SYM_ABSOLUTE as u16, + SymbolSection::Section(id) => coff::SymbolSection(id.0 as i32 + 1), + SymbolSection::Undefined => coff::IMAGE_SYM_ABSOLUTE, o => { return Err(Error(format!( "invalid symbol section for weak external `{}` section {o:?}", @@ -753,7 +753,7 @@ impl<'a> Object<'a> { } }, number_of_aux_symbols: 0, - typ: 0, + typ: coff::SymbolType(0), storage_class: coff::IMAGE_SYM_CLASS_EXTERNAL, }); } diff --git a/src/write/coff/writer.rs b/src/write/coff/writer.rs index dbed5dc..42e18c6 100644 --- a/src/write/coff/writer.rs +++ b/src/write/coff/writer.rs @@ -321,7 +321,7 @@ impl<'a> Writer<'a> { let mut coff_symbol = pe::ImageSymbol { name: [0; 8], value: symbol.value.into(), - section_number: symbol.section_number.into(), + section_number: (symbol.section_number.0 as u16).into(), typ: symbol.typ.into(), storage_class: symbol.storage_class, number_of_aux_symbols: symbol.number_of_aux_symbols, @@ -464,9 +464,9 @@ impl<'a> Writer<'a> { #[allow(missing_docs)] #[derive(Debug, Default, Clone)] pub struct FileHeader { - pub machine: u16, + pub machine: pe::Machine, pub time_date_stamp: u32, - pub characteristics: u16, + pub characteristics: pe::FileFlags, } /// A section or symbol name. @@ -504,7 +504,7 @@ pub struct SectionHeader { /// This will automatically be clamped if there are more than 0xffff. pub number_of_relocations: u32, pub number_of_linenumbers: u16, - pub characteristics: u32, + pub characteristics: pe::SectionFlags, } /// Native endian version of [`pe::ImageSymbol`]. @@ -513,9 +513,9 @@ pub struct SectionHeader { pub struct Symbol { pub name: Name, pub value: u32, - pub section_number: u16, - pub typ: u16, - pub storage_class: u8, + pub section_number: pe::SymbolSection, + pub typ: pe::SymbolType, + pub storage_class: pe::SymbolClass, pub number_of_aux_symbols: u8, } @@ -529,7 +529,7 @@ pub struct AuxSymbolSection { pub number_of_linenumbers: u16, pub check_sum: u32, pub number: u32, - pub selection: u8, + pub selection: pe::ComdatSelection, } /// Native endian version of [`pe::ImageAuxSymbolWeak`]. @@ -537,7 +537,7 @@ pub struct AuxSymbolSection { #[derive(Debug, Default, Clone)] pub struct AuxSymbolWeak { pub weak_default_sym_index: u32, - pub weak_search_type: u32, + pub weak_search_type: pe::WeakExternSearch, } /// Native endian version of [`pe::ImageRelocation`]. diff --git a/src/write/pe.rs b/src/write/pe.rs index b6d08ce..62641ec 100644 --- a/src/write/pe.rs +++ b/src/write/pe.rs @@ -469,7 +469,7 @@ impl<'a> Writer<'a> { pub fn reserve_section( &mut self, name: [u8; 8], - characteristics: u32, + characteristics: pe::SectionFlags, virtual_size: u32, data_size: u32, ) -> SectionRange { @@ -485,17 +485,17 @@ impl<'a> Writer<'a> { // Sizes in optional header use the virtual size with the file alignment. let aligned_virtual_size = util::align_u32(virtual_size, self.file_alignment); - if characteristics & pe::IMAGE_SCN_CNT_CODE != 0 { + if characteristics.contains(pe::IMAGE_SCN_CNT_CODE) { if self.code_address == 0 { self.code_address = virtual_address; } self.code_len += aligned_virtual_size; - } else if characteristics & pe::IMAGE_SCN_CNT_INITIALIZED_DATA != 0 { + } else if characteristics.contains(pe::IMAGE_SCN_CNT_INITIALIZED_DATA) { if self.data_address == 0 { self.data_address = virtual_address; } self.data_len += aligned_virtual_size; - } else if characteristics & pe::IMAGE_SCN_CNT_UNINITIALIZED_DATA != 0 { + } else if characteristics.contains(pe::IMAGE_SCN_CNT_UNINITIALIZED_DATA) { if self.data_address == 0 { self.data_address = virtual_address; } @@ -790,9 +790,9 @@ impl<'a> Writer<'a> { #[derive(Debug, Clone)] pub struct NtHeaders { // ImageFileHeader - pub machine: u16, + pub machine: pe::Machine, pub time_date_stamp: u32, - pub characteristics: u16, + pub characteristics: pe::FileFlags, // ImageOptionalHeader pub major_linker_version: u8, pub minor_linker_version: u8, @@ -804,8 +804,8 @@ pub struct NtHeaders { pub minor_image_version: u16, pub major_subsystem_version: u16, pub minor_subsystem_version: u16, - pub subsystem: u16, - pub dll_characteristics: u16, + pub subsystem: pe::Subsystem, + pub dll_characteristics: pe::DllFlags, pub size_of_stack_reserve: u64, pub size_of_stack_commit: u64, pub size_of_heap_reserve: u64, @@ -823,7 +823,7 @@ struct DataDirectory { #[derive(Debug, Clone)] pub struct Section { pub name: [u8; pe::IMAGE_SIZEOF_SHORT_NAME], - pub characteristics: u32, + pub characteristics: pe::SectionFlags, pub range: SectionRange, } diff --git a/tests/read/coff.rs b/tests/read/coff.rs index 2687041..90ba44a 100644 --- a/tests/read/coff.rs +++ b/tests/read/coff.rs @@ -14,7 +14,7 @@ fn coff_extended_relocations() { .expect("Could not find .text section in relocs_overflow.o"); match code_section.flags() { object::SectionFlags::Coff { characteristics } => { - assert!(characteristics & pe::IMAGE_SCN_LNK_NRELOC_OVFL != 0) + assert!(characteristics.contains(pe::IMAGE_SCN_LNK_NRELOC_OVFL)) } _ => panic!("Invalid section flags flavour."), }; diff --git a/tests/round_trip/comdat.rs b/tests/round_trip/comdat.rs index ab8a87b..e413f5f 100644 --- a/tests/round_trip/comdat.rs +++ b/tests/round_trip/comdat.rs @@ -76,7 +76,7 @@ fn coff_x86_64_comdat() { assert_eq!( symbol.flags(), SymbolFlags::CoffSection { - typ: 0, + typ: pe::SymbolType(0), storage_class: pe::IMAGE_SYM_CLASS_STATIC, selection: pe::IMAGE_COMDAT_SELECT_NODUPLICATES, associative_section: None @@ -94,7 +94,7 @@ fn coff_x86_64_comdat() { assert_eq!( symbol.flags(), SymbolFlags::CoffSection { - typ: 0, + typ: pe::SymbolType(0), storage_class: pe::IMAGE_SYM_CLASS_STATIC, selection: pe::IMAGE_COMDAT_SELECT_ASSOCIATIVE, associative_section: Some(section1_index)