Records of external names (EXTDEF, LEXTDEF, CEXTDEF, COMDEF and LCOMDEF) all add to one list, numbered from 1 in file order. Fixups name their targets by an index into this list.
EXTDEF and LEXTDEF (0x8C, 0xB4)
Repeated to the end of the record:
| Field | Meaning |
|---|---|
| Name | A name |
| Type index | An index of a TYPDEF, usually 0 |
LEXTDEF has the same layout, for names visible only inside this module.
CEXTDEF (0xBC)
External names for COMDAT blocks. Repeated to the end of the record: a logical name index into the LNAMES, and a type index.
PUBDEF and LPUBDEF (0x90, 0x91, 0xB6, 0xB7)
| Field | Meaning |
|---|---|
| Base group index | An index into the GRPDEFs, or 0 |
| Base segment index | An index into the SEGDEFs, or 0 |
| Base frame | Only when both indexes are 0: an absolute paragraph number, 2 bytes |
| Then repeated to the end of the record: | |
| Name | The symbol’s name |
| Offset | Where it is in the segment; 2 or 4 bytes |
| Type index | Usually 0 |
COMDEF and LCOMDEF (0xB0, 0xB8)
Communal symbols: uninitialised variables that the linker merges, with the largest size winning. Repeated to the end of the record:
| Field | Meaning |
|---|---|
| Name | The symbol’s name |
| Type index | Usually 0 |
| Data type | 0x61 far, 0x62 near; Borland also writes a segment index below 0x60 |
| Far: number of elements, then element size. Near: length | See Communal length |
Communal length
| First byte | Value |
|---|---|
0x00–0x80 | The value itself |
0x81 | The next 2 bytes, little-endian |
0x84 | The next 3 bytes, little-endian |
0x88 | The next 4 bytes, little-endian |
ALIAS (0xC6)
Repeated to the end of the record: an alias name and the name it stands for, both as names.
Weak externals
A weak external is declared in a COMENT record of class 0xA8, WKEXT: pairs of indexes into the external list, the first the weak name and the second the name to use if no other definition is found.