15. TE Image
15.1. Introduction
The Terse Executable (TE) image format was created as a mechanism to reduce the overhead of the PE/COFF headers in PE32/PE32+ images, resulting in a corresponding reduction of image sizes for executables running in the PI Architecture environment. Reducing image size provides an opportunity for use of a smaller system flash part.
TE images, both drivers and applications, are created as PE32 (or PE32+) executables. PE32 is a generic executable image format that is intended to support multiple target systems, processors, and operating systems. As a result, the headers in the image contain information that is not necessarily applicable to all target systems. In an effort to reduce image size, a new executable image header (TE) was created that includes only those fields from the PE/COFF headers required for execution under the PI Architecture. Since this header contains the information required for execution of the image, it can replace the PE/COFF headers from the original image. This specification defines the TE header, the fields in the header, and how they are used in the PI Architecture’s execution environment.
15.2. PE32 Headers
A PE file header, as described in the Microsoft Portable Executable and Common Object File Format Specification, contains an MS-DOS* stub, a PE signature, a COFF header, an optional header, and section headers. For successful execution, PEIMs in the PI Architecture require very little of the data from these headers, and in fact the MS-DOS stub and PE signature are not required at all.
See Table 15.1 and Table 15.2 below for the necessary fields and their descriptions.
COFF Header |
Description |
---|---|
Machine |
Target machine identifier 2 bytes in both COFF header and TE header |
NumberOfSections |
Number of sections section headers 2 bytes in COFF header 1 byte in TE header |
OPTIONAL Header |
Description |
---|---|
AddressOfEntryPoint |
Address of entry point relative to image base 4 bytes in both optional header and TE header |
BaseOfCode |
Offset from image base to the start of the code section 4 bytes in both optional header and TE header |
ImageBase |
Image s linked address 4 bytes in OptionalHeader32 8 bytes in OptionalHeader64 and 8 bytes in TE header |
Subsystem |
Subsystem required to run the image 2 bytes in optional header 1 byte in TE header |
15.2.1. TE Header
Summary
To reduce the overhead of PE/COFF headers in the PI Architecture’s environment, a minimal (TE) header can be defined that includes only those fields required for execution in the PI Architecture. This header can then be used to replace the original headers at the start of the original image.
Prototype
typedef struct {
UINT16 Signature;
UINT16 Machine;
UINT8 NumberOfSections;
UINT8 Subsystem;
UINT16 StrippedSize;
UINT32 AddressOfEntryPoint;
UINT32 BaseOfCode;
UINT64 ImageBase;
EFI_IMAGE_DATA_DIRECTORY DataDirectory[2];
} EFI_TE_IMAGE_HEADER;
Parameters
Signature
TE image signature
Machine
Target machine, as specified in the original image’s file header
NumberOfSections
Number of sections, as specified in the original image’s file header
Subsystem
Target subsystem, as specified in the original optional header
StrippedSize
Number of bytes removed from the base of the original image
AddressOfEntryPoint
Address of the entry point to the driver, as specified in the original image’s optional header
BaseOfCode
Base of the code, as specified in the original image’s optional header
ImageBase
Image base, as specified in the original image’s optional header (0-extended to 64-bits for PE32 images)
DataDirectory
Directory entries for base relocations and the debug directory from the original image’s corresponding directory entries. See “Related Definitions” below.
Field Descrptions
In the EFI_TE_IMAGE HEADER
, the Machine,
NumberOfSections
, Subsystem ``,``AddressOfEntryPoint
,
BaseOfCode
, and ImageBase
all come directly from the
original PE headers to enable partial reconstitution of the
original headers if necessary.
The 2-byte Signature
should be set to
EFI_TE_IMAGE_HEADER_SIGNATURE
to designate the image as
TE, as opposed to the “MZ” signature at the start of
standard PE/COFF images.
The StrippedSize
should be set to the number of bytes
removed from the start of the original image, which will
typically include the MS-DOS, COFF, and optional headers, as
well as the section headers. This size can be used by image
loaders and tools to make appropriate adjustments to the
other fields in the TE image header. Note that
StrippedSize
does not take into account the size of the TE
image header that will be added to the image. That is to
say, the delta in the total image size when converted to TE
is StrippedSize
- sizeof (EFI_TE_IMAGE_HEADER
). This
will typically need to be taken into account by tools using
the fields in the TE header.
The DataDirectory
array contents are copied directly from
the base relocations and debug directory entries in the
original optional header data directories. This image format
also assumes that file alignment is equal to section
alignment.
//*****************************************************
//EFI_IMAGE_DATA_DIRECTORY
//*****************************************************
typedef struct {
UINT32 VirtualAddress;
UINT32 Size;
} EFI_IMAGE_DATA_DIRECTORY;
#define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC 0
#define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG 1
#define EFI_TE_IMAGE_HEADER_SIGNATURE 0x5A56 // “VZ”