| About this Manual |
| Audience |
| Necessity |
| Organization |
| Related Documents |
| Reader's Comments |
| Conventions |
| 1 | Introduction |
| 1.1 | Definitions |
| 1.2 | History and Applicability |
| 1.3 | Producers and Consumers |
| 1.3.1 | Compilers |
| 1.3.2 | Assemblers |
| 1.3.3 | Linkers |
| 1.3.4 | Loaders |
| 1.3.5 | Debuggers |
| 1.3.6 | Object Instrumentation Tools |
| 1.3.6.1 | Post-Link Optimizers |
| 1.3.6.2 | Profiling Tools |
| 1.3.7 | Archivers |
| 1.3.8 | Miscellaneous Object Tools |
| 1.3.8.1 | Object Dumpers |
| 1.3.8.2 | Object Manipulators |
| 1.4 | Object File Overview |
| 1.4.1 | Main Components of Object Files |
| 1.4.1.1 | Object File Headers |
| 1.4.1.2 | Instructions and Data |
| 1.4.1.3 | Object File Relocation Information |
| 1.4.1.4 | Symbol Table |
| 1.4.1.5 | Dynamic Loading Information |
| 1.4.1.6 | Comment Section |
| 1.4.2 | Kinds of Object Files |
| 1.4.3 | Object File Compression |
| 1.4.4 | Object Archives |
| 1.4.5 | Object File Versioning |
| 1.4.6 | Object File Abstract Data Types |
| 1.5 | Source Language Support |
| 1.6 | System Dependencies |
| 1.7 | Architectural Dependencies |
| 1.8 | Relevant Header Files |
| 2 | Headers |
| 2.1 | New or Changed Header Features |
| 2.2 | Structures, Fields, and Values for Headers |
| 2.2.1 | File Header (filehdr.h) |
| 2.2.2 | a.out Header (aouthdr.h) |
| 2.2.3 | Section Headers (scnhdr.h) |
| 2.3 | Header Usage |
| 2.3.1 | Object Recognition |
| 2.3.2 | Image Layout |
| 2.3.2.1 | OMAGIC |
| 2.3.2.2 | NMAGIC |
| 2.3.2.3 | ZMAGIC |
| 2.3.3 | Address Space |
| 2.3.3.1 | Address Selection |
| 2.3.3.2 | TASO Address Space |
| 2.3.4 | GP (Global Pointer) Ranges |
| 2.3.5 | Alignment |
| 2.3.6 | Section Types |
| 2.3.7 | Special Symbols |
| 2.3.7.1 | Accessing |
| 2.4 | Language-Specific Header Features |
| 3 | Instructions and Data |
| 3.1 | New or Changed Instructions and Data Features |
| 3.2 | Structures, Fields, and Values for Instructions and Data |
| 3.2.1 | Code Range Descriptor (pdsc.h) |
| 3.2.2 | Run-time Procedure Descriptor (pdsc.h) |
| 3.3 | Instructions and Data Usage |
| 3.3.1 | Minimal Objects |
| 3.3.2 | Position-Independent Code (PIC) |
| 3.3.3 | Lazy-Text Stubs |
| 3.3.4 | Constant Data |
| 3.3.5 | INIT/FINI Driver Routines |
| 3.3.5.1 | Linking |
| 3.3.5.2 | Execution Order |
| 3.3.5.2.1 | Dynamic Executables |
| 3.3.5.2.2 | Static Executables |
| 3.3.5.2.3 | Ordering Within Objects |
| 3.3.5.2.4 | Subsystem Control of INIT/FINI Order |
| 3.3.6 | Initialized Data and Zero-Initialized Data (bss) |
| 3.3.7 | Permissions/Protections |
| 3.3.8 | Exception Handling Data |
| 3.3.9 | Thread Local Storage (TLS) Data |
| 3.3.10 | User Text and User Data Sections |
| 3.4 | Language-Specific Instructions and Data Features |
| 4 | Relocation |
| 4.1 | New or Changed Relocations Features |
| 4.2 | Structures, Fields, and Values for Relocations |
| 4.2.1 | Relocation Entry (reloc.h) |
| 4.2.2 | Compact Relocation Subsection (of .comment section) |
| 4.2.3 | Section Header |
| 4.3 | Relocations Usage |
| 4.3.1 | Relocatable Objects |
| 4.3.2 | Relocation Processing |
| 4.3.2.1 | Local and External Entries |
| 4.3.2.2 | Relocation Entry Ordering |
| 4.3.2.3 | Shared Object Transformation |
| 4.3.3 | Kinds of Relocations |
| 4.3.3.1 | Direct Relocations |
| 4.3.3.2 | GP-Relative Relocations |
| 4.3.3.3 | Self-Relative (PC-Relative) Relocations |
| 4.3.3.4 | Literal Relocations |
| 4.3.3.5 | Relocation Stack Expressions |
| 4.3.3.6 | Immediate Relocations |
| 4.3.3.7 | TLS Relocations |
| 4.3.4 | Relocation Entry Types |
| 4.3.4.1 | R_ABS |
| 4.3.4.2 | R_REFLONG |
| 4.3.4.3 | R_REFQUAD |
| 4.3.4.4 | R_GPREL32 |
| 4.3.4.5 | R_LITERAL |
| 4.3.4.6 | R_LITUSE: R_LU_BASE |
| 4.3.4.7 | R_LITUSE: R_LU_JSR |
| 4.3.4.8 | R_GPDISP |
| 4.3.4.9 | R_BRADDR |
| 4.3.4.10 | R_HINT |
| 4.3.4.11 | R_SREL16 |
| 4.3.4.12 | R_SREL32 |
| 4.3.4.13 | R_SREL64 |
| 4.3.4.14 | R_OP_PUSH |
| 4.3.4.15 | R_OP_STORE |
| 4.3.4.16 | R_OP_PSUB |
| 4.3.4.17 | R_OP_PRSHIFT |
| 4.3.4.18 | R_GPVALUE |
| 4.3.4.19 | R_GPRELHIGH |
| 4.3.4.20 | R_GPRELLOW |
| 4.3.4.21 | R_IMMED: GP16 |
| 4.3.4.22 | R_IMMED: GP_HI32 |
| 4.3.4.23 | R_IMMED: SCN_HI32 |
| 4.3.4.24 | R_IMMED: BR_HI32 |
| 4.3.4.25 | R_IMMED: LO32 |
| 4.3.4.26 | R_TLS_LITERAL |
| 4.3.4.27 | R_TLS_HIGH |
| 4.3.4.28 | R_TLS_LOW |
| 4.4 | Compact Relocations |
| 4.4.1 | Overview |
| 4.4.2 | File Format |
| 4.4.2.1 | Compact Relocations Version |
| 4.4.2.2 | Compact Relocations File Header |
| 4.4.2.3 | Compact Relocations Section Header |
| 4.4.2.4 | Compact Relocations Table |
| 4.4.2.5 | Stack Relocation Table |
| 4.4.2.6 | GP Value Tables |
| 4.4.3 | Detailed Algorithm for Compact Relocations Production |
| 4.4.4 | Detailed Algorithm for Compact Relocations Consumption |
| 4.5 | Language-Specific Relocations Features |
| 5 | Symbol Table (V3.13) |
| 5.1 | New or Changed Symbol Table Features |
| 5.2 | Structures, Fields and Values for Symbol Tables |
| 5.2.1 | Symbolic Header (HDRR) |
| 5.2.2 | File Descriptor Entry (FDR) |
| 5.2.3 | Procedure Descriptor Entry (PDR) |
| 5.2.4 | Line Number Entry (LINER) |
| 5.2.5 | Local Symbol Entry (SYMR) |
| 5.2.6 | External Symbol Entry (EXTR) |
| 5.2.7 | Relative File Descriptor Entry (RFDT) |
| 5.2.8 | Auxiliary Symbol Table Entry (AUXU) |
| 5.2.8.1 | Type Information Record (TIR) |
| 5.2.8.2 | Relative Symbol Record (RNDXR) |
| 5.2.9 | String Table |
| 5.2.10 | Optimization Symbol Entry (PPODHDR) |
| 5.2.11 | Symbol Type and Class (st/sc) Combinations |
| 5.3 | Symbol Table Usage |
| 5.3.1 | Levels of Symbolic Information |
| 5.3.1.1 | Compilation Levels |
| 5.3.1.2 | Locally Stripped Images |
| 5.3.1.3 | (Fully) Stripped Images |
| 5.3.2 | Source Information |
| 5.3.2.1 | Source Files |
| 5.3.2.2 | Line Number Information |
| 5.3.2.2.1 | The Line Number Table |
| 5.3.2.2.2 | Extended Source Location Information (ESLI) |
| 5.3.3 | Optimization Symbols |
| 5.3.4 | Run-Time Information |
| 5.3.4.1 | Stack Frames |
| 5.3.4.2 | Procedure Addresses |
| 5.3.4.3 | Local Symbol Addresses |
| 5.3.4.4 | Uplevel Links |
| 5.3.4.5 | Finding Thread Local Storage (TLS) Symbols |
| 5.3.5 | Profile Feedback Data |
| 5.3.6 | Scopes |
| 5.3.6.1 | Procedure Scope |
| 5.3.6.2 | File Scope |
| 5.3.6.3 | Block Scope |
| 5.3.6.4 | Namespaces (C++) |
| 5.3.6.4.1 | Namespace Components |
| 5.3.6.4.2 | Namespace Aliases |
| 5.3.6.4.3 | Unnamed Namespace |
| 5.3.6.4.4 | Usage of Namespaces |
| 5.3.6.5 | Exception Handling Blocks (C++) |
| 5.3.6.6 | Common Blocks (Fortran) |
| 5.3.6.7 | Alternate Entry Points |
| 5.3.7 | Data Types in the Symbol Table |
| 5.3.7.1 | Basic Types |
| 5.3.7.2 | Type Qualifiers |
| 5.3.7.3 | Interpreting Type Descriptions in the Auxiliary Table |
| 5.3.8 | Individual Type Representations |
| 5.3.8.1 | Pointer Type |
| 5.3.8.2 | Array Type |
| 5.3.8.3 | Structure, Union, and Enumerated Types |
| 5.3.8.4 | Typedef Type |
| 5.3.8.5 | Function Pointer Type |
| 5.3.8.6 | Class Type (C++) |
| 5.3.8.6.1 | Empty Class or Structure (C++) |
| 5.3.8.6.2 | Base and Derived Classes (C++) |
| 5.3.8.7 | Template Type (C++) |
| 5.3.8.8 | Interlude Type (C++) |
| 5.3.8.9 | Array Descriptor Type (Fortran90) |
| 5.3.8.10 | Conformant Array Type (Pascal) |
| 5.3.8.11 | Variant Record Type (Pascal and Ada) |
| 5.3.8.12 | Subrange Type (Pascal and Ada) |
| 5.3.8.13 | Set Type (Pascal) |
| 5.3.9 | Special Debug Symbols |
| 5.3.10 | Symbol Resolution |
| 5.3.10.1 | Library Search |
| 5.3.10.2 | Resolution of Symbols with Common Storage Class |
| 5.3.10.3 | Mangling and Demangling |
| 5.3.10.4 | Mixed Language Resolution |
| 5.3.10.5 | TLS Symbols |
| 5.4 | Language-Specific Symbol Table Features |
| 5.4.1 | Fortran77 and Fortran90 |
| 5.4.2 | C++ |
| 5.4.3 | Pascal and Ada |
| 6 | Dynamic Loading Information |
| 6.1 | New or Changed Dynamic Loading Information Features |
| 6.2 | Structures, Fields, and Values for Dynamic Loading Information |
| 6.2.1 | Dynamic Header Entry |
| 6.2.2 | Dynamic Symbol Entry |
| 6.2.3 | Dynamic Relocation Entry |
| 6.2.4 | Msym Table Entry |
| 6.2.5 | Library List Entry |
| 6.2.6 | Conflict Entry |
| 6.2.7 | GOT Entry |
| 6.2.8 | Hash Table Entry |
| 6.2.9 | Dynamic String Table |
| 6.3 | Dynamic Loading Information Usage |
| 6.3.1 | Shared Object Identification |
| 6.3.2 | Shared Library Dependencies |
| 6.3.2.1 | Identification |
| 6.3.2.2 | Searching |
| 6.3.2.3 | Validation |
| 6.3.2.3.1 | Backward Compatibility |
| 6.3.2.4 | Loading |
| 6.3.2.4.1 | Dynamic Loading and Unloading |
| 6.3.3 | Dynamic Symbol Information |
| 6.3.3.1 | Symbol Look-Up |
| 6.3.3.2 | Scope and Binding |
| 6.3.3.3 | Multiple GOT Representation |
| 6.3.3.4 | Msym Table |
| 6.3.3.5 | Hash Table |
| 6.3.4 | Dynamic Symbol Resolution |
| 6.3.4.1 | Symbol Preemption and Namespace Pollution |
| 6.3.4.2 | Weak Symbols |
| 6.3.4.3 | Search Order |
| 6.3.4.4 | Precedence |
| 6.3.4.5 | Lazy Text Resolution |
| 6.3.4.6 | Levels of Resolution |
| 6.3.5 | Dynamic Relocation |
| 6.3.6 | Quickstart |
| 6.3.6.1 | Quickstart Levels |
| 6.3.6.2 | Conflict Table |
| 6.3.6.3 | Repairing Quickstart |
| 7 | Comment Section |
| 7.1 | New and Changed Comment Section Features |
| 7.2 | Structures, Fields, and Values of the Comment Section |
| 7.2.1 | Subsection Headers |
| 7.2.2 | Tag Descriptor Entry |
| 7.2.2.1 | Comment Section Flags |
| 7.3 | Comment Section Usage |
| 7.3.1 | Comment Section Formatting Requirements |
| 7.3.2 | Comment Section Contents |
| 7.3.3 | Comment Section Processing |
| 7.3.4 | Special Comment Subsections |
| 7.3.4.1 | Tag Descriptors (CM_TAGDESC) |
| 7.3.4.2 | Tool Version Information (CM_TOOLVER) |
| 8 | Archives |
| 8.1 | Structures, Fields, and Values for Archives |
| 8.1.1 | Archive Magic String |
| 8.1.2 | Archive Header |
| 8.1.3 | Hash Table (ranlib) Structure |
| 8.2 | Archive Implementation |
| 8.2.1 | Archive File Format |
| 8.2.2 | Symdef File Implementation |
| 8.3 | Archive Usage |
| 8.3.1 | Role As Libraries |
| 8.3.2 | Portability |
| 9 | Examples |
| 9.1 | C |
| 9.1.1 | Unnamed Structure |
| 9.2 | C++ |
| 9.2.1 | Base and Derived Classes |
| 9.2.2 | Virtual Function Tables and Interludes |
| 9.2.3 | Namespace Definitions and Uses |
| 9.2.4 | Unnamed Namespaces |
| 9.2.5 | Namespace Aliases |
| 9.2.6 | Exception-Handling |
| 9.3 | Fortran |
| 9.3.1 | Common Data |
| 9.3.2 | Alternate Entry Points |
| 9.3.3 | Array Descriptors |
| 9.4 | Pascal |
| 9.4.1 | Sets |
| 9.4.2 | Subranges |
| 9.4.3 | Variant Records |
| Figures |
| 1-1 | Object File Producers and Consumers |
| 1-2 | Object File Contents |
| 1-3 | Object File Compression |
| 1-4 | LEB 128 Byte |
| 1-5 | LEB 128 Multi-Byte Data |
| 1-6 | Little Endian Byte Ordering |
| 2-1 | OMAGIC Layout |
| 2-2 | NMAGIC Layout |
| 2-3 | ZMAGIC Layout for Shared Object |
| 2-4 | ZMAGIC Layout for Static Executable Objects |
| 2-5 | Address Space Layout |
| 2-6 | TASO Address Space Layout |
| 2-7 | GP (Global Pointer) Ranges |
| 3-1 | Raw Data Sections of an Object File |
| 3-2 | INIT/FINI Routines in Shared Objects |
| 3-3 | INIT/FINI Recognition in Archive Libraries |
| 3-4 | INIT/FINI Example (I) |
| 3-5 | INIT/FINI Example (II) |
| 3-6 | INIT/FINI Example (III) |
| 3-7 | INIT/FINI Example (IV) |
| 3-8 | Data and Bss Segment Layout (1) |
| 3-9 | Data and Bss Segment Layout (II) |
| 3-10 | Exception-Handling Data Structuers |
| 3-11 | Thread Local Storage Data Structures |
| 4-1 | Kinds of Relocations |
| 4-2 | Section Relocation Information in an Object File |
| 4-3 | Relocation Entry |
| 4-4 | External Relocation Entry |
| 4-5 | Processing an External Relocation Entry |
| 4-6 | Local Relocation Entry |
| 4-7 | Processing a Local Relocation Entry |
| 4-8 | Relocation Entry Ordering Requirements |
| 5-1 | Symbol Table Sections |
| 5-2 | Symbol Table Hierarchy |
| 5-3 | st/sc Combination Matrix |
| 5-4 | Relative File Descriptor Table Example |
| 5-5 | Line Number Table |
| 5-6 | Line Number Byte Format |
| 5-7 | Line Number 3-Byte Extended Format |
| 5-8 | ESLI Data Mode Bytes |
| 5-9 | ESLI Command Byte |
| 5-10 | Optimization Symbols Section |
| 5-11 | Fixed-Size Stack Frame |
| 5-12 | Variable-Size Stack Frame |
| 5-13 | Representation of Uplevel Reference |
| 5-14 | Basic Scopes |
| 5-15 | Procedure Representation |
| 5-16 | Procedure with No Text |
| 5-17 | File Representation |
| 5-18 | Block Representation |
| 5-19 | C++ Namespace Representation |
| 5-20 | C++ Exception Handler Representation |
| 5-21 | Fortran Common Block Representation |
| 5-22 | Alternate Entry Point Representation |
| 5-23 | Auxiliary Table Interpretation |
| 5-24 | Auxiliary Table "ti" Interpretation |
| 5-25 | Auxiliary Table "bt vals" Interpretation |
| 5-26 | Auxiliary Table "arrays" Interpretation |
| 5-27 | Auxiliary Table "range" Interpretation |
| 5-28 | Auxiliary Table "rndx" Interpretation |
| 5-29 | Pointer Representation |
| 5-30 | Array Representation |
| 5-31 | 64-Bit Array Representation |
| 5-33 | Structure Representation |
| 5-34 | Recursive Structure Representation |
| 5-35 | Nested Structure Representation |
| 5-36 | Typedef Representation |
| 5-37 | Function Pointer Representation |
| 5-38 | Class Representation |
| 5-39 | Empty Class or Structure (C++) |
| 5-40 | Base Class Representation |
| 5-41 | Interlude Representation |
| 5-42 | Array Descriptor Representation (I) |
| 5-43 | Array Descriptor Representation (II) |
| 5-44 | Variant Record Representation |
| 5-45 | Variant Record Representation (pre-V3.13) |
| 5-46 | Subrange Representation |
| 5-47 | 64-bit Range Representation |
| 5-48 | Set Representation |
| 6-1 | Dynamic Object File Sections |
| 6-2 | Shared Library Dependencies |
| 6-3 | Valid Shared Library with Multiple Versions |
| 6-4 | Invalid Shared Library with Multiple Versions |
| 6-5 | Dynamic Symbol Table and Multiple-GOT |
| 6-6 | Msym Table |
| 6-7 | Hash Table |
| 6-8 | Hashing Example |
| 6-9 | Namespace Pollution |
| 6-10 | Weak Symbol Resolution (I) |
| 6-11 | Weak Symbol Resolution (II) |
| 6-12 | Symbol Resolution Search Order |
| 6-13 | Conflict Entry Example |
| 7-1 | Comment Section Data Organization |
| 8-1 | Archive File Organization |
| 8-2 | Symdef File Hash Table |
| Tables |
| 1-1 | COFF Basic Abstract Types |
| 2-1 | File Header Magic Numbers |
| 2-2 | File Header Flags |
| 2-3 | a.out Header Magic Numbers |
| 2-4 | Section Header Constants for Section Names |
| 2-5 | Section Flags (s_flags field) |
| 2-6 | Special Symbols |
| 3-1 | Segment Access Permissions |
| 4-1 | Section Numbers for Local Relocation Entries |
| 4-2 | Relocation Types |
| 4-3 | Literal Usage Types |
| 4-4 | Immediate Relocation Types |
| 5-1 | Source Language (lang) Constants |
| 5-2 | Symbol Type (st) Constants |
| 5-3 | Storage Class (sc) Constants |
| 5-4 | Basic Type (bt) Constants |
| 5-5 | Type Qualifier (tq) Constants |
| 5-6 | Optimization Tag Values |
| 5-7 | Valid Placement for st/sc Combinations |
| 5-8 | Symbol Table Sections Produced at Various Compilation Levels |
| 5-9 | Line Number Example |
| 5-10 | ESLI Commands |
| 5-11 | ESLI Example |
| 5-12 | Symbol Table Entries with Associated Auxiliary Table Type Descriptions |
| 6-1 | Dynamic Array Tags (d_tag) |
| 6-2 | DT_FLAGS Flags |
| 6-3 | Dynamic Symbol Type (st_info) Constants |
| 6-4 | Dynamic Symbol Binding (st_info) Constants |
| 6-5 | Dynamic Section Index (st_shndx) Constants |
| 6-6 | Library List Flags |
| 6-7 | Dynamic Symbol Categories |
| 7-1 | Comment Section Tag Values |
| 7-2 | Strip Flags |
| 7-3 | Combine Flags |
| 7-4 | Modify Flags |
| 7-5 | Default System Tag Flags |
| 8-1 | Archive Magic Strings |
| Index |