Portable Executable and Common Object File Format Specification
Portable Executable and Common Object File Format Specification
Microsoft Corporation
Revision 6.0 - February 1999
Note This document is provided to aid in the development of tools and applications for Microsoft Windows NT but is not guaranteed to be a complete specification in all respects. Microsoft reserves the right to alter this document without notice. Microsoft, MS, MS-DOS, and CodeView are registered trademarks, and Windows, Windows NT, Win32, Win32s, and Visual C++ are trademarks of Microsoft Corporation in the USA and other countries. Alpha AXP is a trademark of Digital Equipment Corporation. Intel is a registered trademark, and Intel386 is a trademark of Intel Corporation. MIPS is a registered trademark of MIPS Computer Systems, Inc. Unicode is a trademark of Unicode, Incorporated. UNIX is a registered trademark of UNIX Systems Laboratories. Other product and company names mentioned herein may be the trademarks of their respective owners. 1999 Microsoft Corporation. All rights reserved.
Contents 1. General Concepts 2. Overview 3. File Headers 3.1. MS-DOS Stub (Image Only) 3.2. Signature (Image Only) 3.3. COFF File Header (Object & Image) 3.4. Optional Header (Usually Image Only) 4. Section Table (Section Headers) 4.1. Section Flags 4.2. Grouped Sections (Object Only) 5. Other Contents of the File 5.1. Section Data 5.2. COFF Relocations (Object Only) 5.3. COFF Line Numbers 5.4. COFF Symbol Table 5.5. Auxiliary Symbol Records 5.6. COFF String Table 5.7. The Attribute Certificate Table (Image Only) 5.8 Delay-Load Import Tables (Image Only) 6. Special Sections 6.1. The .debug Section 6.2. The .drectve Section (Object Only) 6.3. The .edata Section (Image Only) 6.4. The .idata Section 6.5. The .pdata Section 6.6. The .reloc Section (Image Only) 6.7. The .tls Section 6.8. The .rsrc Section 7. Archive (Library) File Format 7.1. Archive File Signature 7.2. Archive Member Headers 7.3. First Linker Member 7.4. Second Linker Member 7.5. Longnames Member 8. Import Library Format 8.1. Import Header 8.2. Import Type 8.3. Import Name Type Appendix: Example Object File Appendix: Calculating Image Message Digests Fields Not To Include In Digests
4 5 7 7 7 7 10 16 17 19 20 20 20 28 29 34 38 39 39 41 43 45 46 49 51 52 54 57 61 62 62 63 64 65 65 66 66 67 67 72 73
1. General Concepts
This document specifies the structure of executable (image) files and object files under the Microsoft Windows NT operating system. These files are referred to as Portable Executable (PE) and Common Object File Format (COFF) files respectively. The name Portable Executable refers to the fact that the format is not architecture-specific. Certain concepts appear repeatedly throughout the specification and are described in the following table: Name Image file Description Executable file: either a .EXE file or a DLL. An image file can be thought of as a memory image. The term image file is usually used instead of executable file, because the latter sometimes is taken to mean only a .EXE file. A file given as input to the linker. The linker produces an image file, which in turn is used as input by the loader. The term object file does not necessarily imply any connection to object-oriented programming. Relative Virtual Address. In an image file, an RVA is always the address of an item once loaded into memory, with the base address of the image file subtracted from it. The RVA of an item will almost always differ from its position within the file on disk (File Pointer). In an object file, an RVA is less meaningful because memory locations are not assigned. In this case, an RVA would be an address within a section (see below), to which a relocation is later applied during linking. For simplicity, compilers should just set the first RVA in each section to zero. Virtual Address (VA) Same as RVA (see above), except that the base address of the image file is not subtracted. The address is called a Virtual Address because Windows NT creates a distinct virtual address space for each process, independent of physical memory. For almost all purposes, a virtual address should be considered just an address. A virtual address is not as predictable as an RVA, because the loader might not load the image at its preferred location. Location of an item within the file itself, before being processed by the linker (in the case of object files) or the loader (in the case of image files). In other words, this is a position within the file as stored on disk. Date/time stamps are used in a number of places in a PE/COFF file, and for different purposes. The format of each such stamp, however, is always the same: that used by the time functions in the C run-time library.
Object file
RVA
File pointer
Date/Time Stamp
Section
A section is the basic unit of code or data within a PE/COFF file. In an object file, for example, all code can be combined within a single section, or (depending on compiler behavior) each function can occupy its own section. With more sections, there is more file overhead, but the linker is able to link in code more selectively. A section is vaguely similar to a segment in Intel 8086 architecture. All the raw data in a section must be loaded contiguously. In addition, an image file can contain a number of sections, such as .tls or .reloc, that have special purposes. Attribute certificates are used to associate verifiable statements with an image. There are a number of different verifiable statements that can be associated with a file, but one of the most useful ones, and one that is easy to describe, is a statement by a software manufacturer indicating what the message digest of the image is expected to be. A message digest is similar to a checksum except that it is extremely difficult to forge, and, therefore it is very difficult to modify a file in such a way as to have the same message digest as the original file. The statement may be verified as being made by the manufacturer by use of public/private key cryptography schemes. This document does not go into details of attribute certificates other than to allow for their insertion into image files.
2. Overview
Figures 1 and 2 illustrate the Microsoft PE executable format and the Microsoft COFF objectmodule format.
3. File Headers
The PE file header consists of an MS-DOS stub, the PE signature, the COFF File Header, and an Optional Header. A COFF object file header consists of a COFF File Header and an Optional Header. In both cases, the file headers are followed immediately by section headers.
NumberOfSections
4 8 12
4 4 4
16
SizeOfOptionalHeader
18
Characteristics
Flags indicating attributes of the file. See Section 3.3.2, Characteristics, for specific flag values.
Value 0x0 0x184 0x1c0 0x284 0x14c 0x200 0x268 0x266 0x366 0x466 0x1f0 0x162 0x166 0x168 0x1a2 0x1a6 0x1c2
IMAGE_FILE_MACHINE_ALPHA IMAGE_FILE_MACHINE_ARM IMAGE_FILE_MACHINE_ALPHA64 IMAGE_FILE_MACHINE_I386 IMAGE_FILE_MACHINE_IA64 IMAGE_FILE_MACHINE_M68K IMAGE_FILE_MACHINE_MIPS16 IMAGE_FILE_MACHINE_MIPSFPU IMAGE_FILE_MACHINE_MIPSFPU16 IMAGE_FILE_MACHINE_POWERPC IMAGE_FILE_MACHINE_R3000 IMAGE_FILE_MACHINE_R4000 IMAGE_FILE_MACHINE_R10000 IMAGE_FILE_MACHINE_SH3 IMAGE_FILE_MACHINE_SH4 IMAGE_FILE_MACHINE_THUMB
Alpha AXP 64-bit. Intel 386 or later, and compatible processors. Intel IA64 Motorola 68000 series.
MIPS with FPU MIPS16 with FPU Power PC, little endian.
3.3.2. Characteristics
The Characteristics field contains flags that indicate attributes of the object or image file. The following flags are currently defined: Flag
IMAGE_FILE_RELOCS_STRIPPED
Value 0x0001
Description Image only, Windows CE, Windows NT and above. Indicates that the file does not contain base relocations and must therefore be loaded at its preferred base address. If the base address is not available, the loader reports an error. Operating systems running on top of MS-DOS (Win32s) are generally not able to use the preferred base address and so cannot run these images. However, beginning with version 4.0, Windows will use an applications preferred base address. The default behavior of the linker is to strip base relocations from EXEs. Image only. Indicates that the image file is valid and can be run. If this flag is not set, it generally indicates a linker error. COFF line numbers have been removed. COFF symbol table entries for local symbols have been removed. Aggressively trim working set. App can handle > 2gb addresses. Use of this flag is reserved for future use. Little endian: LSB precedes MSB in memory. Machine based on 32-bit-word architecture. Debugging information removed from image file. If image is on removable media, copy and run from swap file. The image file is a system file, not a user program.
IMAGE_FILE_EXECUTABLE_IMAGE
0x0002
IMAGE_FILE_LINE_NUMS_STRIPPED
0x0004 0x0008 0x0010 0x0020 0x0040 0x0080 0x0100 0x0200 0x0400 0x1000
IMAGE_FILE_LOCAL_SYMS_STRIPPED
IMAGE_FILE_BYTES_REVERSED_LO
IMAGE_FILE_32BIT_MACHINE
IMAGE_FILE_DEBUG_STRIPPED
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
IMAGE_FILE_SYSTEM
IMAGE_FILE_DLL
0x2000
The image file is a dynamic-link library (DLL). Such files are considered executable files for almost all purposes, although they cannot be directly run. File should be run only on a UP machine. Big endian: MSB precedes LSB in memory.
IMAGE_FILE_UP_SYSTEM_ONLY
0x4000 0x8000
IMAGE_FILE_BYTES_REVERSED_HI
PE32+ images allow for a 64-bit address space while limiting the image size to 4 Gigabytes. Other PE32+ modifications are addressed in their respective sections. The Optional Header itself has three major parts: Offset
(PE32/PE32+)
Size
(PE32/PE32+)
Description These are defined for all implementations of COFF, including UNIX. These include additional fields to support specific features of Windows (for example, subsystem). These fields are address/size pairs for special tables, found in the image file and used by the operating system (for example, Import Table and Export Table).
0 28/24
28/24 68 / 88
96/112
Variable
2 3 4
1 1 4
SizeOfInitializedData
12
SizeOfUninitializedData
16
AddressOfEntryPoint
20
BaseOfCode
PE32 contains this additional field, absent in PE32+, following BaseOfCode: 24 4 BaseOfData Address, relative to image base, of beginning of data section, when loaded into memory.
Size
(PE32/PE32+)
Field ImageBase
Description Preferred address of first byte of image when loaded into memory; must be a multiple of 64K. The default for DLLs is 0x10000000. The default for Windows CE EXEs is 0x00010000. The default for Windows NT, Windows 95, and Windows 98 is 0x00400000. Alignment (in bytes) of sections when loaded into memory. Must greater or equal to File Alignment. Default is the page size for the architecture. Alignment factor (in bytes) used to align the raw data of sections in the image file. The value should be a power of 2 between 512 and 64K inclusive. The default is 512. If the SectionAlignment is less than the architectures page size than this must match the SectionAlignment. Major version number of required OS. Minor version number of required OS. Major version number of image. Minor version number of image. Major version number of subsystem. Minor version number of subsystem. dd Size, in bytes, of image, including all headers; must be a multiple of Section Alignment. Combined size of MS-DOS stub, PE Header, and section headers rounded up to a multiple of FileAlignment.
28 / 24
4/8
32 / 32
SectionAlignment
36 / 36
FileAlignment
40 / 40 42 / 42 44 / 44 46 / 46 48 / 48 50 / 50 52 / 52 56 / 56
2 2 2 2 2 2 4 4
MajorOperatingSystem Version MinorOperatingSystem Version MajorImageVersion MinorImageVersion MajorSubsystemVersion MinorSubsystemVersion Reserved SizeOfImage
60 / 60
SizeOfHeaders
64 / 64
CheckSum
Image file checksum. The algorithm for computing is incorporated into IMAGHELP.DLL. The following are checked for validation at load time: all drivers, any DLL loaded at boot time, and any DLL that ends up in the server. Subsystem required to run this image. See Windows NT Subsystem below for more information. See DLL Characteristics below for more information. Size of stack to reserve. Only the Stack Commit Size is committed; the rest is made available one page at a time, until reserve size is reached. Size of stack to commit. Size of local heap space to reserve. Only the Heap Commit Size is committed; the rest is made available one page at a time, until reserve size is reached. Size of local heap space to commit. Obsolete. Number of data-dictionary entries in the remainder of the Optional Header. Each describes a location and size.
68 / 68
Subsystem
70 / 70 72 / 72
2 4/8
76 / 80 80 / 88
4/8 4/8
SizeOfStackCommit SizeOfHeapReserve
84 / 96 88 / 104 92 / 108
4/8 4 4
Windows NT Subsystem
The following values are defined for the Subsystem field of the Optional Header. They determine what, if any, Windows NT subsystem is required to run the image. Constant
IMAGE_SUBSYSTEM_UNKNOWN IMAGE_SUBSYSTEM_NATIVE
Value 0 1 2 3 7 9 10 11
Description Unknown subsystem. Used for device drivers and native Windows NT processes. Image runs in the Windows graphical user interface (GUI) subsystem. Image runs in the Windows character subsystem. Image runs in the Posix character subsystem. Image runs in on Windows CE. Image is an EFI application. Image is an EFI driver that provides boot services. Image is an EFI driver that provides runtime services.
IMAGE_SUBSYSTEM_WINDOWS_GUI
IMAGE_SUBSYSTEM_WINDOWS_CUI
IMAGE_SUBSYSTEM_POSIX_CUI
12
DLL Characteristics
The following values are defined for the DLLCharacteristics field of the Optional Header. Constant Value 0x0001 0x0002 0x0004 0x0008
IMAGE_DLLCHARACTERISTICS_NO_BIND IMAGE_DLLCHARACTERISTICS_WDM_DRIVER IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_ AWARE
Description Reserved Reserved Reserved Reserved Do not bind image Driver is a WDM Driver Image is Terminal Server aware
The first field, RVA, is the relative virtual address of the table. The RVA is the address of the table, when loaded, relative to the base address of the image. The second field gives the size in bytes. The data directories, which form the last part of the Optional Header, are listed below. Note that the number of directories is not fixed. The NumberOfRvaAndSizes field in the optional header should be checked before looking for a specific directory. Do not assume that the RVAs given in this table point to the beginning of a section or that the sections containing specific tables have specific names. Offset
(PE/PE32+)
Size 8 8 8 8 8 8 8 8 8
Field Export Table Import Table Resource Table Exception Table Certificate Table Base Relocation Table Debug Architecture Global Ptr
Description Export Table address and size. Import Table address and size Resource Table address and size. Exception Table address and size. Attribute Certificate Table address and size. Base Relocation Table address and size. Debug data starting address and size. Architecture-specific data address and size. Relative virtual address of the value to be stored in the global pointer register. Size member of this structure must be set to 0. Thread Local Storage (TLS) Table address and size. Load Configuration Table address and size. Bound Import Table address and size. Import Address Table address and size. Address and size of the Delay Import Descriptor. COM+ Runtime Header address and size
8 8 8 8 8 8 8
TLS Table Load Config Table Bound Import IAT Delay Import Descriptor COM+ Runtime Header Reserved
The Certificate Table entry points to a table of attribute certificates. These certificates are not loaded into memory as part of the image. As such, the first field of this entry, which is normally an RVA, is a File Pointer instead.
VirtualSize
12
VirtualAddress
16
SizeOfRawData
Size of the section (object file) or size of the initialized data on disk (image files). For executable image, this must be a multiple of FileAlignment from the optional header. If this is less than VirtualSize the remainder of the section is zero filled. Because this field is rounded while the VirtualSize field is not it is possible for this to be greater than VirtualSize as well. When a section contains only uninitialized data, this field should be 0. File pointer to sections first page within the COFF file. For executable images, this must be a multiple of FileAlignment from the optional header. For object files, the value should be aligned on a fourbyte boundary for best performance. When a section contains only uninitialized data, this field should be 0. File pointer to beginning of relocation entries for the section. Set to 0 for executable images or if there are no relocations. File pointer to beginning of line-number entries for the section. Set to 0 if there are no COFF line numbers. Number of relocation entries for the section. Set to 0 for executable images. Number of line-number entries for the section. Flags describing sections characteristics. See Section 4.1, Section Flags, for more information.
20
PointerToRawData
24
28
32 34 36
2 2 4
Description Reserved for future use. Reserved for future use. Reserved for future use. Reserved for future use. Section should not be padded to next boundary. This is obsolete and replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid for object files only.
Reserved for future use. Section contains executable code. Section contains initialized data. Section contains uninitialized data. Reserved for future use. Section contains comments or other information. The .drectve section has this type. This is valid for object files only. Reserved for future use. Section will not become part of the image. This is valid for object files only. Section contains COMDAT data. See Section 5.5.6, COMDAT Sections, for more information. This is valid for object files only. Reserved for future use. Reserved for future use. Reserved for future use. Reserved for future use. Reserved for future use. Align data on a 1-byte boundary. This is valid for object files only. Align data on a 2-byte boundary. This is valid for object files only. Align data on a 4-byte boundary. This is valid for object files only. Align data on a 8-byte boundary. This is valid for object files only. Align data on a 16-byte boundary. This is valid for object files only. Align data on a 32-byte boundary. This is valid for object files only. Align data on a 64-byte boundary. This is valid for object files only. Align data on a 128-byte boundary. This is valid for object files only.
IMAGE_SCN_TYPE_OVER IMAGE_SCN_LNK_REMOVE
0x00000400 0x00000800
IMAGE_SCN_LNK_COMDAT
0x00001000
0x00008000 0x00020000 0x00020000 0x00040000 0x00080000 0x00100000 0x00200000 0x00300000 0x00400000 0x00500000 0x00600000 0x00700000 0x00800000
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
0x00900000 0x00A00000 0x00B00000 0x00C00000 0x00D00000 0x00E00000 0x01000000 0x02000000 0x04000000 0x08000000 0x10000000 0x20000000 0x40000000 0x80000000
Align data on a 256-byte boundary. This is valid for object files only. Align data on a 512-byte boundary. This is valid for object files only. Align data on a 1024-byte boundary. This is valid for object files only. Align data on a 2048-byte boundary. This is valid for object files only. Align data on a 4096-byte boundary. This is valid for object files only. Align data on a 8192-byte boundary. This is valid for object files only. Section contains extended relocations. Section can be discarded as needed. Section cannot be cached. Section is not pageable. Section can be shared in memory. Section can be executed as code. Section can be read. Section can be written to.
IMAGE_SCN_ALIGN_512BYTES
IMAGE_SCN_ALIGN_1024BYTES
IMAGE_SCN_ALIGN_2048BYTES
IMAGE_SCN_ALIGN_4096BYTES
IMAGE_SCN_ALIGN_8192BYTES
IMAGE_SCN_LNK_NRELOC_OVFL
IMAGE_SCN_LNK_NRELOC_OVFL indicates that the count of relocations for the section exceeds the 16 bits reserved for it in section header. If the bit is set and the NumberOfRelocations field in the section header is 0xffff, the actual relocation count is stored in the 32-bit VirtualAddress field of the first relocation.
For each section in an object file, there is an array of fixed-length records that are the sections COFF relocations. The position and length of the array are specified in the section header. Each element of the array has the following format: Offset 0 Size 4 Field VirtualAddress Description Address of the item to which relocation is applied: this is the offset from the beginning of the section, plus the value of the sections RVA/Offset field (see Section 4, Section Table.). For example, if the first byte of the section has an address of 0x10, the third byte has an address of 0x12. A zero-based index into the symbol table. This symbol gives the address to be used for the relocation. If the specified symbol has section storage class, then the symbols address is the address with the first section of the same name. A value indicating what kind of relocation should be performed. Valid relocation types depend on machine type. See Section 5.2.1, Type Indicators.
SymbolTableInd ex
Type
If the symbol referred to (by the SymbolTableIndex field) has storage class IMAGE_SYM_CLASS_SECTION, the symbols address is the beginning of the section. The section is usually in the same file, except when the object file is part of an archive (library). In that case, the section may be found in any other object file in the archive that has the same archive-member name as the current object file. (The relationship with the archive-member name is used in the linking of import tables, i.e. the .idata section.)
Intel 386
The following relocation type indicators are defined for Intel386 and compatible processors: Constant
IMAGE_REL_I386_ABSOLUTE IMAGE_REL_I386_DIR16 IMAGE_REL_I386_REL16 IMAGE_REL_I386_DIR32 IMAGE_REL_I386_DIR32NB IMAGE_REL_I386_SEG12 IMAGE_REL_I386_SECTION
Description This relocation is ignored. Not supported. Not supported. The targets 32-bit virtual address. The targets 32-bit relative virtual address. Not supported. The 16-bit-section index of the section containing the target. This is used to support debugging information.
IMAGE_REL_I386_SECREL
0x000B
The 32-bit offset of the target from the beginning of its section. This is used to support debugging information as well as static thread local storage. The 32-bit relative displacement to the target. This supports the x86 relative branch and call instructions.
IMAGE_REL_I386_REL32
0x0014
MIPS Processors
The following relocation type indicators are defined for MIPS processors: Constant
IMAGE_REL_MIPS_ABSOLUTE IMAGE_REL_MIPS_REFHALF
Description This relocation is ignored. The high 16 bits of the targets 32-bit virtual address. The targets 32-bit virtual address. The low 26 bits of the targets virtual address. This supports the MIPS J and JAL instructions. The high 16 bits of the targets 32-bit virtual address. Used for the first instruction in a twoinstruction sequence that loads a full address. This relocation must be immediately followed by a PAIR relocations whose SymbolTableIndex contains a signed 16-bit displacement which is added to the upper 16 bits taken from the location being relocated. The low 16 bits of the targets virtual address. 16-bit signed displacement of the target relative to the Global Pointer (GP) register. Same as IMAGE_REL_MIPS_GPREL. The 16-bit section index of the section containing the target. This is used to support debugging information. The 32-bit offset of the target from the beginning of its section. This is used to support debugging information as well as static thread local storage. The low 16 bits of the 32-bit offset of the target from the beginning of its section.
IMAGE_REL_MIPS_REFWORD IMAGE_REL_MIPS_JMPADDR
IMAGE_REL_MIPS_REFHI
IMAGE_REL_MIPS_REFLO IMAGE_REL_MIPS_GPREL
IMAGE_REL_MIPS_LITERAL IMAGE_REL_MIPS_SECTION
IMAGE_REL_MIPS_SECREL
0x000B
IMAGE_REL_MIPS_SECRELLO
0x000C
IMAGE_REL_MIPS_SECRELHI
0x000D
The high 16 bits of the 32-bit offset of the target from the beginning of its section. A PAIR relocation must immediately follow this on. The SymbolTableIndex of the PAIR relocation contains a signed 16-bit displacement, which is added to the upper 16 bits taken from the location being relocated. The low 26 bits of the targets virtual address. This supports the MIPS16 JAL instruction. The targets 32-bit relative virtual address. This relocation is only valid when it immediately follows a REFHI or SECRELHI relocation. Its SymbolTableIndex contains a displacement and not an index into the symbol table.
IMAGE_REL_MIPS_JMPADDR16
IMAGE_REL_MIPS_REFWORDNB IMAGE_REL_MIPS_PAIR
Alpha Processors
The following relocation Type indicators are defined for Alpha processors: Constant
IMAGE_REL_ALPHA_ABSOLUTE IMAGE_REL_ALPHA_REFLONG
Description This relocation is ignored. The targets 32-bit virtual address. This fixup is illegal in a PE32+ image unless the image has been sandboxed by clearing the IMAGE_FILE_LARGE_ADDRESS_AWARE bit in the File Header. The targets 64-bit virtual address. 32-bit signed displacement of the target relative to the Global Pointer (GP) register. 16-bit signed displacement of the target relative to the Global Pointer (GP) register. Reserved for future use. Reserved for future use. The 21-bit relative displacement to the target. This supports the Alpha relative branch instructions. 14-bit hints to the processor for the target of an Alpha jump instruction.
IMAGE_REL_ALPHA_REFQUAD IMAGE_REL_ALPHA_GPREL32
IMAGE_REL_ALPHA_LITERAL
IMAGE_REL_ALPHA_HINT
0x0008
IMAGE_REL_ALPHA_INLINE_REFL ONG
0x0009
The targets 32-bit virtual address split into high and low 16-bit parts. Either an ABSOLUTE or MATCH relocation must immediately follow this relocation. The high 16 bits of the target address are stored in the location identified by the INLINE_REFLONG relocation. The low 16 bits are stored four bytes later if the following relocation is of type ABSOLUTE or at a signed displacement given in the SymbolTableIndex if the following relocation is of type MATCH. The high 16 bits of the targets 32-bit virtual address. Used for the first instruction in a twoinstruction sequence that loads a full address. This relocation must be immediately followed by a PAIR relocations whose SymbolTableIndex contains a signed 16-bit displacement which is added to the upper 16 bits taken from the location being relocated. The low 16 bits of the targets virtual address. This relocation is only valid when it immediately follows a REFHI , REFQ3, REFQ2, or SECRELHI relocation. Its SymbolTableIndex contains a displacement and not an index into the symbol table. This relocation is only valid when it immediately follows INLINE_REFLONG relocation. Its SymbolTableIndex contains the displacement in bytes of the location for the matching low address and not an index into the symbol table. The 16-bit section index of the section containing the target. This is used to support debugging information. The 32-bit offset of the target from the beginning of its section. This is used to support debugging information as well as static thread local storage. The targets 32-bit relative virtual address. The low 16 bits of the 32-bit offset of the target from the beginning of its section.
IMAGE_REL_ALPHA_REFHI
0x000A
IMAGE_REL_ALPHA_REFLO IMAGE_REL_ALPHA_PAIR
0x000B 0x000C
IMAGE_REL_ALPHA_MATCH
0x000D
IMAGE_REL_ALPHA_SECTION
0x000E
IMAGE_REL_ALPHA_SECREL
0x000F
IMAGE_REL_ALPHA_REFLONGNB IMAGE_REL_ALPHA_SECRELLO
0x0010 0x0011
IMAGE_REL_ALPHA_SECRELHI
0x0012
The high 16 bits of the 32-bit offset of the target from the beginning of its section. A PAIR relocation must immediately follow this on. The SymbolTableIndex of the PAIR relocation contains a signed 16-bit displacement which is added to the upper 16 bits taken from the location being relocated. The low 16 bits of the high 32 bits of the targets 64-bit virtual address. This relocation must be immediately followed by a PAIR relocations whose SymbolTableIndex contains a signed 32bit displacement which is added to the 16 bits taken from the location being relocated. The 16 bits in the relocated location are shifted left by 32 before this addition. The high 16 bits of the low 32 bits of the targets 64-bit virtual address. This relocation must be immediately followed by a PAIR relocations whose SymbolTableIndex contains a signed 16bit displacement which is added to the upper 16 bits taken from the location being relocated. The low 16 bits of the targets 64-bit virtual address. The low 16 bits of the 32-bit signed displacement of the target relative to the Global Pointer (GP) register. The high 16 bits of the 32-bit signed displacement of the target relative to the Global Pointer (GP) register.
IMAGE_REL_ALPHA_REFQ3
0x0013
IMAGE_REL_ALPHA_REFQ2
0x0014
IMAGE_REL_ALPHA_REFQ1
0x0015 0x0016
IMAGE_REL_ALPHA_GPRELLO
IMAGE_REL_ALPHA_GPRELHI
0x0017
Description This relocation is ignored. The targets 64-bit virtual address. The targets 32-bit virtual address. The low 24 bits of the targets virtual address. This is only valid when the target symbol is absolute and can be sign extended to its original value. The low 16 bits of the targets virtual address.
IMAGE_REL_PPC_ADDR16
0x0004
IMAGE_REL_PPC_ADDR14
0x0005
The low 14 bits of the targets virtual address. This is only valid when the target symbol is absolute and can be sign extended to its original value. A 24-bit PC-relative offset to the symbols location. A 14-bit PC-relative offset to the symbols location. The targets 32-bit relative virtual address. The 32-bit offset of the target from the beginning of its section. This is used to support debugging information as well as static thread local storage. The 16-bit section index of the section containing the target. This is used to support debugging information. The 16-bit offset of the target from the beginning of its section. This is used to support debugging information as well as static thread local storage. The high 16 bits of the targets 32-bit virtual address. Used for the first instruction in a two-instruction sequence that loads a full address. This relocation must be immediately followed by a PAIR relocations whose SymbolTableIndex contains a signed 16-bit displacement which is added to the upper 16 bits taken from the location being relocated. The low 16 bits of the targets virtual address. This relocation is only valid when it immediately follows a REFHI or SECRELHI relocation. Its SymbolTableIndex contains a displacement and not an index into the symbol table. The low 16 bits of the 32-bit offset of the target from the beginning of its section. The high 16 bits of the 32-bit offset of the target from the beginning of its section. A PAIR relocation must immediately follow this on. The SymbolTableIndex of the PAIR relocation contains a signed 16-bit displacement which is added to the upper 16 bits taken from the location being relocated. 16-bit signed displacement of the target relative to the Global Pointer (GP) register.
IMAGE_REL_PPC_SECTION
0x000C
IMAGE_REL_PPC_SECREL16
0x000F
IMAGE_REL_PPC_REFHI
0x0010
IMAGE_REL_PPC_REFLO IMAGE_REL_PPC_PAIR
0x0011 0x0012
IMAGE_REL_PPC_SECRELLO
0x0013 0x0014
IMAGE_REL_PPC_SECRELHI
IMAGE_REL_PPC_GPREL
0x0015
Description This relocation is ignored. Reference to the 16-bit location that contains the virtual address of the target symbol. The targets 32-bit virtual address. Reference to the 8-bit location that contains the virtual address of the target symbol. Reference to the 8-bit instruction that contains the effective 16-bit virtual address of the target symbol. Reference to the 8-bit instruction that contains the effective 32-bit virtual address of the target symbol. Reference to the 8-bit location whose low 4 bits contain the virtual address of the target symbol. Reference to the 8-bit instruction whose low 4 bits contain the effective 16-bit virtual address of the target symbol. Reference to the 8-bit instruction whose low 4 bits contain the effective 32-bit virtual address of the target symbol. Reference to the 8-bit instruction which contains the effective 16-bit relative offset of the target symbol. Reference to the 8-bit instruction which contains the effective 32-bit relative offset of the target symbol. Reference to the 16-bit instruction whose low 12 bits contain the effective 16-bit relative offset of the target symbol. Reference to a 32-bit location that is the virtual address of the symbols section. Reference to the 32-bit location that is the size of the symbols section. The 16-bit section index of the section containing the target. This is used to support debugging information.
IMAGE_REL_SH3_DIRECT32 IMAGE_REL_SH3_DIRECT8
IMAGE_REL_SH3_DIRECT8_WORD
IMAGE_REL_SH3_DIRECT8_LONG
0x0005
IMAGE_REL_SH3_DIRECT4
0x0006
IMAGE_REL_SH3_DIRECT4_WORD
0x0007
IMAGE_REL_SH3_DIRECT4_LONG
0x0008
IMAGE_REL_SH3_PCREL8_WORD
0x0009
IMAGE_REL_SH3_PCREL8_LONG
0x000A
IMAGE_REL_SH3_PCREL12_WORD
0x000B
IMAGE_REL_SH3_STARTOF_SECTION
IMAGE_REL_SH3_SIZEOF_SECTION
IMAGE_REL_SH3_SECTION
IMAGE_REL_SH3_SECREL
0x000F
The 32-bit offset of the target from the beginning of its section. This is used to support debugging information as well as static thread local storage. The targets 32-bit relative virtual address.
IMAGE_REL_SH3_DIRECT32_NB
0x0010
ARM Processors
The following relocation Type indicators are defined for ARM processors: Constant
IMAGE_REL_ARM_ABSOLUTE IMAGE_REL_ARM_ADDR32 IMAGE_REL_ARM_ADDR32NB IMAGE_REL_ARM_BRANCH24 IMAGE_REL_ARM_BRANCH11
Description This relocation is ignored. The targets 32-bit virtual address. The targets 32-bit relative virtual address. The 24-bit relative displacement to the target. Reference to a subroutine call, consisting of two 16-bit instructions with 11-bit offsets. The 16-bit section index of the section containing the target. This is used to support debugging information. The 32-bit offset of the target from the beginning of its section. This is used to support debugging information as well as static thread local storage.
IMAGE_REL_ARM_SECTION
IMAGE_REL_ARM_SECREL
0x000F
Linenumber
The Type field is a union of two four-byte fields, Symbol Table Index, and RVA: Offset 0 Size 4 Field SymbolTableIndex Description Used when Linenumber is 0: index to symbol table entry for a function. This format is used to indicate the function that a group of line-number records refer to. Used when Linenumber is non-zero: relative virtual address of the executable code that corresponds to the source line indicated. In an object file, this contains the virtual address within the section.
VirtualAddress
A line-number record, then, can either set the Linenumber field to 0 and point to a function definition in the Symbol Table, or else it can work as a standard line-number entry by giving a positive integer (line number) and the corresponding address in the object code. A group of line-number entries always begins with the first format: the index of a function symbol. If this is the first line-number record in the section, then it is also the COMDAT symbol name for the function if the sections COMDAT flag is set. (See Section 5.5.6, COMDAT Sections.) The functions auxiliary record in the Symbol Table has a Pointer to Linenumbers field that points to this same line-number record. A record identifying a function is followed by any number of line-number entries that give actual line-number information (Linenumber greater than zero). These entries are one-based, relative to the beginning of the function, and represent every source line in the function except for the first one. For example, the first line-number record for the following example would specify the ReverseSign function (Symbol Table Index of ReverseSign, Linenumber set to 0). Then records with Linenumber values of 1, 2, and 3 would follow, corresponding to source lines as shown:
// some code precedes ReverseSign function int ReverseSign(int i) 1: { 2: return -1 * i; 3: }
The Symbol Table is an array of records, each 18 bytes long. Each record is either a standard or auxiliary symbol-table record. A standard record defines a symbol or name, and has the following format: Offset 0 Size 8 Field Name (*) Description Name of the symbol, represented by union of three structures. An array of eight bytes is used if the name is not more than eight bytes long. See Section 5.4.1, Symbol Name Representation, for more information. Value associated with the symbol. The interpretation of this field depends on Section Number and Storage Class. A typical meaning is the relocatable address. Signed integer identifying the section, using a one-based index into the Section Table. Some values have special meaning defined in Section Number Values. A number representing type. Microsoft tools set this field to 0x20 (function) or 0x0 (not a function). See Section 5.4.3, Type Representation, for more information. Enumerated value representing storage class. See Section 5.4.4, Storage Class, for more information. Number of auxiliary symbol table entries that follow this record.
Value
12
SectionNumber
14
Type
16
StorageClass
17
NumberOfAuxSymbols
Zero or more auxiliary symbol-table records immediately follow each standard symbol-table record. However, typically not more than one auxiliary symbol-table record follows a standard symbol-table record (except for .file records with long file names). Each auxiliary record is the same size as a standard symbol-table record (18 bytes), but rather than define a new symbol, the auxiliary record gives additional information on the last symbol defined. The choice of which of several formats to use depends on the Storage Class field. Currently defined formats for auxiliary symbol table records are shown in Auxiliary Symbol Records. Tools that read COFF symbol tables must ignore auxiliary symbol records whose interpretation is unknown. This allows the symbol table format to be extended to add new auxiliary records, without breaking existing tools.
0 4
4 4
Zeroes Offset
Value 0
Description Symbol record is not yet assigned a section. If the value is 0 this indicates a references to an external symbol defined elsewhere. If the value is non-zero this is a common symbol with a size specified by the value. The symbol has an absolute (non-relocatable) value and is not an address. The symbol provides general type or debugging information but does not correspond to a section. Microsoft tools use this setting along with .file records (storage class FILE).
IMAGE_SYM_ABSOLUTE
-1 -2
IMAGE_SYM_DEBUG
The following values are defined for base type, although Microsoft tools generally do not use this field, setting the least-significant byte to 0. Instead, CodeView information is used to indicate types. However, the possible COFF values are listed here for completeness. Constant
IMAGE_SYM_TYPE_NULL
Value 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Description No type information or unknown base type. Microsoft tools use this setting. No valid type; used with void pointers and functions. Character (signed byte). Two-byte signed integer. Natural integer type (normally four bytes in Windows NT). Four-byte signed integer. Four-byte floating-point number. Eight-byte floating-point number. Structure. Union. Enumerated type. Member of enumeration (a specific value). Byte; unsigned one-byte integer. Word; unsigned two-byte integer. Unsigned integer of natural size (normally, four bytes). Unsigned four-byte integer.
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
The most significant byte specifies whether the symbol is a pointer to, function returning, or array of the base type specified in the least significant byte. Microsoft tools use this field only to indicate whether or not the symbol is a function, so that the only two resulting values are 0x0 and 0x20 for the Type field. However, other tools can use this field to communicate more information. It is very important to specify the function attribute correctly. This information is required for incremental linking to work correctly. For some architectures the information may be required for other purposes. Constant
IMAGE_SYM_DTYPE_NULL
Value 0 1 2
Description No derived type; the symbol is a simple scalar variable. Pointer to base type. Function returning base type.
IMAGE_SYM_DTYPE_POINTER IMAGE_SYM_DTYPE_FUNCTION
IMAGE_SYM_DTYPE_ARRAY
Value -1 (0xFF) 0 1 2
Description / Interpretation of Value Field Special symbol representing end of function, for debugging purposes. No storage class assigned. Automatic (stack) variable. The Value field specifies stack frame offset. Used by Microsoft tools for external symbols. The Value field indicates the size if the section number is IMAGE_SYM_UNDEFINED (0). If the section number is not 0, then the Value field specifies the offset within the section. The Value field specifies the offset of the symbol within the section. If the Value is 0, then the symbol represents a section name. Register variable. The Value field specifies register number. Symbol is defined externally. Code label defined within the module. The Value field specifies the offset of the symbol within the section. Reference to a code label not defined. Structure member. The Value field specifies nth member. Formal argument (parameter)of a function. The Value field specifies nth argument. Structure tag-name entry.
IMAGE_SYM_CLASS_NULL IMAGE_SYM_CLASS_AUTOMATIC
IMAGE_SYM_CLASS_EXTERNAL
IMAGE_SYM_CLASS_STATIC
IMAGE_SYM_CLASS_REGISTER
4 5 6
IMAGE_SYM_CLASS_EXTERNAL_DEF IMAGE_SYM_CLASS_LABEL
IMAGE_SYM_CLASS_UNDEFINED_LABEL IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
7 8 9 10
IMAGE_SYM_CLASS_ARGUMENT
IMAGE_SYM_CLASS_STRUCT_TAG
IMAGE_SYM_CLASS_MEMBER_OF_UNION
11 12 13 14 15 16 17 18 100
Union member. The Value field specifies nth member. Union tag-name entry. Typedef entry. Static data declaration. Enumerated type tagname entry. Member of enumeration. Value specifies nth member. Register parameter. Bit-field reference. Value specifies nth bit in the bit field. A .bb (beginning of block) or .eb (end of block) record. Value is the relocatable address of the code location. Used by Microsoft tools for symbol records that define the extent of a function: begin function (named .bf), end function (.ef), and lines in function (.lf). For .lf records, Value gives the number of source lines in the function. For .ef records, Value gives the size of function code. End of structure entry. Used by Microsoft tools, as well as traditional COFF format, for the source-file symbol record. The symbol is followed by auxiliary records that name the file. Definition of a section (Microsoft tools use STATIC storage class instead). Weak external. See Section 5.5.3, Auxiliary Format 3: Weak Externals, for more information.
IMAGE_SYM_CLASS_REGISTER_PARAM IMAGE_SYM_CLASS_BIT_FIELD
IMAGE_SYM_CLASS_BLOCK
IMAGE_SYM_CLASS_FUNCTION
101
IMAGE_SYM_CLASS_END_OF_STRUCT IMAGE_SYM_CLASS_FILE
102 103
IMAGE_SYM_CLASS_SECTION
104 105
IMAGE_SYM_CLASS_WEAK_EXTERNAL
The traditional COFF design also includes auxiliary-record formats for arrays and structures. Microsoft tools do not use these, and instead place that symbolic information in CodeView format in the debug sections.
PointerToLinenumber
12
PointerToNextFunction
16
Unused.
The .bf and .ef symbol records (but not .lf records) are followed by an auxiliary record with the following format:
Offset 0 4
Size 4 2
Description
Actual ordinal line number (1, 2, 3, etc.) within source file, corresponding to the .bf or .ef record.
6 12
6 4
Unused. PointerToNextFunction (.bf only) Symbol-table index of the next .bf symbol record. If the function is the last in the symbol table, this field is set to zero. Not used for .ef records.
16
Unused.
A value of IMAGE_WEAK_EXTERN_SEARCH_LIBRARY indicates that a library search for sym1 should be performed.
10
Unused.
Note that the Characteristics field is not defined in WINNT.H; instead, the Total Size field is used.
12
Number
14 15
1 3
Selection Unused.
COMDAT section in question, Type field equal to IMAGE_SYM_TYPE_NULL, Class field equal to IMAGE_SYM_CLASS_STATIC, and one auxiliary record. The second symbol is called the COMDAT symbol and is used by the linker in conjunction with the Selection field. Values for the Selection field are shown below. Constant
IMAGE_COMDAT_SELECT_NODUPLICATES
Value 1 2
Description The linker issues a multiply defined symbol error if this symbol is already defined. Any section defining the same COMDAT symbol may be linked; the rest are removed. The linker chooses an arbitrary section among the definitions for this symbol. A multiply defined symbol error is issued if all definitions dont have the same size. The linker chooses an arbitrary section among the definitions for this symbol. A multiply defined symbol error is issued if all definitions dont match exactly. The section is linked if a certain other COMDAT section is linked. This other section is indicated by the Number field of the auxiliary symbol record for the section definition. Use of this setting is useful for definitions that have components in multiple sections (for example, code in one and data in another), but where all must be linked or discarded as a set. The linker chooses the largest from the definitions for this symbol. If multiple definitions have this size the choice between them is arbitrary.
IMAGE_COMDAT_SELECT_ANY
IMAGE_COMDAT_SELECT_SAME_SIZE
IMAGE_COMDAT_SELECT_EXACT_MATCH
IMAGE_COMDAT_SELECT_ASSOCIATIVE
IMAGE_COMDAT_SELECT_LARGEST
Size of Certificate
Notice that certificates always start on an octaword boundary. If a certificate is not an even number of octawords long, it is zero padded to the next octaword boundary. However, the length of the certificate does not include this padding and so any certificate navigation software must be sure to round up to the next octaword to locate another certificate.
Module Handle
12
16
20 24
4 4
28
Time Stamp
The tables referenced in this data structure are organized and sorted just as their counterparts are for traditional imports. See Section 6.4. The idata Section for details.
5.8.2. Attributes
As yet, there are no attribute flags defined. This field is currently set to zero by the linker in the image. This field can be used to extend the record by indicating the presence of new fields or for indicating behaviors to the delay and/or unload helper functions.
5.8.3. Name
The name of the DLL to be delay loaded resides in the read-only data section of the image and is referenced via the szName field.
5.8.7. Delay Bound Import Address Table (BIAT) and Time Stamp
The delay BIAT is an optional table of IMAGE_THUNK_DATA items that is used along with the timestamp field by a post process binding phase.
6. Special Sections
Typical COFF sections contain code or data that linkers and Win32 loaders process without special knowledge of the sections contents. The contents are relevant only to the application being linked or executed. However, some COFF sections have special meanings when found in object files and/or image files. Tools and loaders recognize these sections because they have special flags set in the section header, or because they are pointed to from special locations in the image optional header, or because the section name is magic: that is, the name indicates a special function of the section. (Even where the section name is not magic, the name is dictated by convention, so we will refer to a name.)
The reserved sections and their attributes are described in the table below, followed by detailed descriptions for a subset of them. Section Name .arch Content Alpha architecture information Characteristics IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_8BYTES | IMAGE_SCN_MEM_DISCARDABLE IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IIMAGE_SCN_MEM_READ IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.bss
Uninitialized data
.data
Initialized data
.edata .idata
.rsrc
.text
.tls
.xdata
Some of the sections listed here are marked (object only) or (image only) to indicate that their special semantics are relevant only for object files or image files, respectively. A section that says (image only) may still appear in an object file as a way of getting into the image file, but the section has no special meaning to the linker, only to the image file loader.
16 20 24
4 4 4
Value 0 1
Description Unknown value, ignored by all tools. COFF debug information (line numbers, symbol table, and string table). This type of debug information is also pointed to by fields in the file headers. CodeView debug information. The format of the data block is described by the CV4 specification. Frame Pointer Omission (FPO) information. This information tells the debugger how to interpret non-standard stack frames, which use the EBP register for a purpose other than as a frame pointer.
IMAGE_DEBUG_TYPE_CODEVIEW
IMAGE_DEBUG_TYPE_FPO
4 5 6 7 8 9
If Debug Type is set to IMAGE_DEBUG_TYPE_FPO, the debug raw data is an array in which each member describes the stack frame of a function. Not every function in the image file need have FPO information defined for it, even though debug type is FPO. Those functions that do not have FPO information are assumed to have normal stack frames. The format for FPO information is defined as follows:
#define FRAME_FPO #define FRAME_TRAP #define FRAME_TSS 0 1 2 // // // // 8; 3; 1; 1; 1; 2; // // // // // // offset 1st # bytes in # bytes in # bytes in byte of function code function locals/4 params/4
typedef struct _FPO_DATA { DWORD ulOffStart; DWORD cbProcSize; DWORD cdwLocals; WORD cdwParams; WORD WORD WORD WORD WORD WORD } FPO_DATA; cbProlog cbRegs fHasSEH fUseBP reserved cbFrame : : : : : :
# bytes in prolog # regs saved TRUE if SEH in func TRUE if EBP has been allocated reserved for future use frame type
In a .drectve section, if the hyphen preceding an option is followed by a question mark (for example, -?export), and the option is not recognized as a valid directive, the linker must ignore it. This allows compilers and linkers to add new directives while maintaining compatibility with existing linkers, as long as the new directives are not required for the correct linking of the application. For example, if the directive enables a link-time optimization, it is acceptable if some linkers cannot recognize it.
When another image file imports a symbol by name, the Name Pointer Table is searched for a matching string. If one is found, the associated ordinal is then determined by looking at the corresponding member in the Ordinal Table (that is, the member of the Ordinal Table with the same index as the string pointer found in the Name Pointer Table). The resulting ordinal is an index into the Export Address Table, which gives the actual location of the desired symbol. Every export symbol can be accessed by an ordinal.
Direct use of an ordinal is therefore more efficient, because it avoids the need to search the Name Pointer Table for a matching string. However, use of an export name is more mnemonic and does not require the user to know the table index for the symbol.
20 24
4 4
Address Table Entries Number of Name Pointers Export Address Table RVA Name Pointer RVA
28 32
4 4
36
and length indicated in the Optional Header), the field is an Export RVA: an actual address in code or data. Otherwise, the field is a Forwarder RVA, which names a symbol in another DLL. Offset 0 Size 4 Field Export RVA Description Address of the exported symbol when loaded into memory, relative to the image base. For example, the address of an exported function. Pointer to a null-terminated ASCII string in the export section, giving the DLL name and the name of the export (for example, MYDLL.expfunc) or the DLL name and an export (for example, MYDLL.#27).
Forwarder RVA
A Forwarder RVA exports a definition from some other image, making it appear as if it were being exported by the current image. Thus the symbol is simultaneously imported and exported. For example, in KERNEL32.DLL in Windows NT, the export named HeapAlloc is forwarded to the string NTDLL.RtlAllocateHeap. This allows applications to use the Windows NT-specific module NTDLL.DLL without actually containing import references to it. The applications import table references only KERNEL32.DLL. Therefore, the application is not specific to Windows NT and can run on any Win32 system.
Null
Null
Null
Hint-Name Table
4 8 12
4 4 4
16
30 0 / 62 0 30 0 / 62 0
31 / 63
Ordinal Number
31 / 63
In a PE32 image, the lower 31 bits can be masked as 0x7FFFFFFF. In either case, the resulting number is a 32-bit integer or pointer in which the high bit is always zero (zero extension to 32 bits). Similarly for a PE32+ image, the lower 63 bits can be masked as 0x7FFFFFFFFFFFFFFF.
variable
Name
0 or 1
Pad
16
For the ARM, PowerPC, SH3 and SH4 WindowsCE platforms, this function table entry format is used: Offset 0 4 4 4 4 Size 4 8 bits 22 bits 1 bit 1 bit Field Begin Address Prolog Length Function Length 32-bit Flag Exception Flag Description Virtual address of the corresponding function. Number of instructions in the functions prolog. Number of instructions in the function. Set if the function is comprised of 32-bit instructions, cleared for a 16-bit function. Set if an exception handler exists for the function.
Finally, for ALPHA64 the pdata entry format is as follows: Offset 0 8 16 24 32 Size 8 8 8 8 8 Field Begin Address End Address Exception Handler Handler Data Prolog End Address Description Virtual address of the corresponding function. Virtual address of the end of the function. Pointer to the exception handler to be executed. Pointer to additional information to be passed to the handler. Virtual address of the end of the functions prolog.
Block Size
The Block Size field is then followed by any number of Type/Offset entries. Each entry is a word (2 bytes) and has the following structure: Offset 0 Size 4 bits Field Type Description Stored in high 4 bits of word. Value indicating which type of fixup is to be applied. These fixups are described in Fixup Types. Stored in remaining 12 bits of word. Offset from starting address specified in the Page RVA field for the block. This offset specifies where the fixup is to be applied.
12 bits
Offset
To apply a fixup, a delta is calculated as the difference between the preferred base address, and the base where the image is actually loaded. If the image is loaded at its preferred base, the delta would be zero, and thus the fixups would not have to be applied.
Value 0 1
Description The fixup is skipped. This type can be used to pad a block. The fixup adds the high 16 bits of the delta to the 16-bit field at Offset. The 16-bit field represents the high value of a 32-bit word. The fixup adds the low 16 bits of the delta to the 16-bit field at Offset. The 16-bit field represents the low half of a 32-bit word. The fixup applies the delta to the 32-bit field at Offset.
IMAGE_REL_BASED_HIGH
IMAGE_REL_BASED_LOW
IMAGE_REL_BASED_HIGHLOW
IMAGE_REL_BASED_HIGHADJ
The fixup adds the high 16 bits of the delta to the 16-bit field at Offset. The 16-bit field represents the high value of a 32-bit word. The low 16 bits of the 32-bit value are stored in the 16-bit word that follows this base relocation. This means that this base relocation occupies two slots. Fixup applies to a MIPS jump instruction. Reserved for future use Reserved for future use Fixup applies to a MIPS16 jump instruction. This fixup applies the delta to the 64-bit field at Offset The fixup adds the high 16 bits of the delta to the 16-bit field at Offset. The 16-bit field represents the high value of a 48-bit word. The low 32 bits of the 48-bit value are stored in the 32-bit word that follows this base relocation. This means that this base relocation occupies three slots.
5 6 7 9 10 11
IMAGE_REL_BASED_HIGH3ADJ
To support this programming construct, the PE/COFF .tls section specifies the following information: initialization data, callback routines for per-thread initialization and termination, and the TLS index explained in the following discussion. Note Statically declared TLS data objects can be used only in statically loaded image files. This fact makes it unreliable to use static TLS data in a DLL unless you know that the DLL, or anything statically linked with it, will never be loaded dynamically with the LoadLibrary API function. Executable code accesses a static TLS data object through the following steps:
1. At link time, the linker sets the Address of Index field of the TLS Directory. This field points to a location where the program will expect to receive the TLS index. The Microsoft run-time library facilitates this process by defining a memory image of the TLS Directory and giving it the special name __tls_used (Intel x86 platforms) or _tls_used (other platforms). The linker looks for this memory image and uses the data there to create the TLS Directory. Other compilers that support TLS and work with the Microsoft linker must use this same technique. 2. When a thread is created, the loader communicates the address of the threads TLS array by placing the address of the Thread Environment Block (TEB) in the FS register. A pointer to the TLS array is at the offset of 0x2C from the beginning of TEB. This behavior is Intel x86 specific. 3. The loader assigns the value of the TLS index to the place indicated by the Address of Index field. 4. The executable code retrieves the TLS index and also the location of the TLS array.
5. The code uses the TLS index and the TLS array location (multiplying the index by four and using it as an offset to the array) to get the address of the TLS data area for the given program and module. Each thread has its own TLS data area, but this is transparent to the program, which doesnt need to know how data is allocated for individual threads. 6. An individual TLS data object is accessed as some fixed offset into the TLS data area.
The TLS array is an array of addresses that the system maintains for each thread. Each address in this array gives the location of TLS data for a given module (.EXE or DLL) within the program. The TLS index indicates which member of the array to use. (The index is a number, meaningful only to the system that identifies the module).
Size
(PE32/PE32 +)
Field
Description
4/8
Starting address of the TLS template. The template is a block of data used to initialize TLS data. The system copies all this data each time a thread is created, so it must not be corrupted. Note that this address is not an RVA; it is an address for which there should be a base relocation in the .reloc section. Address of the last byte of the TLS, except for the zero fill. As with the Raw Data Start VA, this is a virtual address, not an RVA.
4/8
4/8
8/16
4/8
Address of Index
Location to receive the TLS index, which the loader assigns. This location is in an ordinary data section, so it can be given a symbolic name accessible to the program. Pointer to an array of TLS callback functions. The array is null-terminated, so if there is no callback function supported, this field points to four bytes set to zero. The prototype for these functions is given below, in TLS Callback Functions. The size in bytes of the template, beyond the initialized data delimited by Raw Data Start VA and Raw Data End VA. The total template size should be the same as the total size of TLS data in the image file. The zero fill is the amount of data that comes after the initialized nonzero data. Reserved for possible future use by TLS flags.
12/24
4/8
Address of Callbacks
16/32
20/36
Characteristics
The Reserved parameter should be left set to 0. The Reason parameter can take the following values: Setting
DLL_PROCESS_ATTACH DLL_THREAD_ATTACH
Value 1 2 3 0
Description New process has started, including the first thread. New thread has been created (this notification sent for all but the first thread). Thread is about to be terminated (this notification sent for all but the first thread). Process is about to terminate, including the original thread.
DLL_THREAD_DETACH
DLL_PROCESS_DETACH
A series of Resource Directory Tables relate all the levels in the following way: each directory table is followed by a series of directory entries, which give the name or ID for that level (Type, Name, or Language level) and an address of either a data description or another directory table. If a data description is pointed to, then the data is a leaf in the tree. If another directory table is pointed to, then that table lists directory entries at the next level down. A leafs Type, Name, and Language IDs are determined by the path taken, through directory tables, to reach the leaf. The first table determines Type ID, the second table (pointed to by the directory entry in the first table) determines Name ID, and the third table determines Language ID. The general structure of the .rsrc section is: Data Resource Directory Tables (and Resource Directory Entries) Description A series of tables, one for each group of nodes in the tree. All top-level (Type) nodes are listed in the first table. Entries in this table point to second-level tables. Each second-level tree has the same Type identifier but different Name identifiers. Third-level trees have the same Type and Name identifiers but different Language identifiers. Each individual table is immediately followed by directory entries, in which each entry has: 1) a name or numeric identifier, and 2) a pointer to a data description or a table at the next lower level.
Two-byte-aligned Unicode strings, which serve as string data pointed to by directory entries. An array of records, pointed to by tables, which describe the actual size and location of the resource data. These records are the leaves in the resource-description tree. Raw data of the resource section. The size and location information in the Resource Data Descriptions delimit the individual regions of resource data.
Resource Data
14
Number of ID Entries
0 4 4
4 4 4
32-bit integer that identifies Type, Name, or Language. High bit 0. Address of a Resource Data Entry (a leaf). High bit 1. Lower 31 bits are the address of another Resource Directory Table (the next level down).
12
9 9
9 9
1 2
10090009 20090009
When this data is encoded, a dump of the PE/COFF Resource Directory results in the following output:
Offset Data 0000: 00000000 00000000 00000000 00030000 (3 entries in this directory) 0010: 00000001 80000028 (TypeId #1, Subdirectory at offset 0x28) 0018: 00000002 80000050 (TypeId #2, Subdirectory at offset 0x50) 0020: 00000009 80000080 (TypeId #9, Subdirectory at offset 0x80) 0028: 00000000 00000000 00000000 00030000 (3 entries in this directory) 0038: 00000001 800000A0 (NameId #1, Subdirectory at offset 0xA0) 0040: 00000002 00000108 (NameId #2, data desc at offset 0x108) 0048: 00000003 00000118 (NameId #3, data desc at offset 0x118) 0050: 00000000 00000000 00000000 00040000 (4 entries in this directory) 0060: 00000001 00000128 (NameId #1, data desc at offset 0x128) 0068: 00000002 00000138 (NameId #2, data desc at offset 0x138) 0070: 00000003 00000148 (NameId #3, data desc at offset 0x148) 0078: 00000004 00000158 (NameId #4, data desc at offset 0x158) 0080: 00000000 00000000 00000000 00020000 (2 entries in this directory) 0090: 00000001 00000168 (NameId #1, data desc at offset 0x168) 0098: 00000009 800000C0 (NameId #9, Subdirectory at offset 0xC0) 00A0: 00000000 00000000 00000000 00020000 (2 entries in this directory) 00B0: 00000000 000000E8 (Language ID 0, data desc at offset 0xE8 00B8: 00000001 000000F8 (Language ID 1, data desc at offset 0xF8 00C0: 00000000 00000000 00000000 00030000 (3 entries in this directory) 00D0: 00000001 00000178 (Language ID 0, data desc at offset 0x178 00D8: 00000001 00000188 (Language ID 1, data desc at offset 0x188 00E0: 00000001 00000198 (Language ID 2, data desc at offset 0x198 00E8: 000001A8 (At offset 0x1A8, for TypeId #1, NameId #1, Language id #0 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved) 00F8: 000001AC (At offset 0x1AC, for TypeId #1, NameId #1, Language id #1 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved) 0108: 000001B0 (At offset 0x1B0, for TypeId #1, NameId #2, 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved) 0118: 000001B4 (At offset 0x1B4, for TypeId #1, NameId #3, 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved) 0128: 000001B8 (At offset 0x1B8, for TypeId #2, NameId #1, 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved) 0138: 000001BC (At offset 0x1BC, for TypeId #2, NameId #2, 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved) 0148: 000001C0 (At offset 0x1C0, for TypeId #2, NameId #3, 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved) 0158: 000001C4 (At offset 0x1C4, for TypeId #2, NameId #4, 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved) 0168: 000001C8 (At offset 0x1C8, for TypeId #9, NameId #1, 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved) 0178: 000001CC (At offset 0x1CC, for TypeId #9, NameId #9, Language id #0 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved) 0188: 000001D0 (At offset 0x1D0, for TypeId #9, NameId #9,
Language id #1 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved) 0198: 000001D4 (At offset 0x1D4, for TypeId #9, NameId #9, Language id #2 00000004 (4 bytes of data) 00000000 (codepage) 00000000 (reserved)
2 3
An archive member header precedes each member. The following illustration shows the general structure of an archive: Signature :!<arch>\n
Header
Longnames Member
16
12
Date
Date and time the archive member was created: ASCII decimal representation of the number of seconds since 1/1/1970 UCT. ASCII decimal representation of the user ID. ASCII group representation of the group ID. ASCII octal representation of the members file mode. ASCII decimal representation of the total size of the archive member, not including the size of the header. The two bytes in the C string \n.
28 34 40 48
6 6 8 10
58
End of Header
The Name field has one of the formats shown in the following table. As mentioned above, each of these strings is left justified and padded with trailing spaces within a field of 16 bytes: Contents of Name Field Name/ / // Description The field gives the name of the archive member directly. The archive member is one of the two linker members. Both of the linker members have this name. The archive member is the longname member, which consists of a series of null-terminated ASCII strings. The longnames member is the third archive member, and must always be present even if the contents are empty. The name of the archive member is located at offset n within the longnames member. The number n is the decimal representation of the offset. For example: \26 indicates that the name of the archive member is located 26 bytes beyond the beginning of longnames member contents.
4*n
Offsets
Array of file offsets to archive member headers, in which n is equal to Number of Symbols. Each number in the array is an unsigned long stored in big-endian format. For each symbol named in the String Table, the corresponding element in the Offsets array gives the location of the archive member that contains the symbol. Series of null-terminated strings that name all the symbols in the directory. Each string begins immediately after the null character in the previous string. The number of strings must be equal to the value of the Number of Symbols fields.
String Table
The elements in the Offsets array must be arranged in ascending order. This fact implies that the symbols listed in the String Table must be arranged according to the order of archive members. For example, all the symbols in the first object-file member would have to be listed before the symbols in the second object file.
Number of Symbols
2*n
Indices
Array of 1-based indices (unsigned short) which map symbol names to archive member offsets. The number n is equal to Number of Symbols. For each symbol named in the String Table, the corresponding element in the Indices array gives an index into the Offsets array. The Offsets array, in turn, gives the location of the archive member that contains the symbol. Series of null-terminated strings that name all the symbols in the directory. Each string begins immediately after the null byte in the previous string. The number of strings must be equal to the value of the Number of Symbols fields. This table lists all the symbol names in ascending lexical order.
String Table
Archive member header Import header Null-terminated import name string Null-terminated DLL name string This is sufficient information to accurately reconstruct the entire contents of the member at the time of its use.
2 4 6
2 2 2
Number identifying type of target machine. See Section 3.3.1, Machine Types, for more information. Time and date the file was created. Size of the strings following the header. Either the ordinal or the hint for the import, determined by the value in the Name Type field. The import type. See Section 8.2 Import Type for specific values and descriptions. The Import Name Type. See Section 8.3. Import Name Type for specific values and descriptions. Reserved. Must be zero.
8 12 16
4 4 2
18
2 bits 3 bits
11 bits
Reserved
This structure is followed by two null-terminated strings describing the imported symbols name, and the DLL from which it came.
Value 0 1
IMPORT_CONST
These values are used to determine which section contributions must be generated by the tool using the library if it must access that data.
Value 0
Description The import is by ordinal. This indicates that the value in the Ordinal/Hint field of the Import Header is the imports ordinal. If this constant is not specified, then the Ordinal/Hint field should always be interpreted as the imports hint. The import name is identical to the public symbol name. The import name is the public symbol name, but skipping the leading ?, @, or optionally _. The import name is the public symbol name, but skipping the leading ?, @, or optionally _, and truncating at the first @.
IMPORT_NAME
1 2 3
IMPORT_NAME_NOPREFIX
IMPORT_NAME_UNDECORATE
The commands used to compile HELLO.C (with debug information) and generate this example were the following (the -Gy option to the compiler is used, which causes each procedure to be generated as a separate COMDAT section):
cl -c -Zi -Gy hello2.c link -dump -all hello2.obj >hello2.dmp
Here is the resulting file HELLO2.DMP: (The reader is encouraged to experiment with various other examples, in order to clarify the concepts described in this specification.)
Dump of file hello2.obj File Type: COFF OBJECT FILE HEADER VALUES
machine (i386) number of sections time date stamp Sat Oct 04 17:37:43 1997 file pointer to symbol table number of symbols size of optional header characteristics
SECTION HEADER #1 .drectve name 0 physical address 0 virtual address 26 size of raw data 12C file pointer to raw data 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 100A00 flags Info Remove 1 byte align RAW DATA #1 00000000 2D 64 65 66 61 75 6C 74 | 6C 69 62 3A 4C 49 42 43 -default|lib:LIBC 00000010 20 2D 64 65 66 61 75 6C | 74 6C 69 62 3A 4F 4C 44 -defaul|tlib:OLD 00000020 4E 41 4D 45 53 20 NAMES Linker Directives -----------------defaultlib:LIBC -defaultlib:OLDNAMES SECTION HEADER #2 .debug$S name 0 physical address 0 virtual address 5C size of raw data 152 file pointer to raw data 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 42100048 flags No Pad Initialized Data Discardable 1 byte align Read Only RAW DATA #2 00000000 02 00000010 6C 00000020 4D 00000030 2D 00000040 69 00000050 65 00 6F 69 62 7A 72 00 32 63 69 69 73 00 2E 72 74 6E 69 11 6F 6F 20 67 6F 00 62 73 43 20 6E 09 6A 6F 2F 43 20 00 43 66 43 6F 31 | | | | | | 00 00 74 2B 6D 31 00 01 20 2B 70 2E 00 00 28 20 69 30 00 05 52 4F 6C 30 0A 00 29 70 65 68 00 20 74 72 65 00 33 69 20 6C 3C 32 6D 56 ........|.....hel lo2.objC|.......< Microsof|t (R) 32 -bit C/C|++ Optim izing Co|mpiler V ersion 1|1.00
SECTION HEADER #3 .text name 0 physical address 0 virtual address A size of raw data 1AE file pointer to raw data 1B8 file pointer to relocation table 1C2 file pointer to line numbers 1 number of relocations 3 number of line numbers 60501020 flags Code Communal; sym= _main 16 byte align Execute Read RAW DATA #3
00000000
LINENUMBERS #3 Symbol index: 8 Base line number: Symbol name = _main 00000003( 3) 00000008( 4) SECTION HEADER #4 .debug$S name 0 physical address 0 virtual address 30 size of raw data 1D4 file pointer to raw data 204 file pointer to relocation table 0 file pointer to line numbers 2 number of relocations 0 number of line numbers 42101048 flags No Pad Initialized Data Communal (no symbol) Discardable 1 byte align Read Only RAW DATA #4 00000000 2A 00 0B 10 00 00 00 00 | 00 00 00 00 00 00 00 00 *.......|........ 00000010 0A 00 00 00 03 00 00 00 | 08 00 00 00 01 10 00 00 ........|........ 00000020 00 00 00 00 00 00 01 04 | 6D 61 69 6E 02 00 06 00 ........|main.... RELOCATIONS #4 Offset -------00000020 00000024 Type ---------------SECREL SECTION Applied To ----------------00000000 0000 Symbol Index -------8 8 Symbol Name -----_main _main 2
SECTION HEADER #5 .text name 0 physical address 0 virtual address 5 size of raw data 218 file pointer to raw data 0 file pointer to relocation table 21D file pointer to line numbers 0 number of relocations 2 number of line numbers 60501020 flags Code Communal; sym= _foo 16 byte align Execute Read RAW DATA #5 00000000 55 8B EC 5D C3 LINENUMBERS #5 Symbol index: Symbol name = _foo 00000003( 8) 13 Base line number: 7 U].
SECTION HEADER #6 .debug$S name 0 physical address 0 virtual address 2F size of raw data 229 file pointer to raw data
258 0 2 0 42101048
file pointer to relocation table file pointer to line numbers number of relocations number of line numbers flags No Pad Initialized Data Communal (no symbol) Discardable 1 byte align Read Only
RAW DATA #6 00000000 29 00 0B 10 00 00 00 00 | 00 00 00 00 00 00 00 00 ).......|........ 00000010 05 00 00 00 03 00 00 00 | 03 00 00 00 01 10 00 00 ........|........ 00000020 00 00 00 00 00 00 01 03 | 66 6F 6F 02 00 06 00 ........|foo.... RELOCATIONS #6 Offset -------00000020 00000024 Type ---------------SECREL SECTION Applied To ----------------00000000 0000 Symbol Index -------13 13 Symbol Name -----_foo _foo
SECTION HEADER #7 .debug$T name 0 physical address 0 virtual address 34 size of raw data 26C file pointer to raw data 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 42100048 flags No Pad Initialized Data Discardable 1 byte align Read Only RAW DATA #7 00000000 02 00000010 22 00000020 35 00000030 70 00 65 30 64 00 3A 5C 62 00 2E 00 16 00 | 33 E1 36 34 01 00 00 00 ........|364.... 5C 62 62 74 5C | 74 6F 6F 6C 73 5C 76 63 "e:\bbt\|tools\vc 62 69 6E 5C 78 | 38 36 5C 76 63 35 30 2E 50\bin\x|86\vc50. F1 pdb.
COFF SYMBOL TABLE 000 00000000 DEBUG notype Filename | .file hello2.c 002 00000000 SECT1 notype Static | .drectve Section length 26, #relocs 0, #linenums 0, checksum 0 004 00000000 SECT2 notype Static | .debug$S Section length 5C, #relocs 0, #linenums 0, checksum 0 006 00000000 SECT3 notype Static | .text Section length A, #relocs 1, #linenums 3, checksum 0, selection (pick no duplicates) 008 00000000 SECT3 notype () External | _main tag index 0000000A size 0000000A lines 000001C2 next function 00000013 00A 00000000 SECT3 notype BeginFunction | .bf line# 0002 end 00000015 00C 00000003 SECT3 notype .bf or.ef | .lf 00D 0000000A SECT3 notype EndFunction | .ef line# 0004 00F 00000000 SECT4 notype Static | .debug$S Section length 30, #relocs 2, #linenums 0, checksum 0, selection (pick associative Section 3) 011 00000000 SECT5 notype Static | .text Section length 5, #relocs 0, #linenums 2, checksum 0, selection (pick no duplicates) 013 00000000 SECT5 notype () External | _foo tag index 00000015 size 00000005 lines 0000021D next function 00000000 015 00000000 SECT5 notype BeginFunction | .bf line# 0007 end 00000000 017 00000002 SECT5 notype .bf or.ef | .lf
5 1
018 00000005 SECT5 notype EndFunction | .ef line# 0008 01A 00000000 SECT6 notype Static | .debug$S Section length 2F, #relocs 2, #linenums 0, checksum (pick associative Section 5) 01C 00000000 SECT7 notype Static | .debug$T Section length 34, #relocs 0, #linenums 0, checksum String Table Size = 0x0 bytes Summary BB 34 26 F .debug$S .debug$T .drectve .text
0, selection 0
00000360 00000370 00000380 00000390 000003a0 000003b0 000003c0 000003d0 000003e0 000003f0 00000400 00000410 00000420 00000430 00000440 00000450 00000460 00000470 00000480 00000490 000004a0 000004b0
03 00 03 00 04 65 30 00 00 00 00 1d 00 07 66 2e 65 00 06 00 00 00
00 00 00 00 00 62 00 00 00 00 00 02 00 00 00 65 01 00 00 00 00 00
00 15 00 0a 00 75 00 2e 03 01 05 00 00 00 00 66 00 00 00 05 00 00
00 00 00 00 00 67 00 74 01 00 00 00 00 00 00 00 00 00 00 00 00 00
65 00 03 00 00 24 02 65 05 00 20 00 00 00 00 00 00 2e 03 05 07 00
01 00 00 00 00 53 00 78 00 00 00 00 00 00 00 00 00 64 01 00 00 00
00 00 00 03 00 00 00 74 00 5f 02 00 05 00 02 00 08 65 2f 00 00 00
00 00 00 00 00 00 00 00 00 66 01 00 00 00 00 00 00 62 00 00 00 00
00 2e 65 00 00 00 00 00 00 6f 15 00 00 00 00 05 00 75 00 2e 03 00
00 6c 00 00 00 00 00 00 00 6f 00 00 00 00 00 00 00 67 00 64 01 00
02 66 2e 65 00 04 00 00 02 00 00 2e 65 00 05 00 00 24 02 65 34 00
00 00 65 01 00 00 00 00 00 00 00 62 01 00 00 00 00 53 00 62 00 00
00 00 66 00 00 00 03 00 00 00 05 66 00 00 00 05 00 00 00 75 00 04
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 00 00
00 00 00 00 2e 03 05 05 00 00 00 00 00 2e 65 00 00 00 00 24 00 00
00 00 00 00 64 01 00 00 00 00 00 00 00 6c 00 00 00 00 00 54 00 00
....e........... .........lf..... ........e..ef... ..........e..... ...............d ebug$S.......... 0............... ...text......... ................ ......_foo...... .... ........... ...........bf... ..........e..... ...............l f.............e. .ef............. e............... .....debug$S.... ....../......... .........debug$T ..........4..... ................
2. Debug information - Debug information may generally be considered advisory (to debuggers) and does not effect the actual integrity of the executable program. It is quite literally possible to remove debug information from an image after a product has been delivered and not effect the functionality of the program. This is, in fact, a disk saving measure that is sometimes utilized. If you do not want to include debug information in your message digest, then you should not include the following information in your message digest calculation: The Debug entry of the Data Directory in with optional header. The .debug section
3. File Checksum field of the Windows NT-Specific Fields of the Optional Header - This checksum includes the entire file (including any attribute certificates included in the file) and will, in all likelihood, be different after inserting your certificate than when you were originally calculating a message digest to include in your certificate. 4. Unused, or obsolete fields - There are several fields that are either unused or obsolete. The value of these fields is undefined and may change after you calculate your message digest. These fields include: Reserved field of the Optional Header Windows NT-Specific Fields (offset 52). The DLL Flags field of the Optional Header Windows NT-Specific Fields. This field is obsolete. Loader Flags field of the Optional Header Windows NT-Specific Fields. This field is obsolete. Reserved entries of the Data Directory in the object header.
5. Resources (makes localization easier) - depending upon the specifics of your Attribute Certificate, it may be desirable or undesirable to include resources in the message digest. If you want to allow localization without the generation of new certificates, then you do not want to include resources in your message digest. If the values of the resources are critical to your application, then you probably do want them included in your message digest, and you will accept the overhead of generating a certificate for each localized copy of the image. If you
do not want to include resources in your message digest, then you should not include the following information in the message digest calculation: Resource Table entry of the Optional Header Data Directory. The .rsrc section.