[ Bottom of Page | Previous Page | Next Page | Contents | Index | Library Home | Legal | Search ]

Files Reference

XCOFF Object File Format

Purpose

The extended common object file format (XCOFF) is the object file format for the operating system. XCOFF combines the standard common object file format (COFF) with the TOC module format concept, which provides for dynamic linking and replacement of units within an object file. In AIX 4.3, XCOFF has been extended to provide for 64-bit object files and executable files.

XCOFF is the formal definition of machine-image object and executable files. These object files are produced by language processors (assemblers and compilers) and binders, and are used primarily by binders and the system loaders.

The default name for an XCOFF executable file is a.out.

Note
This information lists bits in big-endian order.

Read the following information to learn more about XCOFF object files:

Writing Applications that Use XCOFF Declarations

Programs can be written to understand 32-bit XCOFF files, 64-bit XCOFF files, or both. The programs themselves may be compiled in 32-bit mode or 64-bit mode to create 32-bit or 64-bit programs. By defining preprocessor macros, applications can select the proper structure definitions from the XCOFF header files.

Note
This document uses "XCOFF32" and "XCOFF64" as shorthand for "32-bit XCOFF" and "64-bit XCOFF", respectively.

Selecting XCOFF32 Declarations

To select the XCOFF32 definitions, an application merely needs to include the appropriate header files. Only XCOFF32 structures, fields, and preprocessor defines will be included. Structure names and field names will match those in previous versions of the operating system, so existing programs can be recompiled without change.

Note
Existing uses of shorthand type notation (e.g., UINT, ULONG) have been removed.

Selecting XCOFF64 Declarations

To select the XCOFF64 definitions, an application should define the preprocessor macro __XCOFF64__. When XCOFF header files are included, the structures, fields, and preprocessor defines for XCOFF64 will be included. Where possible, the structure names and field names are identical to the XCOFF32 names, but field sizes and offsets may differ.

Selecting Both XCOFF32 and XCOFF64 Declarations

To select structure definitions for both XCOFF32 and XCOFF64, an application should define both the preprocessor macros __XCOFF32__ and __XCOFF64__. This will define structures for both kinds of XCOFF files. Structures and typedef names for XCOFF64 files will have the suffix "_64" added to them. (Consult the header files for details.)

Selecting Hybrid XCOFF Declarations

An application may choose to select single structures that contain field definitions for both XCOFF32 and XCOFF64 files. For fields that have the same size and offset in both XCOFF32 and XCOFF64 definitions, the field names are retained. For fields whose size or offset differ between XCOFF32 and XCOFF64 definitions, the XCOFF32 fields have a "32" suffix, while the XCOFF64 fields have a "64" suffix. To select hybrid structure definitions, an application should define the preprocessor macro __XCOFF_HYBRID__. For example, the symbol table definition (in /usr/include/syms.h) will have the names n_offset32 and n_offset64, which should be used for the 32-bit XCOFF and 64-bit XCOFF respectively.

Understanding XCOFF

Assemblers and compilers produce XCOFF object files as output. The binder combines individual object files into an XCOFF executable file. The system loader reads an XCOFF executable file to create an executable memory image of a program. The symbolic debugger reads an XCOFF executable file to provide symbolic access to functions and variables of an executable memory image.

An XCOFF file contains the following parts:

Not every XCOFF file contains every part. A minimal XCOFF file contains only the file header.

Object and Executable Files

XCOFF object files and executable files are similar in structure. An XCOFF executable file (or "module") must contain an auxiliary header, a loader section header, and a loader section.

The loader raw-data section contains information needed to dynamically load a module into memory for execution. Loading an XCOFF executable file into memory creates the following logical segments:

The XCOFF file Organization illustrates the structure of the XCOFF object file.

XCOFF Header Files

The xcoff.h file defines the structure of the XCOFF file. The xcoff.h file includes the following files:

filehdr.h Defines the file header.
aouthdr.h Defines the auxiliary header.
scnhdr.h Defines the section headers.
loader.h Defines the format of raw data in the .loader section.
typchk.h Defines the format of raw data in the .typchk section.
exceptab.h Defines the format of raw data in the .except section.
dbug.h Defines the format of raw data in the .debug section.
reloc.h Defines the relocation information.
linenum.h Defines the line number information.
syms.h Defines the symbol table format.
storclass.h Defines ordinary storage classes.
dbxstclass.h Defines storage classes used by the symbolic debuggers.

The a.out.h file includes the xcoff.h file. All of the XCOFF include files include the xcoff32_64.h file.

For more information on sections of the XCOFF object file, see "Sections and Section Headers." For more information on the symbol table, see "Symbol Table Information." For more information on the string table, see "String Table." For more information on the Debug section, see "Debug Section."

Composite File Header

The following sections describe the XCOFF composite file header components:

File Header (filehdr.h)

The filehdr.h file defines the file header of an XCOFF file. The file header is 20 bytes long in XCOFF32 and 24 bytes long in XCOFF64. The structure contains the fields shown in the following table.

Table 11. File Header Structure (Defined in filehdr.h)
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 2 0 2 f_magic Target machine
2 2 2 2 f_nscns Number of sections
4 4 4 4 f_timdat Time and date of file creation
8 4 8 8 f_symptr+ Byte offset to symbol table start
12 4 20 4 f_nsyms+ Number of entries in symbol table
16 2 16 2 f_opthdr Number of bytes in optional header
18 2 18 2 f_flags Flags (see "Field Definitions")
+ Use "32" or "64" suffix when __XCOFF_HYBRID__ is defined.
Field Definitions

f_magic Specifies an integer known as the magic number, which specifies the target machine and environment of the object file. For XCOFF32, the only valid value is 0x01DF (0737 Octal). For XCOFF64 on AIX 4.3 and earlier, the only valid value is 0x01EF (0757 Octal). For XCOFF64 on AIX 5.1 and later, the only valid value is 0x01F7 (0767 Octal). Symbolic names for these values are found in the file, /usr/include/filehdr.h.
f_nscns Specifies the number of section headers contained in the file. The first section header is section header number one; all references to a section are one-based.
f_timdat Specifies when the file was created (number of elapsed seconds since 00:00:00 Universal Coordinated Time (UCT), January 1, 1970). This field should specify either the actual time or be set to a value of 0.
f_symptr Specifies a file pointer (byte offset from the beginning of the file) to the start of the symbol table. If the value of the f_nsyms field is 0, then this value is undefined.
f_nsyms Specifies the number of entries in the symbol table. Each symbol table entry is 18 bytes long.
f_opthdr Specifies the length, in bytes, of the auxiliary header. For an XCOFF file to be executable, the auxiliary header must exist and be _AOUTHSZ_EXEC bytes long. (_AOUTHSZ_EXEC is defined in aouthdr.h.)
f_flags Specifies a bit mask of flags that describe the type of the object file. The following information defines the flags:
Bit Mask
Flag
0x0001
F_RELFLG

Indicates that the relocation information for binding has been removed from the file. This flag must not be set by compilers, even if relocation information was not required.

0x0002
F_EXEC

Indicates that the file is executable. No unresolved external references exist.

0x0004
F_LNNO

Indicates that line numbers have been stripped from the file by a utility program. This flag is not set by compilers, even if no line-number information has been generated.

0x0008
Reserved.
0x0010
F_FDPR_PROF

Indicates that the file was profiled with the fdpr command.

0x0020
F_FDPR_OPTI

Indicates that the file was reordered with the fdpr command.

0x0040
F_DSA

Indicates that the file uses Very Large Program Support.

0x0080
Reserved.
0x0100
Reserved.
0x0200
Reserved.
0x0400
Reserved.
0x0800
Reserved.
0x1000
F_DYNLOAD

Indicates the file is dynamically loadable and executable. External references are resolved by way of imports, and the file might contain exports and loader relocation.

0x2000
F_SHROBJ

Indicates the file is a shared object (shared library). The file is separately loadable. That is, it is not normally bound with other objects, and its loader exports symbols are used as automatic import symbols for other object files.

0x4000
F_LOADONLY

If the object file is a member of an archive, it can be loaded by the system loader, but the member is ignored by the binder. If the object file is not in an archive, this flag has no effect.

0x8000
Reserved.

Auxiliary Header (aouthdr.h)

The auxiliary header contains system-dependent and implementation-dependent information, which is used for loading and executing a module. Information in the auxiliary header minimizes how much of the file must be processed by the system loader at execution time.

The binder generates an auxiliary header for use by the system loader. Auxiliary headers are not required for an object file that is not to be loaded. When auxiliary headers are generated by compilers and assemblers, the headers are ignored by the binder.

The auxiliary header immediately follows the file header.

Note
If the value of the f_opthdr field is 0, the auxiliary header does not exist.

The C language structure for the auxiliary header is defined in the aouthdr.h file. The auxiliary header contains the fields shown in the following table.

Table 12. Auxiliary Header Structure (Defined in aouthdr.h)
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 2 0 2 o_mflag Flags, how to execute
2 2 2 2 o_vstamp Version
4 4 56 8 o_tsize+ Text size in bytes
8 4 64 8 o_dsize+ Initialized data size in bytes
12 4 72 8 o_bsize+ Uninitialized data size in bytes
16 4 80 8 o_entry+ Entry point descriptor (virtual address)
20 4 8 8 o_text_start+ Base address of text (virtual address)
24 4 16 8 o_data_start+ Base address of data (virtual address)
28 4 24 8 o_toc+ Address of TOC anchor
32 2 32 2 o_snentry Section number for entry point
34 2 34 2 o_sntext Section number for .text
36 2 36 2 o_sndata Section number for .data
38 2 38 2 o_sntoc Section number for TOC
40 2 40 2 o_snloader Section number for loader data
42 2 42 2 o_snbss Section number for .bss
44 2 44 2 o_algntext Maximum alignment for .text
46 2 46 2 o_algndata Maximum alignment for .data
48 2 48 2 o_modtype Module type field
50 1 50 1 o_cpuflag Bit flags - cpu types of objects
51 1 51 1 o_cputype Reserved for CPU type
52 4 88 8 o_maxstack+ Maximum stack size allowed (bytes)
56 4 96 8 o_maxdata+ Maximum data size allowed (bytes)
60 4 4 4 o_debugger+ Reserved for debuggers.
64 8 52 4 o_resv2 Reserved Field must contain 0s.
N/A 104 116 o_resv3 Reserved. Field must contain 0s.
+Use "32" or "64" suffix when __XCOFF_HYBRID__ is defined.
Field Definitions

The following information defines the auxiliary header fields. For entries with two labels, the label in parentheses is the alternate original COFF a.out file format name.

o_mflags (magic) Specifies the magic number, which informs the operating system of the file's execution characteristics. The binder assigns the following value:
0x010B
Text and data are aligned in the file and may be paged.
o_vstamp (vstamp) Specifies the format version for this auxiliary header. The only valid value is 1.
o_tsize (tsize) Specifies the size (in bytes) of the raw data for the .text section. The .text section typically contains the read-only part of the program. This is the same value as contained in the s_size field of the section header for the .text section.
o_dsize (dsize) Specifies the size (in bytes) of the raw data for the .data section. The .data section contains the initialized data of the program and is writable. This is the same value as contained in the s_size field of the section header for the .data section.
o_bsize (bsize) Specifies the size (in bytes) of .bss area, which is used for uninitialized variables during execution and is writable. No raw data exists in the file for the .bss section. This is the same value as contained in the s_size field of the section header for the .bss section.
o_entry (entry) Specifies the virtual address of the entry point. (See the definition of the o_snentry field.) For application programs, this virtual address is the address of the function descriptor. The function descriptor contains the addresses of both the entry point itself and its TOC anchor. The offset of the entry point function descriptor from the beginning of its containing section can be calculated as follows:
Section_offset_value=o_entry-s_paddr[o_snentry - 1],

where s_paddr is the virtual address contained in the section header.

o_text_start (text_start) Specifies the virtual address of the .text section. This is the address assigned to (that is, used for) the first byte of the .text raw-data section. This is the same value as contained in the s_paddr field of the section header for the .text section.
o_data_start (data_start) Specifies the virtual address of the .data section. This is the address assigned to (that is, used for) the first byte of the .data raw-data section. This is the same value as contained in the s_paddr field of the section header for the .data section.

For addressing purposes, the .bss section is considered to follow the .data section.

The following definitions are extensions used by the system loader. In general, an object file may contain multiple sections of a given type, but in a module, only a single occurrence of the .text, .data, .bss, and .loader sections may exist.

o_toc Specifies the virtual address of the TOC anchor (see the definition of the o_sntoc field).
o_snentry Specifies the number of the file section containing the entry-point. (This field contains a file section header sequence number.) The entry point must be in the .text or .data section.
o_sntext Specifies the number of the file .text section. (This field contains a file section header sequence number.)
o_sndata Specifies the number of the file .data section. (This field contains a file section header sequence number.)
o_sntoc Specifies the number of the file section containing the TOC. (This field contains a file section header sequence number.)
o_snloader Specifies the number of the file section containing the system loader information. (This field contains a file section header sequence number.)
o_snbss Specifies the number of the file .bss section. (This field contains a file section header sequence number.)
o_algntext Specifies the log (base 2) of the maximum alignment needed for any csect in the .text section.
o_algndata Specifies the log (base 2) of the maximum alignment needed for any csect in the .data and .bss sections.
o_modtype Specifies a module type. The value is an ASCII character string. The following module type is recognized by the system loader:
RO
Specifies a read-only module. If a shared object with this module type has no BSS section and no dependents, the data section of the module will be mapped read-only and shared by all processes using the object.
o_cpuflag Bit flags - cputypes of objects.
o_cputype Reserved. This byte must be set to 0.
o_maxstack Specifies the maximum stack size (in bytes) allowed for this executable. If the value is 0, the system default maximum stack size is used.
o_maxdata Specifies the maximum data size (in bytes) allowed for this executable. If the value is 0, the system default maximum data size is used.
o_debugger This field should contain 0. When a loaded program is being debugged, the memory image of this field may be modified by a debugger to insert a trap instruction.

Section Headers (scnhdr.h)

Each section of an XCOFF file has a corresponding section header, although some section headers may not have a corresponding raw-data section. A section header provides identification and file-accessing information for each section contained within an XCOFF file. Each section header in an XCOFF32 file is 40 bytes long, while XCOFF64 section headers are 72 bytes long. The C language structure for a section header can be found in the scnhdr.h file. A section header contains the fields shown in the following table.

Table 13. Section Header Structure (Defined in scnhdr.h)
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 8 0 8 s_name Section name
8 4 8 8 s_paddr+ Physical address
12 4 16 8 s_vaddr+ Virtual address (same as physical address)
16 4 24 8 s_size+ Section size
20 4 32 8 s_scnptr+ Offset in file to raw data for section
24 4 40 8 s_relptr+ Offset in file to relocation entries for section
28 4 48 8 s_lnnoptr+ Offset in file to line number entries for section
32 2 56 4 s_nreloc+ Number of relocation entries
34 2 60 4 s_nlnno+ Number of line number entries
36 2 64 4 s_flags+ Flags to define the section type
+Use "32" or "64" suffix when __XCOFF_HYBRID__ is defined.
Field Definitions

The following information defines the section header fields:

s_name Specifies an 8-byte, null-padded section name. An 8-byte section name will not have a terminating null character. Use the s_flags field instead of the s_name field to determine a section type. Two sections of the same type may have different names, allowing certain applications to distinguish between them.
s_paddr Specifies the physical address of the section. This is the address assigned and used by the compilers and the binder for the first byte of the section. This field should contain 0 for all sections except the .text , .data , and .bss sections.
s_vaddr Specifies the virtual address of the section. This field has the same value as the s_paddr field.
s_size Specifies the size (in bytes) of this section.
s_scnptr Specifies a file pointer (byte offset from the beginning of the file) to this section's raw data. If this field contains 0, this section has no raw data. Otherwise, the size of the raw data must be contained in the s_size field.
s_relptr Specifies a file pointer (byte offset from the beginning of the file) to the relocation entries for this section. If this section has no relocation entries, this field must contain 0.
s_lnnoptr Specifies a file pointer (byte offset from the beginning of the file) to the line number entries for this section. If this section has no line number entries, this field must contain 0.
s_nreloc Specifies the number of relocation entries for this section. In an XCOFF32 file, if more than 65,534 relocation entries are required, the field value will be 65535, and an STYP_OVRFLO section header will contain the actual count of relocation entries in the s_paddr field. Refer to the discussion of overflow headers in "Sections and Section Headers" . If this field is set to 65535, the s_nlnno field must also be set to 65535.
s_nlnno Specifies the number of line number entries for this section. In an XCOFF32 file, if more than 65,534 line number entries are required, the field value will be 65535, and an STYP_OVRFLO section header will contain the actual number of line number entries in the s_vaddr field. Refer to the discussion of overflow headers in "Sections and Section Headers" . If this field is set to 65535, the s_nreloc field must also be set to 65535.
s_flags Specifies flags defining the section type. The low-order pair of bytes is used. A section type identifies the contents of a section and specifies how the section is to be processed by the binder or the system loader. Only a single bit value may be assigned to the s_flags field. This value must not be the sum or bitwise OR of multiple flags. The two high-order bytes should contain 0.

Valid bit values are:

Value
Flag
0x0000
Reserved.
0x0001
Reserved.
0x0002
Reserved.
0x0004
Reserved.
0x0008
STYP_PAD

Specifies a pad section. A section of this type is used to provide alignment padding between sections within an XCOFF executable object file. This section header type is obsolete since padding is allowed in an XCOFF file without a corresponding pad section header.

0x0010
Reserved.
0x0020
STYP_TEXT

Specifies an executable text (code) section. A section of this type contains the executable instructions of a program.

0x0040
STYP_DATA

Specifies an initialized data section. A section of this type contains the initialized data and the TOC of a program.

0x0080
STYP_BSS

Specifies an uninitialized data section. A section header of this type defines the uninitialized data of a program.

0x0100
STYP_EXCEPT

Specifies an exception section. A section of this type provides information to identify the reason that a trap or exception occurred within an executable object program.

0x0200
STYP_INFO

Specifies a comment section. A section of this type provides comments or data to special processing utility programs.

0x0400
Reserved.
0x0800
Reserved.
s_flags continued

Valid bit values are:

Value
Flag
0x1000
STYP_LOADER

Specifies a loader section. A section of this type contains object file information for the system loader to load an XCOFF executable. The information includes imported symbols, exported symbols, relocation data, type-check information, and shared object names.

0x2000
STYP_DEBUG

Specifies a debug section. A section of this type contains stabstring information used by the symbolic debugger.

0x4000
STYP_TYPCHK

Specifies a type-check section. A section of this type contains parameter/argument type-check strings used by the binder.

0x8000
STYP_OVRFLO
Note
An XCOFF64 file may not contain an overflow section header.

Specifies a relocation or line-number field overflow section. A section header of this type contains the count of relocation entries and line number entries for some other section. This section header is required when either of the counts exceeds 65,534. See the s_nreloc and s_nlnno fields in "Sections and Section Headers" for more information on overflow headers.

For general information on the XCOFF file format, see "XCOFF Object File Format."

Sections and Section Headers

Section headers are defined to provide a variety of information about the contents of an XCOFF file. Programs that process XCOFF files will recognize only some of the valid sections.

See the following information to learn more about XCOFF file sections:

Current applications do not use the s_name field to determine the section type. Nevertheless, conventional names are used by system tools, as shown in the following table.

Table 14. Conventional Header Names
Description Conventional Name Multiple Allowed? s_flag
Text section .text Yes STYP_TEXT
Data section .data Yes STYP_DATA
BSS section .bss Yes STYP_BSS
Pad section .pad Yes STYP_PAD
Loader section .loader No STYP_LOADER
Debug section .debug No STYP_DEBUG
Type-check section .typchk Yes STYP_TYPCHK
Exception section .except No STYP_EXCEPT
Overflow section .ovrflo Yes (one per .text or .data section) STYP_OVRFLO
Comment section .info Yes STYP_INFO

Some fields of a section header may not always be used, or may have special usage. This pertains to the following fields:

s_name On input, ignored by the binder and system loader. On output, the conventional names (shown in the "Conventional Header Names" table) are used.
s_scnptr Ignored for .bss sections.
s_relptr Recognized for the .text and .data sections only. No relocation is performed for other sections, where this value must be 0.
s_lnnoptr Recognized for the .text section only. Otherwise, it must be 0.
s_nreloc , s_nlnno Handles relocation or line-number field overflows in an XCOFF32 file. (XCOFF64 files may not have overflow section headers.) If a section has more than 65,534 relocation entries or line number entries, both of these fields are set to a value of 65535. In this case, an overflow section header with the s_flags field equal to STYP_OVRFLO is used to contain the relocation and line-number count information. The fields in the overflow section header are defined as follows:
s_nreloc
Specifies the file section number of the section header that overflowed; that is, the section header containing a value of 65535 in its s_nreloc and s_nlnno fields. This value provides a reference to the primary section header. This field must have the same value as the s_nlnno field.
Note
There is no reference in the primary section header that identifies the appropriate overflow section header. All the section headers must be searched to locate an overflow section header that contains the correct primary section header reference in this field.
s_nlnno
Specifies the file section number of the section header that overflowed. This field must have the same value as the s_nreloc field.
s_paddr
Specifies the number of relocation entries actually required. This field is used instead of the s_nreloc field of the section header that overflowed.
s_vaddr
Specifies the number of line-number entries actually required. This field is used instead of the s_nlnno field of the section header that overflowed.

The s_size and s_scnptr fields have a value of 0 in an overflow section header. The s_relptr and s_lnnoptr fields must have the same values as in the corresponding primary section header.

An XCOFF file provides special meaning to the following sections:

For more information on XCOFF file sections, see "Loader Section (loader.h)," "Debug Section," "Type-Check Section," "Exception Section," and "Comment Section."

Loader Section (loader.h)

The loader section contains information required by the system loader to load and relocate an executable XCOFF object. The loader section is generated by the binder. The loader section has an s_flags section type flag of STYP_LOADER in the XCOFF section header. By convention, .loader is the loader section name. The data in this section is not referenced by entries in the XCOFF symbol table.

The loader section consists of the following parts:

The C language structure for the loader section can be found in the loader.h file.

Loader Header Field Definitions

The following table describes the loader section's header field definitions.

Table 15. Loader Section Header Structure (Defined in loader.h)
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 4 0 4 l_version Loader section version number
4 4 4 4 l_nsyms Number of symbol table entries
8 4 8 4 l_nreloc Number of relocation table entries
12 4 12 4 l_istlen Length of import file ID string table
16 4 16 4 l_nimpid Number of import file IDs
20 4 24 8 l_impoff+ Offset to start of import file IDs
24 4 20 4 l_stlen+ Length of string table
28 4 32 8 l_stoff+ Offset to start of string table
N/A 40 8 l_symoff Offset to start of symbol table
N/A 48 8 l_rldoff Offset to start of relocation entries
+Use "32" or "64" suffix when __XCOFF_HYBRID__ is defined.

The following information defines the loader section's header fields:

l_version Specifies the loader section version number. This value must be 1 for XCOFF32, 2 for XCOFF64.
l_nsyms Specifies the number of symbol table entries in the loader section. This value is the actual count of symbol table entries contained in the loader section and does not include the three implicit entries for the .text, .data, and .bss symbol entries.
l_nreloc Specifies the number of relocation table entries in the loader section.
l_istlen Specifies the byte length of the import file ID string table in the loader section.
l_nimpid Specifies the number of import file IDs in the import file ID string table.
l_impoff Specifies the byte offset from beginning of the loader section to the first import file ID.
l_stlen Specifies the length of the loader section string table.
l_stoff Specifies the byte offset from beginning of the loader section to the first entry in the string table.
l_symoff Specifies the byte offset from beginning of the loader section to the start of the loader symbol table (in XCOFF64 only).
l_rldoff Specifies the byte offset from beginning of the loader section to the start of the loader section relocation entries (in XCOFF64 only).

Loader Symbol Table Field Definitions

The loader section symbol table contains the symbol table entries that the system loader needs for its import and export symbol processing and dynamic relocation processing.

The loader.h file defines the symbol table fields. Each entry is 24 bytes long.

There are three implicit external symbols, one each for the .text, .data, and .bss sections. These symbols are referenced using symbol table index values 0, 1, and 2, respectively. The first symbol contained in the loader section symbol table is referenced using an index value of 3.

Table 16. Loader Section Symbol Table Entry Structure
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 8 N/A l_name+ Symbol name or byte offset into string table
0 4 N/A l_zeroes+ Zero indicates symbol name is referenced from l_offset
4 4 8 4 l_offset+ Byte offset into string table of symbol name
8 4 0 8 l_value+ Address field
12 2 12 2 l_scnum Section number containing symbol
14 1 14 1 l_smtype Symbol type, export, import flags
15 1 15 1 l_smclas Symbol storage class
16 4 16 4 l_ifile Import file ID; ordinal of import file IDs
20 4 20 4 l_parm Parameter type-check field
+Use "32" or "64" suffix when __XCOFF_HYBRID__ is defined.

The symbol table fields are:

l_name (XCOFF32 only) Specifies an 8-byte, null-padded symbol name if it is 8 bytes or less in length. Otherwise, the field is treated as the following two 4-byte integers for accessing the symbol name:
l_zeroes
(XCOFF32 only) A value of 0 indicates that the symbol name is in the loader section string table. This field overlays the first word of the l_name field. An l_name field having the first 4 bytes (first word) equal to 0 is used to indicate that the name string is contained in the string table instead of the l_name field.
l_offset
(XCOFF32 only) This field overlays the second word of the l_name field. The value of this field is the byte offset from the beginning of the loader section string table to the first byte of the symbol name (not its length field).
l_offset (XCOFF64 only) This field has the same use as the l_offset field in XCOFF32.
l_value Specifies the virtual address of the symbol
l_scnum Specifies the number of the XCOFF section that contains the symbol. If the symbol is undefined or imported, the section number is 0. Otherwise, the section number refers to the .text, .data, or .bss section. Section headers are numbered beginning with 1.
l_smtype Specifies the symbol type, import flag, export flag, and entry flag.

Bits 0-4 are flag bits defined as follows:

Bit 0     0x80  Reserved.
Bit 1     0x40  Specifies an imported symbol.
Bit 2     0x20  Specifies an entry point descriptor symbol.
Bit 3     0x10  Specifies an exported symbol.
Bit 4     0x08  Specifies a weak symbol.
Bits 5-7  0x07 Symbol type--see below.

Bits 5-7 constitute a 3-bit symbol type field with the following definitions:

0
XTY_ER

Specifies an external reference providing a symbol table entry for an external (global) symbol contained in another XCOFF object file.

1
XTY_SD

Specifies the csect section definition, providing the definition of the smallest initialized unit within an XCOFF object file.

2
XTY_LD

Specifies the label definition, providing the definition of the global entry points for initialized csects. An uninitialized csect of type XTY_CM may not contain a label definition.

3
XTY_CM

Specifies a common (BSS uninitialized data) csect definition, providing the definition of the smallest uninitialized unit within an XCOFF object file.

4-7
Reserved.

l_smclas
Specifies the storage mapping class of the symbol, as defined in syms.h for the x_smclas field of the csect auxiliary symbol table entry. Values have the symbolic form XMC_xx, where xx is PR, RO, GL, XO, SV, SV64, SV3264, RW, TC, TD, DS, UA, BS, or UC. See "csect Auxiliary Entry for the C_EXT, C WEAKEXT, and C_HIDEXT Symbols" for more information.

l_ifile
Specifies the import file ID string. This integer is the ordinal value of the position of the import file ID string in the import file ID name string table of the loader section. For an imported symbol, the value of 0 in this field identifies the symbol as a deferred import to the system loader. A deferred import is a symbol whose address can remain unresolved following the processing of the loader. If the symbol was not imported, this field must have a value of 0.

l_parm
Specifies the offset to the parameter type-check string. The byte offset is from the beginning of the loader section string table. The byte offset points to the first byte of the parameter type-check string (not to its length field). For more information on the parameter type-check string, see "Type-Check Section" . A value of 0 in the l_parm field indicates that the parameter type-checking string is not present for this symbol, and the symbol will be treated as having a universal hash.

Loader Relocation Table Field Definitions

The Loader Section Relocation Table Structure contains all the relocation information that the system loader needs to properly relocate an executable XCOFF file when it is loaded. The loader.h file defines the relocation table fields. Each entry in the loader section relocation table is 12 bytes long in XCOFF32 and 16 bytes long in XCOFF64. The l_vaddr, l_symndx, and l_rtype fields have the same meaning as the corresponding fields of the regular relocation entries, which are defined in the reloc.h file. See "Relocation Information for XCOFF File (reloc.h)" for more information.

Table 17. Loader Section Relocation Table Entry Structure
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 4 0 8 l_vaddr+ Address field
4 4 12 4 l_symndx+ Loader section symbol table index of referenced item
8 2 8 2 l_rtype Relocation type
10 2 10 2 l_rsecnm File section number being relocated
+Use "32" or "64" suffix when __XCOFF_HYBRID__ is defined.

The loader.h file defines the following fields:

Name Description
l_vaddr Specifies the virtual address of the relocatable reference.
l_symndx Specifies the loader section symbol table index (n-th entry) of the symbol that is being referenced. Values 0, 1, and 2 are implicit references to the .text, .data, and .bss sections, respectively. Symbol index 3 is the index for the first symbol actually contained in the loader section symbol table.
Note
A reference to an exported symbol can be made using the symbol's section number (symbol number 0, 1, or 2) or using the actual number of the exported symbol.
l_rtype Specifies the relocation size and type. (This field has the same interpretation as the r_type field in the reloc.h file.) See "Relocation Information for XCOFF File (reloc.h)" for more information.
l_rsecnm Specifies the section number of the .text, .data, or .bss section being relocated (associated with l_vaddr field). This is a one-based index into the section headers.

Loader Import File ID Name Table Definition

The loader section import file ID name strings of a module provide a list of dependent modules that the system loader must load in order for the module to load successfully. However, this list does not contain the names of modules that the named modules themselves depend on.

Table 18. Loader Section Import File IDs - Contains Variable Length Strings
Offset Length in Bytes Name Description
0 n1 l_impidpath Import file ID path string, null-delimited
n1 + 1 n2 l_impidbase Import file ID base string, null-delimited
n1 + n2 + 2 n3 l_impidmem Import file ID member string, null-delimited



Fields repeat for each import file ID.

Each import file ID name consists of three null-delimited strings.

The first import file ID is a default LIBPATH value to be used by the system loader. The LIBPATH information consists of file paths separated by colons. There is no base name or archive member name, so the file path is followed by three null bytes.

Each entry in the import file ID name table consists of:

For example:

/usr/lib\0mylib.a\0shr.o\0

Loader String Table Definition

The loader section string table contains the parameter type-checking strings, all symbols names for an XCOFF64 file, and the names of symbols longer than 8 bytes for an XCOFF32 file. Each string consists of a 2-byte length field followed by the string.

Table 19. Loader Section String Table
Offset Length in Bytes Description
0 2 Length of string.
2 n Symbol name string (null-delimited) or parameter type string (not null-delimited).


Fields repeat for each string.

Symbol names are null-terminated. The value in the length-field includes the length of the string plus the length of the null terminator but does not include the length of the length field itself.

The parameter type-checking strings contain binary values and are not null-terminated. The value in the length field includes the length of the string only but does not include the length of the length field itself.

The symbol table entries of the loader section contain a byte offset value that points to the first byte of the string instead of to the length field.

Loader Section Header Contents

The contents of the section header fields for the loader section are:

Name Contents
s_name .loader
s_paddr 0
s_vaddr 0
s_size The size (in bytes) of the loader section
s_scnptr Offset from the beginning of the XCOFF file to the first byte of the loader section data
s_relptr 0
s_lnnoptr 0
s_nreloc 0
s_nlnno 0
s_flags STYP_LOADER

For general information on the XCOFF file format, see "XCOFF Object File Format."

For more information on XCOFF file sections, see "Sections and Section Headers," "Debug Section," "Type-Check Section," "Exception Section," and "Comment Section."

Debug Section

The debug section contains the symbolic debugger stabstrings (symbol table strings). It is generated by the compilers and assemblers. It provides symbol attribute information for use by the symbolic debugger. The debug section has a section type flag of STYP_DEBUG in the XCOFF section header. By convention, .debug is the debug section name. The data in this section is referenced from entries in the XCOFF symbol table. A stabstring is a null-terminated character string. Each string is preceded by a 2-byte length field in XCOFF32 or a 4-byte length field in XCOFF64.

Field Definitions

The following two fields are repeated for each symbolic debugger stabstring:

Refer to discussion of symbolic debugger stabstring grammar for the specific format of the stabstrings.

Debug Section Header Contents

The contents of the section header fields for the debug section are:

Name Contents
s_name .debug
s_paddr 0
s_vaddr 0
s_size The size (in bytes) of the debug section
s_scnptr Offset from the beginning of the XCOFF file to the first byte of the debug section data
s_relptr 0
s_lnnoptr 0
s_nreloc 0
s_nlnno 0
s_flags STYP_DEBUG

For general information on the XCOFF file format, see "XCOFF Object File Format."

For more information on XCOFF file sections, see "Sections and Section Headers," "Debug Section," "Type-Check Section,", "Exception Section," and "Comment Section."

Type-Check Section

The type-check section contains the type-checking hash strings and is produced by compilers and assemblers. It is used by the binder to detect variable mismatches and argument interface errors when linking separately compiled object files. (The type-checking hash strings in the loader section are used to detect these errors prior to running a program.) The type-check section has a section type flag of STYP_TYPCHK in the XCOFF section header. By convention, .typchk is the type-check section name. The strings in this section are referenced from entries in the XCOFF symbol table.

Field Definitions

The following two fields are repeated for each parameter type-checking string:

Type Encoding and Checking Format for Data

The type-checking hash strings are used to detect errors prior to execution of a program. Information about all external symbols (data and functions) is encoded by the compilers and then checked for consistency at bind time and load time. The type-checking strings are designed to enforce the maximum checking required by the semantics of each particular language supported, as well as provide protection to applications written in more than one language.

The type encoding and checking mechanism features 4-part hash encoding that provides some flexibility in checking. The mechanism also uses a unique value, UNIVERSAL, that matches any code. The UNIVERSAL hash can be used as an escape mechanism for assembly programs or for programs in which type information or subroutine interfaces might not be known. The UNIVERSAL hash is four blank ASCII characters (0x20202020) or four null characters (0x00000000).

The following fields are associated with the type encoding and checking mechanism:

code length A 2-byte field containing the length of the hash. This field has a value of 10.
language identifier A 2-byte code representing each language. These codes are the same as those defined for the e_lang field in the "Exception Section" information .
general hash A 4-byte field representing the most general form by which a data symbol or function can be described. This form is the most common to languages supported by . If the information is incomplete or unavailable, a universal hash should be generated. The general hash is language-independent and must match for the binding to succeed.
language hash A 4-byte field containing a more detailed, language-specific representation of what is in the general hash. It allows for the strictest type-checking required by a given language. This part is used in intra-language binding and is not checked unless both symbols have the same language identifier.

Section Header Contents

The contents of the section header fields for the type-check section are:

Name Contents
s_name .typchk
s_paddr 0
s_vaddr 0
s_size The size (in bytes) of the type-check section
s_scnptr Offset from the beginning of the XCOFF file to the first byte of the type-check section data
s_relptr 0
s_lnnoptr 0
s_nreloc 0
s_nlnno 0
s_flags STYP_TYPCHK.

For general information on the XCOFF file format, see "XCOFF Object File Format."

For more information on XCOFF file sections, see "Sections and Section Headers," "Debug Section," "Type-Check Section," "Exception Section," and "Comment Section."

Exception Section

The exception section contains addresses of trap instructions, source language identification codes, and trap reason codes. This section is produced by compilers and assemblers, and used during or after run time to identify the reason that a specific trap or exception occurred. The exception section has a section type flag of STYP_EXCEPT in the XCOFF section header. By convention, .except is the exception section name. Data in the exception section is referenced from entries in the XCOFF symbol table.

An exception table entry with a value of 0 in the e_reason field contains the symbol table index to a function's C_EXT, C_WEAKEXT, or C_HIDEXT symbol table entry. Reference from the symbol table to an entry in the exception table is via the function auxiliary symbol table entry. For more information on this entry, see "csect Auxiliary Entry for C_EXT, C_WEAKEXT and C_HIDEXT Symbols."

The C language structure for the exception section entries can be found in the exceptab.h file.

The exception section entries contain the fields shown in the following tables.

Table 20. Initial Entry: Exception Section Structure
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 4 0 4 e_addr.e_symndx+ Symbol table index for function
4 1 8 1 e_lang+ Compiler language ID code
5 1 9 1 e_reason+ Value 0 (exception reason code 0)
+Use "32" or "64" suffix when __XCOFF_HYBRID__ is defined. With e_addr.e_symndx, the suffix is added to e_addr (i.e. e_addr32.e_symndx).
Table 21. Subsequent Entry: Exception Section Structure
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 4 0 8 e_addr.e_paddr+ Address of the trap instruction
4 1 8 1 e_lang+ Compiler language ID code
5 1 9 1 e_reason+ Trap exception reason code
+Use "32" or "64" suffix when __XCOFF_HYBRID__ is defined. With e_addr.e_paddr, the suffix is added to e_addr (i.e. e_addr32.e_paddr).

Field Definitions

The following defines the fields listed of the exception section:

e_symndx Contains an integer (overlays the e_paddr field). When the e_reason field is 0, this field is the symbol table index of the function.
e_paddr Contains a virtual address (overlays the e_symndx field). When the e_reason field is nonzero, this field is the virtual address of the trap instruction.
e_lang Specifies the source language. The following list defines the possible values of the e_lang field.
ID
Language
0x00
C
0x01
FORTRAN
0x02
Pascal
0x03
Ada
0x04
PL/I
0x05
BASIC
0x06
Lisp
0x07
COBOL
0x08
Modula2
0x09
C++
0x0A
RPG
0x0B
PL8, PLIX
0x0C
Assembly
0x0D-0xFF
Reserved
e_reason Specifies an 8-bit, compiler-dependent trap exception reason code. Zero is not a valid trap exception reason code because it indicates the start of exception table entries for a new function.

Section Header Contents

The following fields are the contents of the section header fields for the exception section.

Name Contents
s_name .except
s_paddr 0
s_vaddr 0
s_size The size (in bytes) of the exception section
s_scnptr Offset from the beginning of the XCOFF file to the first byte of the exception section data
s_relptr 0
s_lnnoptr 0
s_nreloc 0
s_nlnno 0
s_flags STYP_EXCEPT

For general information on the XCOFF file format, see "XCOFF Object File Format."

For more information on XCOFF file sections, see "Sections and Section Headers," "Debug Section," "Type-Check Section," "Exception Section," and "Comment Section."

Comment Section

The comment section contains information of special processing significance to an application. This section can be produced by compilers and assemblers and used during or after run time to fulfill a special processing need of an application. The comment section has a section type flag of STYP_INFO in the XCOFF section header. By convention, .info is the comment section name. Data in the comment section is referenced from C_INFO entries in the XCOFF symbol table.

The contents of a comment section consists of repeated instances of a 4-byte length field followed by a string of bytes (containing any binary value). The length of each string is stored in its preceding 4-byte length field. The string of bytes need not be terminated by a null character nor by any other special character. The specified length does not include the length of the length field itself. A length of 0 is allowed. The format of the string of bytes is not specified.

A comment section string is referenced from an entry in the XCOFF symbol table. The storage class of the symbol making a reference is C_INFO. See "Symbol Table Field Contents by Storage Class" for more information.

A C_INFO symbol is associated with the nearest C_FILE, C_EXT, C_WEAKEXT, or C_HIDEXT symbol preceding it.

Section Header Contents

The following fields are the contents of the section header fields for the comment section.

Name Contents
s_name .info
s_paddr 0
s_vaddr 0
s_size The size (in bytes) of the comment section
s_scnptr Offset from the beginning of the XCOFF file to the first byte of the comment section data
s_relptr 0
s_lnnoptr 0
s_nreloc 0
s_nlnno 0
s_flags STYP_INFO

For general information on the XCOFF file format, see "XCOFF Object File Format."

For more information on XCOFF file sections, see "Sections and Section Headers," "Debug Section," "Type-Check Section," "Exception Section," and "Comment Section."

Relocation Information for XCOFF File (reloc.h)

The .text section and .data section may have relocation information. The relocation information is used by the binder to modify the .text section and .data section contents with address and byte-offset information of individual XCOFF object files collected into an XCOFF executable file.

The compilers and assemblers are responsible for generating the relocation entries for the .text and .data sections.

The binder generates relocation information for the .loader section, as required by the system loader.

Each relocation entry of the .text and .data section is 10 bytes long (14 for XCOFF64). (A relocation entry in the .loader section is 12 bytes long (16 for XCOFF64) and is explained in the loader section description in this document. See "Relocation Table Field Definitions" for more information.) The C language structure for a relocation entry can be found in the reloc.h file. A relocation entry contains the fields shown in the following table.

Table 22. Relocation Entry Structure
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 4 0 8 r_vaddr+ Virtual address (position) in section to be relocated
4 4 8 4 r_symndx+ Symbol table index of item that is referenced
8 1 12 1 r_rsize+ Relocation size and information
9 1 13 1 r_rtype+ Relocation type
+Use "32" or "64" suffix when __XCOFF_HYBRID__ is defined.

The relocation entries for the .text and .data sections are part of their respective sections. The relocation entry refers to a location to be modified. The relocation entries for a section must be in ascending address order.

(The loader section contains a single set of relocation entries used by the system loader, so a section number is required within each relocation entry to identify the section that needs to be modified.)

Field Definitions

The following defines the relocation-information fields:

r_vaddr Specifies the virtual address of the value that requires modification by the binder. The byte offset value to the data that requires modification from the beginning of the section that contains the data can be calculated as follows:

offset_in_section = r_vaddr - s_paddr

r_symndx Specifies a zero-based index into the XCOFF symbol table for locating the referenced symbol. The symbol table entry contains an address used to calculate a modification value to be applied at the r_vaddr relocation address.
r_rsize Specifies the relocation size and sign. Its contents are detailed in the following list:
0x80 (1 bit)
Indicates whether the relocation reference is signed (1) or unsigned (0).
0x40 (1 bit)
If this field is one, it indicates that the binder replaced the original instruction by a branch instruction to a special fixup instruction sequence.
0x3F(6 bits)
Specifies the bit length of the relocatable reference minus one. The current architecture allows for fields of up to 32 bits (XCOFF32) or 64 bits (XCOFF64) to be relocated.
r_rtype Specifies an 8-bit relocation type field that indicates to the binder which relocation algorithm to use for calculating the modification value. This value is applied at the relocatable reference location specified by the r_vaddr field. The following relocation types are defined:
0x00
R_POS

Specifies positive relocation. Provides the address of the symbol specified by the r_symndx field.

0x01
R_NEG

Specifies negative relocation. Provides the negative of the address of the symbol specified by the r_symndx field.

0x02
R_REL

Specifies relative-to-self relocation. Provides a displacement value between the address of the symbol specified by the r_symndx field and the address of the csect to be modified.

0x03
R_TOC

Specifies relative-to-TOC relocation. Provides a displacement value that is the difference between the address value in the symbol specified by the r_symndx field and the address of the TOC anchor csect. The TOC anchor csect has a symbol table csect auxiliary entry with an x_smclass (storage mapping class) value of XMC_TC0. The TOC anchor csect must be of zero length. There may be only one TOC anchor csect per XCOFF section.

0x04
R_TRL

Specifies TOC Relative Indirect Load (modifiable) relocation. Provides a displacement value that is the difference between the address value in the symbol specified by the r_symndx field and the address of the TOC anchor csect. This relocation entry is treated the same as an R_TOC relocation entry. It provides the following additional information concerning the instruction being relocated: The instruction that is referenced by the r_vaddr field is a load instruction. That load instruction is permitted to be modified by the binder to become a compute address instruction. Changing an instruction from a load instruction to a compute address instruction avoids a storage reference during execution. A compute address instruction can be used if the address contained at the address specified by the r_symndx field has a value that itself references a r_symndx field that can be accessed with a valid in-range displacement relative to the TOC anchor address. That is, the target of the TOC entry is from -32,768 to 32,767, inclusive, from the TOC anchor address. If a compute address instruction is generated by the binder, the R_TRL relocation type is changed to become a R_TRLA type. This allows the reverse transformation, if required. Compilers are permitted to generate this relocation type.

0x13
R_TRLA

Specifies TOC Relative Load Address (modifiable LA to L) relocation. Provides a displacement value that is the difference between the address value in the symbol specified by the r_symndx field and the address of the TOC anchor csect. This relocation entry is treated the same as an R_TOC relocation entry. It provides the following additional information concerning the instruction being relocated: The instruction that is referenced by the r_vaddr field is a compute address instruction. The compute address instruction is modified by the binder to become a load instruction whenever the calculated displacement value is outside the valid displacement range relative to the TOC anchor address. This relocation type provides the binder with a means to transform a compute address instruction into a load instruction whenever required. If a load instruction is generated by the binder, the R_TRLA relocation type is changed to become an R_TRL type. Compilers are not permitted to generate this relocation type.

r_rtype continued
0x05
R_GL

Specifies Global Linkage-External TOC address relocation. Provides the address of the TOC associated with a defined external symbol. The external symbol with the required TOC address is specified by the r_symndx field of the relocation entry. This relocation entry provides a method of accessing the address of the TOC contained within the same executable where the r_symndx external symbol is defined.

0x06
R_TCL

Specifies local object TOC address relocation. Provides the address of the TOC associated with a defined external symbol. The external symbol for which the TOC address is required is specified by the r_symndx field of the relocation entry. The external symbol is defined locally within the resultant executable. This relocation entry provides a method of accessing the address of the TOC contained within the same executable where the r_symndx external symbol is defined.

0x0C
R_RL

Treated the same as the R_POS relocation type.

0x0D
R_RLA

Treated the same as the R_POS relocation type.

0x0F
R_REF

Specifies a nonrelocating reference to prevent garbage collection (by the binder) of a symbol. This relocation type is intended to provide compilers and assemblers a method to specify that a given csect has a dependency upon another csect without using any space in the actual csect. The reason for making the dependency reference is to prevent the binder from garbage-collecting (eliminating) a csect for which another csect has an implicit dependency.

0x08
R_BA

Treated the same as the R_RBA relocation type.

0x18
R_RBA

Specifies branch absolute relocation. Provides the address of the symbol specified by the r_symndx field as the target address of a branch instruction. The instruction can be modified to a (relative) branch instruction if the target address is relocatable.

0x0A
R_BR

Treated the same as the R_RBR relocation type.

0x1A
R_RBR

Specifies (relative) branch relocation. Provides a displacement value between the address of the symbol specified by the r_symndx field and the address of the csect containing the branch instruction to be modified. The instruction can be modified to an absolute branch instruction if the target address is not relocatable.

The R_RBR relocation type is the standard branch relocation type used by compilers and assemblers for the . This relocation type along with glink code allows an executable object file to have a text section that is position-independent.

Additional Relocation Features

Standard practice is to retain relocation information only for unresolved references or references between distinct sections. Once a reference is resolved, the relocation information is discarded. This is sufficient for an incremental bind and a fixed address space model. To provide the capability for rebinding and handling a relocatable address space model, the relocation information is not discarded from an XCOFF file.

For general information on the XCOFF file format, see "XCOFF Object File Format."

For more information on relocation field table definitions, see "Relocation Table Field Definitions" in the loader section.

Line Number Information for XCOFF File (linenum.h)

Line number entries are used by the symbolic debugger to debug code at the source level. When present, there is a single line number entry for every source line that can have a symbolic debugger breakpoint. The line numbers are grouped by function. The beginning of each function is identified by the l_lnno field containing a value of 0. The first field, l_symndx , is the symbol table index to the C_EXT, C_WEAKEXT, or C_HIDEXT symbol table entry for the function.

Each line number entry is six bytes long. The C language structure for a line number entry can be found in the linenum.h file. A line number entry contains the fields shown in the following tables.

Table 23. Initial Line Number Structure Entry for Function
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 4 0 4 l_ addr.l_ symndx+ Symbol table index for function
4 2 8 4 l_ lnno+ Value 0 (line number 0)
+Use "32" or "64" suffix when __XCOFF_HYBRID__ is defined. With l_addr.l_symndx, the suffix is added to l_addr (i.e. l_addr32.l_symndx).
Table 24. Subsequent Line Number Entries for Function
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 4 0 8 l_paddr+ Address at which break point can be inserted
4 2 8 4 l_lnno+ Line number relative to start of function
+Use "32" or "64" suffix when __XCOFF_HYBRID__ is defined. With l_addr.l_paddr, the suffix is added to l_addr (i.e. l_addr32.l_paddr).

Field Definitions

The following list defines the line number entries:

l_symndx Specifies the symbol table index to the function name (overlays the l_paddr field). When the l_lnno field is 0, this interpretation of the field is used.
l_paddr Specifies the virtual address of the first instruction of the code associated with the line number (overlays the l_symndx field). When the l_lnno field is not 0, this interpretation of the field is used.
l_lnno Specifies either the line number relative to the start of a function or 0 to indicate the beginning of a function.
Note
If part of a function other than the beginning comes from an include file, the line numbers are absolute, rather than relative to the beginning of the function. (See the C_BINCL and C_EINCL symbol types in "Storage Classes by Usage and Symbol Value Classification" for more information.)

For general information on the XCOFF file format, see "XCOFF Object File Format."

For information on debugging, see "Debug Section."

Symbol Table Information

One composite symbol table is defined for an XCOFF file. The symbol table contains information required by both the binder (external symbols) and the symbolic debugger (function definitions and internal and external symbols).

The symbol table consists of a list of 18-byte, fixed-length entries. Each symbol represented in the symbol table consists of at least one fixed-length entry, and some are followed by auxiliary entries of the same size.

See the following information to learn more about the symbol table:

For each external symbol, one or more auxiliary entries are required that provide additional information concerning the external symbol. There are three major types of external symbols of interest to the binder, performing the following functions:

For symbols defining a replaceable unit (csect), a csect auxiliary entry defines the length and storage-mapping class of the csect. For symbols defining external names for functions within a csect, the csect auxiliary entry points to the containing csect, the parameter type-checking information, and the symbolic debugger information for the function. For symbols referencing the name of an external function, a csect auxiliary entry identifies the symbol as an external reference and points to parameter type-checking information.

Symbol Table Contents

An XCOFF symbol table has the following general contents and ordering:

The ordering of the symbol table must be arranged by the compilers and assemblers both to accommodate the symbolic debugger requirements and to permit effective management by the binder of the different sections of the object file as a result of such binder actions as garbage collection, incremental binding, and rebinding. This ordering is required by the binder so that if a csect is deleted or replaced, all the symbol table information associated with the csect can also be deleted or replaced. Likewise, if all the csects associated with a source file are deleted or replaced, all the symbol table and related information associated with the file can also be deleted or replaced.

Symbol Table Layout

The following example shows the general ordering of the symbol table.

un_external      Undefined global symbols

.file                Prolog --defines stabstring compaction level
.file                Source file 1
  .info              Comment section reference symbol with file scope
  stab               Global Debug symbols of a file
  csect              Replaceable unit definition (code)
     .info           Comment section reference symbol with csect scope
     function        Local/External function
         stab        Debug and local symbols of function
     function        Local/External function
         stab        Debug and local symbols of function
  ..............
  csect              Replaceable unit definition (local statics)
         stab        Debug and local statics of file
  ..............
  csect              Relocatable unit definition (global data)
         external    Defined global symbol
         stab        Debug info for global symbol
  ..............
.file                Source file 2
  stab               Global Debug symbols of a file
  csect              Replaceable unit definition (code)
         function    Local/External function
             stab    Debug and local symbols of function
  ..............
  csect              Replaceable unit definition (local statics)
      stab           Debug and Local statics of file
  ..............
  csect              Replaceable unit definition (global data)
      external       Defined global symbol
          stab       Debug info for global symbol
.file                Source file
  ..............
Symbol Table Entry (syms.h)

Each symbol, regardless of storage class and type, has a fixed-format entry in the symbol table. In addition, some symbol types may have additional (auxiliary) symbol table entries immediately following the fixed-format entry. Each entry in the symbol table is 18 bytes long. The C language structure for a symbol table entry can be found in the syms.h file. The index for the first entry in the symbol table is 0. The following table shows the structure of the fixed-format part of each symbol in the symbol table.

Table 25. Symbol Table Entry Format
XCOFF32 XCOFF64 Name Description
Offset Length Offset Length
0 8 N/A n_name Symbol name (occupies the same 8 bytes as n_zeroes and n_offset)
0 4 N/A n_zeroes Zero, indicating name in string table or .debug section (overlays first 4 bytes of n_name)
4 4 8 4 n_offset+ Offset of the name in string table or .debug section (In XCOFF32: overlays last 4 bytes of n_name)
8 4 0 8 n_value+ Symbol value; storage class-dependent
12 2 12 2 n_scnum Section number of symbol
14 2 14 2 n_type Basic and derived type specification
14 1 14 1 n_lang Source language ID (overlays first byte of n_type)
15 1 15 1 n_cpu