
Appendix
Appendix 1a : Description of the DOS EXE BFF
MZ EXE Format
Intel byte order
Information from File Format List 2.0 by Max Maischein.
This file has been authored in the style of the INTERxxy.* file list
by Ralf Brown, and uses almost the same format.
Please read the file FILEFMTS.1ST before asking me any questions. You may find
that they have already been addressed.
Max Maischein
Max Maischein, 2:244/1106.17
Max_Maischein@spam.fido.de
corion@informatik.uni-frankfurt.de
Corion on #coders@IRC
--------!-DISCLAIMER------------------------
DISCLAIMER: THIS MATERIAL IS PROVIDED "AS IS". I verify the information
contained in this list to the best of my ability, but I cannot be held
responsible for any problems caused by use or misuse of the information,
especially for those file formats foreign to the PC, like AMIGA or SUN file
formats. If an information it is marked "guesswork" or undocumented, you
should check it carefully to make sure your program will not break with
an unexpected value (and please let me know whether or not it works
the same way).
Information marked with "???" is known to be incomplete or guesswork.
Some file formats were not released by their creators, others are regarded
as proprietary, which means that if your programs deal with them, you might
be looking for trouble. I don't care about this.
--------------------------------------------
The old EXE files are the EXE files executed directly by MS-DOS. They were a
major improvement over the old 64K COM files, since EXE files can span multiple
segments. An EXE file consists of three different parts, the header, the
relocation table and the binary code.
The header is expanded by a lot of programs to store their copyright information
in the executable, some extensions are documented below.
The format of the header is as follows :
OFFSET Count TYPE Description
0000h 2 char ID='MZ'
ID='ZM'
0002h 1 word Number of bytes in last 512-byte page
of executable
0004h 1 word Total number of 512-byte pages in executable
(including the last page)
0006h 1 word Number of relocation entries
0008h 1 word Header size in paragraphs
000Ah 1 word Minimum paragraphs of memory allocated in
addition to the code size
000Ch 1 word Maximum number of paragraphs allocated in
addition to the code size
000Eh 1 word Initial SS relative to start of executable
0010h 1 word Initial SP
0012h 1 word Checksum (or 0) of executable
0014h 1 dword CS:IP relative to start of executable
(entry point)
0018h 1 word Offset of relocation table;
40h for new-(NE,LE,LX,W3,PE etc.) executable
001Ah 1 word Overlay number (0h = main program)
Following are the header expansions by some other prorams like TLink, LZExe and
other linkers, encryptors and compressors; all offsets are relative to the start
of the whole header :
---new executable
OFFSET Count TYPE Description
001Ch 4 byte ????
0020h 1 word Behaviour bits ??
0022h 26 byte reserved (0)
003Ch 1 dword Offset of new executable header from start of
file (or 0 if plain MZ executable)
---Borland TLINK
OFFSET Count TYPE Description
001Ch 2 byte ?? (apparently always 01h 00h)
001Eh 1 byte ID=0FBh
001Fh 1 byte TLink version, major in high nybble
0020h 2 byte ??
---old ARJ self-extracting archive
OFFSET Count TYPE Description
001Ch 4 char ID='RJSX' (older versions)
new signature is 'aRJsf'" in the first 1000
bytes of the file)
---LZEXE compressed executable
OFFSET Count TYPE Description
001Ch 2 char ID='LZ'
001Eh 2 char Version number :
'09' - LZExe 0.90
'91' - LZExe 0.91
---PKLITE compressed executable
OFFSET Count TYPE Description
001Ch 1 byte Minor version number
001Dh 1 byte Bit mapped :
0-3 - major version
4 - Extra compression
5 - Multi-segment file
001Eh 6 char ID='PKLITE'
---LHarc 1.x self-extracting archive
OFFSET Count TYPE Description
001Ch 4 byte unused???
0020h 3 byte Jump to start of extraction code
0023h 2 byte ???
0025h 12 char ID='LHarc's SFX '
--LHA 2.x self-extracting archive
OFFSET Count TYPE Description
001Ch 8 byte ???
0024h 10 char ID='LHa's SFX '
For version 2.10
ID='LHA's SFX ' (v2.13)
For version 2.13
---LH self-extracting archive
OFFSET Count TYPE Description
001Ch 8 byte ???
0024h 8 byte ID='LH's SFX '
---TopSpeed C 3.0 CRUNCH compressed file
OFFSET Count TYPE Description
001Ch 1 dword ID=018A0001h
0020h 1 word ID=1565h
---PKARC 3.5 self-extracting archive
OFFSET Count TYPE Description
001Ch 1 dword ID=00020001h
0020h 1 word ID=0700h
---BSA (Soviet archiver) self-extracting archive
OFFSET Count TYPE Description
001Ch 1 word ID=000Fh
001Eh 1 byte ID=A7h
---LARC self-extracting archive
OFFSET Count TYPE Description
001Ch 4 byte ???
0020h 11 byte ID='SFX by LARC '
After the header, there follow the relocation items, which are used to span
multpile segments. The relocation items have the following format :
OFFSET Count TYPE Description
0000h 1 word Offset within segment
0002h 1 word Segment of relocation
To get the position of the relocation within the file, you have to compute the
physical adress from the segment:offset pair, which is done by multiplying the
segment by 16 and adding the offset and then adding the offset of the binary
start. Note that the raw binary code starts on a paragraph boundary within the
executable file. All segments are relative to the start of the executable in
memory, and this value must be added to every segment if relocation is done
manually.
EXTENSION:EXE,OVR,OVL
OCCURENCES:PC
PROGRAMS:MS-DOS
REFERENCE:Ralf Brown's Interrupt List
SEE ALSO:COM,EXE,NE EXE
Appendix 1b : Description of the Windows NE BFF
PSS ID Number: Q65122
Article last modified on 02-15-1996
3.00 3.10
WINDOWS
----------------------------------------------------------------------
The information in this article applies to:
- Microsoft Windows Software Development Kit (SDK) for Windows
versions 3.0 and 3.1
----------------------------------------------------------------------
SUMMARY
=======
This article is part of a set of articles, collectively called the "Windows
Developer's Notes." More information about the contents of the other
articles can be found in the Microsoft Knowledge Base article:
ARTICLE-ID: Q65260
TITLE : The Windows Developer's Notes
Download EXEFMT.EXE, a self-extracting file, from the Microsoft Software
Library (MSL) on the following services:
- Microsoft Download Service (MSDL)
Dial (206) 936-6735 to connect to MSDL
Download EXEFMT.EXE
- Internet (anonymous FTP)
ftp ftp.microsoft.com
Change to the \SOFTLIB\MSLFILES directory
Get EXEFMT.EXE
MORE INFORMATION
================
Microsoft defined the segmented executable file format for Windows
applications and dynamic-link libraries (DLLs). This file format is also
referred to as the New Executable Format. This new format is an extension
of the existing MS-DOS .EXE format (old-style format). The purpose of the
segmented executable format is to provide the information needed to support
the dynamic linking and segmentation capabilities of the Windows
environment.
An executable file contains Microsoft Windows code and data, or Windows
code, data, and resources. Specific fields have been added to the old-style
.EXE format header to indicate the existence of the segmented file format.
The old-style header may contain a valid executable program, called a stub
program, that will be executed if the program is run on MS-DOS (without
Windows). This stub program usually prints a message indicating that
Microsoft Windows is required to run the program. The segmented executable
format extensions also begin with a header that describes the contents and
location of the executable image in the file. The loader uses this header
information when it loads the executable segments in memory.
======================================================================
OLD-STYLE HEADER EXTENSIONS
======================================================================
The old-style header contains information the loader expects for an MS-DOS
executable file. It describes a stub program (WINSTUB) the loader can
place in memory when necessary, it points to the new-style header, and
it contains the stub programs relocation table.
The following illustrates the distinct parts of the old-style
executable format:
+-------------------------+
00h | Old-style header info |
+-------------------------+
20h | Reserved |
+-------------------------+
3Ch | Offset to segmented |
| .EXE header |
+-------------------------+
40h | Relocation table and |
| MS-DOS stub program |
+-------------------------+
| Segmented .EXE Header |
| . |
| . |
| . |
The word at offset 18h in the old-style .EXE header contains the
relative byte offset to the stub program's relocation table. If this
offset is 40h, then the double word at offset 3Ch is assumed to be the
relative byte offset from the beginning of the file to the beginning
of the segmented executable header. A new-format .EXE file is
identified if the segmented executable header contains a valid
signature. If the signature is not valid, the file is assumed to be an
old-style format .EXE file. The remainder of the old-style format
header will describe an MS-DOS program, the stub. The stub may be any
valid program but will typically be a program that displays an error
message.
======================================================================
SEGMENTED EXE FORMAT
======================================================================
Because Windows executable files are often larger than one segment
(64K), additional information (that does not appear in the old-style
header) is required so that the loader can load each segment properly.
The segmented EXE format was developed to provide the loader with this
information.
The segmented .EXE file has the following format:
+-----------------+
00h | Old-style EXE |
| Header |
+-----------------+
20h | Reserved |
+-----------------+
3Ch | Offset to | ---+
| Segmented Header| |
+-----------------+ |
40h | Relocation Table| |
| & Stub Program | |
+-----------------+ |
| | |
+-----------------+ |
xxh | Segmented EXE | <--+
| Header |
+-----------------+
| Segment Table |
+-----------------+
| Resource Table |
+-----------------+
| Resident Name |
| Table |
+-----------------+
| Module Reference|
| Table |
+-----------------+
| Imported Names |
| Table |
+-----------------+
| Entry Table |
+-----------------+
| Non-Resident |
| Name Table |
+-----------------+
| Seg #1 Data |
| Seg #1 Info |
+-----------------+
.
.
.
+-----------------+
| Seg #n Data |
| Seg #n Info |
+-----------------+
The following sections describe each of the components that make up
the segmented EXE format. Each section contains a description of the
component and the fields in the structures that make up that
component.
NOTE: All unused fields and flag bits are reserved for future use and
must contain 0 (zero) values.
======================================================================
SEGMENTED EXE HEADER
======================================================================
The segmented EXE header contains general information about the EXE
file and contains information on the location and size of the other
sections. The Windows loader copies this section, along with other
data, into the module table in the system data. The module table is
internal data used by the loader to manage the loaded executable
modules in the system and to support dynamic linking.
The following describes the format of the segmented executable header.
For each field, the offset is given relative to the beginning of the
segmented header, the size of the field is defined, and a description
is given.
Offset Size Description
------ ---- -----------
00h DW Signature word.
"N" is low-order byte.
"E" is high-order byte.
02h DB Version number of the linker.
03h DB Revision number of the linker.
04h DW Entry Table file offset, relative to the beginning of
the segmented EXE header.
06h DW Number of bytes in the entry table.
08h DD 32-bit CRC of entire contents of file.
These words are taken as 00 during the calculation.
0Ch DW Flag word.
0000h = NOAUTODATA
0001h = SINGLEDATA (Shared automatic data segment)
0002h = MULTIPLEDATA (Instanced automatic data
segment)
2000h = Errors detected at link time, module will not
load.
8000h = Library module.
The SS:SP information is invalid, CS:IP points
to an initialization procedure that is called
with AX equal to the module handle. This
initialization procedure must perform a far
return to the caller, with AX not equal to
zero to indicate success, or AX equal to zero
to indicate failure to initialize. DS is set
to the library's data segment if the
SINGLEDATA flag is set. Otherwise, DS is set
to the caller's data segment.
A program or DLL can only contain dynamic
links to executable files that have this
library module flag set. One program cannot
dynamic-link to another program.
0Eh DW Segment number of automatic data segment.
This value is set to zero if SINGLEDATA and
MULTIPLEDATA flag bits are clear, NOAUTODATA is
indicated in the flags word.
A Segment number is an index into the module's segment
table. The first entry in the segment table is segment
number 1.
10h DW Initial size, in bytes, of dynamic heap added to the
data segment. This value is zero if no initial local
heap is allocated.
12h DW Initial size, in bytes, of stack added to the data
segment. This value is zero to indicate no initial
stack allocation, or when SS is not equal to DS.
14h DD Segment number:offset of CS:IP.
18h DD Segment number:offset of SS:SP.
If SS equals the automatic data segment and SP equals
zero, the stack pointer is set to the top of the
automatic data segment just below the additional heap
area.
+--------------------------+
| additional dynamic heap |
+--------------------------+ <- SP
| additional stack |
+--------------------------+
| loaded auto data segment |
+--------------------------+ <- DS, SS
1Ch DW Number of entries in the Segment Table.
1Eh DW Number of entries in the Module Reference Table.
20h DW Number of bytes in the Non-Resident Name Table.
22h DW Segment Table file offset, relative to the beginning
of the segmented EXE header.
24h DW Resource Table file offset, relative to the beginning
of the segmented EXE header.
26h DW Resident Name Table file offset, relative to the
beginning of the segmented EXE header.
28h DW Module Reference Table file offset, relative to the
beginning of the segmented EXE header.
2Ah DW Imported Names Table file offset, relative to the
beginning of the segmented EXE header.
2Ch DD Non-Resident Name Table offset, relative to the
beginning of the file.
30h DW Number of movable entries in the Entry Table.
32h DW Logical sector alignment shift count, log(base 2) of
the segment sector size (default 9).
34h DW Number of resource entries.
36h DB Executable type, used by loader.
02h = WINDOWS
37h-3Fh DB Reserved, currently 0's.
======================================================================
SEGMENT TABLE
======================================================================
The segment table contains an entry for each segment in the executable
file. The number of segment table entries are defined in the segmented
EXE header. The first entry in the segment table is segment number 1.
The following is the structure of a segment table entry.
Size Description
---- -----------
DW Logical-sector offset (n byte) to the contents of the segment
data, relative to the beginning of the file. Zero means no
file data.
DW Length of the segment in the file, in bytes. Zero means 64K.
DW Flag word.
0007h = TYPE_MASK Segment-type field.
0000h = CODE Code-segment type.
0001h = DATA Data-segment type.
0010h = MOVEABLE Segment is not fixed.
0040h = PRELOAD Segment will be preloaded; read-only if
this is a data segment.
0100h = RELOCINFO Set if segment has relocation records.
F000h = DISCARD Discard priority.
DW Minimum allocation size of the segment, in bytes. Total size
of the segment. Zero means 64K.
======================================================================
RESOURCE TABLE
======================================================================
The resource table follows the segment table and contains entries for
each resource in the executable file. The resource table consists of
an alignment shift count, followed by a table of resource records. The
resource records define the type ID for a set of resources. Each
resource record contains a table of resource entries of the defined
type. The resource entry defines the resource ID or name ID for the
resource. It also defines the location and size of the resource. The
following describes the contents of each of these structures:
Size Description
---- -----------
DW Alignment shift count for resource data.
A table of resource type information blocks follows. The following
is the format of each type information block:
DW Type ID. This is an integer type if the high-order bit is
set (8000h); otherwise, it is an offset to the type string,
the offset is relative to the beginning of the resource
table. A zero type ID marks the end of the resource type
information blocks.
DW Number of resources for this type.
DD Reserved.
A table of resources for this type follows. The following is
the format of each resource (8 bytes each):
DW File offset to the contents of the resource data,
relative to beginning of file. The offset is in terms
of the alignment shift count value specified at
beginning of the resource table.
DW Length of the resource in the file (in bytes).
DW Flag word.
0010h = MOVEABLE Resource is not fixed.
0020h = PURE Resource can be shared.
0040h = PRELOAD Resource is preloaded.
DW Resource ID. This is an integer type if the high-order
bit is set (8000h), otherwise it is the offset to the
resource string, the offset is relative to the
beginning of the resource table.
DD Reserved.
Resource type and name strings are stored at the end of the
resource table. Note that these strings are NOT null terminated and
are case sensitive.
DB Length of the type or name string that follows. A zero value
indicates the end of the resource type and name string, also
the end of the resource table.
DB ASCII text of the type or name string.
======================================================================
RESIDENT-NAME TABLE
======================================================================
The resident-name table follows the resource table, and contains this
module's name string and resident exported procedure name strings. The
first string in this table is this module's name. These name strings
are case-sensitive and are not null-terminated. The following
describes the format of the name strings:
Size Description
---- -----------
DB Length of the name string that follows. A zero value indicates
the end of the name table.
DB ASCII text of the name string.
DW Ordinal number (index into entry table). This value is ignored
for the module name.
======================================================================
MODULE-REFERENCE TABLE
======================================================================
The module-reference table follows the resident-name table. Each entry
contains an offset for the module-name string within the imported-
names table; each entry is 2 bytes long.
Size Description
---- -----------
DW Offset within Imported Names Table to referenced module name
string.
======================================================================
IMPORTED-NAME TABLE
======================================================================
The imported-name table follows the module-reference table. This table
contains the names of modules and procedures that are imported by the
executable file. Each entry is composed of a 1-byte field that
contains the length of the string, followed by any number of
characters. The strings are not null-terminated and are case
sensitive.
Size Description
---- -----------
DB Length of the name string that follows.
DB ASCII text of the name string.
======================================================================
ENTRY TABLE
======================================================================
The entry table follows the imported-name table. This table contains
bundles of entry-point definitions. Bundling is done to save space in
the entry table. The entry table is accessed by an ordinal value.
Ordinal number one is defined to index the first entry in the entry
table. To find an entry point, the bundles are scanned searching for a
specific entry point using an ordinal number. The ordinal number is
adjusted as each bundle is checked. When the bundle that contains the
entry point is found, the ordinal number is multiplied by the size of
the bundle's entries to index the proper entry.
The linker forms bundles in the most dense manner it can, under the
restriction that it cannot reorder entry points to improve bundling.
The reason for this restriction is that other .EXE files may refer to
entry points within this bundle by their ordinal number. The following
describes the format of the entry table bundles.
Size Description
---- -----------
DB Number of entries in this bundle. All records in one bundle
are either moveable or refer to the same fixed segment. A zero
value in this field indicates the end of the entry table.
DB Segment indicator for this bundle. This defines the type of
entry table entry data within the bundle. There are three
types of entries that are defined.
000h = Unused entries. There is no entry data in an unused
bundle. The next bundle follows this field. This is
used by the linker to skip ordinal numbers.
001h-0FEh = Segment number for fixed segment entries. A fixed
segment entry is 3 bytes long and has the following
format.
DB Flag word.
01h = Set if the entry is exported.
02h = Set if the entry uses a global (shared) data
segments.
The first assembly-language instruction in the
entry point prologue must be "MOV AX,data
segment number". This may be set only for
SINGLEDATA library modules.
DW Offset within segment to entry point.
0FFH = Moveable segment entries. The entry data contains the
segment number for the entry points. A moveable segment
entry is 6 bytes long and has the following format.
DB Flag word.
01h = Set if the entry is exported.
02h = Set if the entry uses a global (shared) data
segments.
INT 3FH.
DB Segment number.
DW Offset within segment to entry point.
======================================================================
NONRESIDENT-NAME TABLE
======================================================================
The nonresident-name table follows the entry table, and contains a
module description and nonresident exported procedure name strings.
The first string in this table is a module description. These name
strings are case-sensitive and are not null-terminated. The name
strings follow the same format as those defined in the resident name
table.
======================================================================
PER SEGMENT DATA
======================================================================
The location and size of the per-segment data is defined in the
segment table entry for the segment. If the segment has relocation
fixups, as defined in the segment table entry flags, they directly
follow the segment data in the file. The relocation fixup information
is defined as follows:
Size Description
---- -----------
DW Number of relocation records that follow.
A table of relocation records follows. The following is the format
of each relocation record.
DB Source type.
0Fh = SOURCE_MASK
00h = LOBYTE
02h = SEGMENT
03h = FAR_ADDR (32-bit pointer)
05h = OFFSET (16-bit offset)
DB Flags byte.
03h = TARGET_MASK
00h = INTERNALREF
01h = IMPORTORDINAL
02h = IMPORTNAME
03h = OSFIXUP
04h = ADDITIVE
DW Offset within this segment of the source chain.
If the ADDITIVE flag is set, then target value is added to
the source contents, instead of replacing the source and
following the chain. The source chain is an 0FFFFh
terminated linked list within this segment of all
references to the target.
The target value has four types that are defined in the flag
byte field. The following are the formats for each target
type:
INTERNALREF
DB Segment number for a fixed segment, or 0FFh for a
movable segment.
DB 0
DW Offset into segment if fixed segment, or ordinal
number index into Entry Table if movable segment.
IMPORTNAME
DW Index into module reference table for the imported
module.
DW Offset within Imported Names Table to procedure name
string.
IMPORTORDINAL
DW Index into module reference table for the imported
module.
DW Procedure ordinal number.
OSFIXUP
DW Operating system fixup type.
Floating-point fixups.
0001h = FIARQQ, FJARQQ
0002h = FISRQQ, FJSRQQ
0003h = FICRQQ, FJCRQQ
0004h = FIERQQ
0005h = FIDRQQ
0006h = FIWRQQ
DW 0
======================================================================
Microsoft is a registered trademark and Windows is a trademark of
Microsoft Corporation.
Additional reference words: 3.00 3.10 softlib EXEFMT.EXE
KBCategory: kbprg kbfile
KBSubcategory: UsrFmt
=============================================================================
Copyright Microsoft Corporation 1996.
Appendix 2a : Specification for (x86, DOS, EXE)
DEFINITION FORMAT
header
section
END FORMAT
DEFINITION header ADDRESS 0
h_sigLo SIZE 8
h_sigHi SIZE 8
h_lastPageSize SIZE 16
h_numPages SIZE 16
h_numReloc SIZE 16
h_numParaHeader SIZE 16
h_minAlloc SIZE 16
h_maxAlloc SIZE 16
h_initSS SIZE 16
h_initSP SIZE 16
h_checkSum SIZE 16
h_initIP SIZE 16
h_initCS SIZE 16
h_relcTabOffset SIZE 16
h_overlayNum SIZE 16
END header
DEFINITION section ADDRESS (h_initIP + 16)
SIZE 0
END section
IMAGESIZE (h_numPages * 512 - h_numParaHeader * 16 - (512 -
h_lastPageSize))
IMAGEADDRESS (h_numParaHeader * 16)
FILEHEADER header
Appendix 2b : Specification for (x86, Windows, NE)
DEFINITION FORMAT
header
seg_header_off
seg_header
seg_table
res_table
res_names_table
mod_ref_table
imp_names_table
entry_table
non_res_names_table
END FORMAT
DEFINITION header ADDRESS 0
h_sigLo SIZE 8
h_sigHi SIZE 8
h_lastPageSize SIZE 16
h_numPages SIZE 16
h_numReloc SIZE 16
h_numParaHeader SIZE 16
h_minAlloc SIZE 16
h_maxAlloc SIZE 16
h_initSS SIZE 16
h_initSP SIZE 16
h_checkSum SIZE 16
h_initIP SIZE 16
h_initCS SIZE 16
h_relcTabOffset SIZE 16
h_overlayNum SIZE 16
END header
DEFINITION seg_header_off ADDRESS 60
sho_off SIZE 32
END seg_header_off
DEFINITION seg_header ADDRESS sho_off
sh_slower SIZE 8
sh_shigher SIZE 8
sh_version SIZE 8
sh_revision SIZE 8
sh_entToff SIZE 16
sh_entsize SIZE 16
sh_crc SIZE 32
sh_flag SIZE 16
sh_segnum SIZE 16
sh_heapInit SIZE 16
sh_stackInit SIZE 16
sh_CSIP SIZE 32
sh_SSSP SIZE 32
sh_segTent SIZE 16
sh_modTent SIZE 16
sh_nonRNTent SIZE 16
sh_segToff SIZE 16
sh_resToff SIZE 16
sh_resNToff SIZE 16
sh_modRToff SIZE 16
sh_impNToff SIZE 16
sh_nonRNToff SIZE 32
sh_numMoveEnt SIZE 16
sh_logAlign SIZE 16
sh_numRes SIZE 16
sh_exeType SIZE 8
sh_reserved SIZE 72
END seg_header
DEFINITION seg_table ADDRESS (sh_segToff + sho_off)
seg_table_ent ARRAY sh_segTent
ste_logSectoff SIZE 16
ste_size SIZE 16
ste_flag SIZE 16
ste_minsize SIZE 16
END seg_table_ent
END seg_table
DEFINITION res_table ADDRESS (sh_resToff + sho_off)
rt_align SIZE 16
rt_resRec ARRAY 0
rt_typeId SIZE 16
rt_numRes SIZE 16
rt_reserved SIZE 32
rt_resource ARRAY rt_numRes
rtr_fileoff SIZE 16
rtr_length SIZE 16
rtr_flag SIZE 16
rtr_ID SIZE 16
rtr_reserved SIZE 32
END rt_resource
END rt_resRec
rt_typeName SIZE 0
END res_table
DEFINITION res_names_table ADDRESS (sh_resNToff + sho_off)
SIZE 0
END res_names_table
DEFINITION mod_ref_table ADDRESS (sh_modRToff + sho_off)
SIZE 0
END mod_ref_table
DEFINITION imp_names_table ADDRESS (sh_impNToff + sho_off)
SIZE 0
END imp_names_table
DEFINITION entry_table ADDRESS (sh_entToff + sho_off)
SIZE 0
END entry_table
DEFINITION non_res_names_table ADDRESS (sh_nonRNToff + sho_off)
SIZE 0
END non_res_names_table
IMAGESIZE (h_numPages * 512 - h_numParaHeader * 16 - (512 -
h_lastPageSize))
FILEHEADER header
IMAGEADDRESS sho_off
Appendix 2c : Specification for (Sparc, Solaris, ELF)
DEFINITION FORMAT
header
program_header_table
sections
section_header_table
END FORMAT
DEFINITION header
h_ident SIZE 16
h_type SIZE 16
h_machine SIZE 16
h_version SIZE 32
h_entry SIZE 32
h_phoff SIZE 32
h_shoff SIZE 32
h_flags SIZE 32
h_ehsize SIZE 16
h_phentsize SIZE 16
h_phnum SIZE 16
h_shentsize SIZE 16
h_shnum SIZE 16
h_shstrndx SIZE 16
END header
DEFINITION program_header_table ADDRESS h_phoff
pht ARRAY h_phnum
pht_type SIZE
pht_offset SIZE
pht_vaddr SIZE
pht_paddr SIZE
pht_filesz SIZE
pht_memsz SIZE
pht_flags SIZE
pht_align SIZE
END pht
END program_header_table
DEFINITION sections
SIZE 0
END sections
DEFINITION section_header_table ADDRESS h_shoff
sht ARRAY h_shnum
sht_name SIZE 32
sht_type SIZE 32
sht_flag SIZE 32
sht_addr SIZE 32
sht_offset SIZE 32
sht_size SIZE 32
sht_link SIZE 32
sht_info SIZE 32
sht_addr_align SIZE 32
sht_entsie SIZE 32
END h_shnum
END section_header_table
IMAGEADDRESS h_entry
IMAGESIZE 0
FILEHEADER header
Appendix 3 : Source code
· genload2.c - the SRL parser and generator
· level.h - scope and level definitions
· level.c - source routines for scope and level