1 byte 2 bytes ÚÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂ--- ³ 9A ³ Record ³ ³ ³ Length ³ ÀÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁ--- 1 or 2 1 byte 1 or 2 1 byte --ÚÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄ¿ ³ Group ³ FF ³ Segment ³Chk Sum³ ³ Name Index³ ³ Def. Index³or 0 ³ --ÀÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÙ <---- repeated ---->
This record causes the program segments identified by SEGDEF records to be collected together (grouped) within a logical segment which is to be addressed through a single selector.
Group Name
The group name is specified as an index into a previously defined LNAMES name and must be nonzero.
Groups from different object modules are coalesced if their names are identical.
Group Components
The group's components are segments, specified as indices into previously defined SEGDEF records.
The first byte of each group component is a type field for the remainder of the component. The linker requires a type value of FFH and always assumes that the component contains a segment index value.
The component fields are usually repeated so that all segments constituting
a group can be included in one GRPDEF record.
Notes:
This record is frequently followed by a THREAD fixup.
The linker imposes a limit of 31 GRPDEF records in a single object module and limits the total number of group definitions across all object modules to 31.
An example of a group for the IBM C Compiler is DGROUP32 which groups DATA32, CONST32 and BSS32.
The linker does special handling of the pseudo-group FLAT. All address references to this group are made as offsets from the virtual zero address, which is the start of the memory image of the executable.