64-bit ELF Object File Specification - Draft Version 2.5 MIPS Technologies / Silicon Graphics Computer Systems

 
CONTINUE READING
64-bit ELF Object
         File Specification
         Draft Version 2.5

         MIPS Technologies /
         Silicon Graphics Computer Systems

         Caveat: This document represents work in progress. It is incomplete and
         subject to change. In particular, lists of constants, sections, and attributes
         are may be incomplete or inaccurate in detail. Reference to the header
         files elf.h and sys/elf.h is recommended before reliance on the informa-
         tion herein.

Section 1 Introduction
         This document specifies the format of MIPS object files for 64-bit code.
         We assume as a basis the documents [ABI32], [ABI32M], and [ABI64].
         In addition, Silicon Graphics uses the DWARF debugging information
         format as specified in [DWARF]. Information in those documents should
         be considered valid unless contradicted here.

         The remainder of this section summarizes our objectives, approach, and
         open issues. Section 2 corresponds to ABI Section 4, describing ELF-64
Page   2                                                                        007-4658-001

               object files, and Section 3 corresponds to ABI Section 5, describing pro-
               gram loading and dynamic linking. Section 4 describes the 64-bit archive
               file format (from MIPS ABI Section 7), though it is not technically part
               of ELF.

           1.1 Objectives
               The objectives of this format definition fall in two categories. The first is
               simply to extend the base 32-bit ELF format, by increasing field sizes
               where appropriate, so that there will be no problems dealing with very
               large 64-bit programs. The second is to extend the kinds of information
               included in the object file to facilitate new features.
                  1. Remove 32-bit constraints on object file sizes.
                  2. Support checking and potential conversion of subprogram call in-
                     terfaces.
                  3. Support efficient and reliable application of performance monitor-
                     ing tools like pixie and object code optimization tools like cord.
                  4. Support efficient and reliable debugging facilities.

           1.2 Approach
               We start from the basis of the System V ABI and the MIPS symbol table
               format, extending them in the obvious ways to support very large objects.
               We will then add additional information (generally new sections) to sup-
               port the extended objectives described above. We generally recognize
               three levels of support:
                  1. Some information is required for all ABI-compliant object files.
                  2. Some information is optional, but its absence will prevent use of
                     system functionality, e.g. cache optimization reordering, etc.
                  3. Some information is entirely optional; its absence interferes only
                     with functionality unrelated to program construction, e.g. debug-
                     ging, performance measurement, etc.

               To clarify the distinction between these levels, we have defined a new
               section header flag, SHF_MIPS_NOSTRIP, which is applied to sections in
               the first two levels. The intent is that a strip(1) tool or its equivalent
               should never remove these sections by default, and should warn the user
               if their removal is explicitly requested.

               We have followed a number of principles and assumptions in this specifi-
               cation:
007-4658-001       Introduction                                                           Page   3

                      1. Sections expected to be used by runtime facilities, e.g. stack trace-
                         back, have the SHF_ALLOC attribute. Such sections also have sym-
                         bols automatically generated by the linker which may be used to
                         reference them in code (see Section 3.1.2). This allows simple vir-
                         tual addressing in the process address space for any required ac-
                         cess.
                      2. Sections are NOT given the SHF_WRITE attribute simply because
                         rld may need to relocate their contents. We assume that rld can re-
                         quest write access and change it back if necessary, and prefer this
                         approach for a more robust runtime environment.
                      3. We require that the executable code for a single executable or DSO
                         will never be larger than 256MB, and that it will never be loaded
                         across a 256MB boundary. This requirement allows various benefi-
                         cial assumptions about valid addressing code within an execut-
                         able/DSO, and also allows the use of single-word addresses (to be
                         interpreted relative to the containing 4GB address range) for code
                         in an object file.

                   Finally, this is intended to be a permissive specification. Usage of the fea-
                   tures described should generally be viewed as permitted in any combina-
                   tion with a reasonably unambiguous interpretation unless it is forbidden.
                   It is likely, of course, that new usage will uncover (and break) implicit as-
                   sumptions in tools from time to time, and adding further restrictions may
                   be the most appropriate solution, but the bias should be towards fixing the
                   tools to allow reasonable practices.

               1.3 Conventions
                   In all of the tables in this document, unshaded information is that derived
                   directly from external documents (i.e. the generic ABI and the DWARF
                   specification), lightly shaded information is derived directly from 32-bit
                   MIPS specifications (ELF, header files), and heavily shaded information
                   is new or substantially changed from these existing formats.

                   We use the usual wording to describe requirements, distinguishing be-
                   tween must (mandatory), should (recommended), and may (allowed).

               1.4 Open Issues
                   Unresolved issues and missing information are marked in this document
   ISSUE !
                   by the symbol at the left. The most significant ones at this time are:
Page   4                                                                   007-4658-001

                 1. Should there be a distinct EK_PBEGIN event in case a program
                    unit does not begin with an entrypoint (Section 2.10)?
                 2. Should memory events be segregated to a distinct events section so
                    that tools which use the default events and those which use the
                    memory events aren’t impacted by the other data (Section 2.10)?

           1.5 Changes from Version 2.0
               The following have been changed from version 2.0 of this specification:
                 1. Added a description of LEB128/ULEB128 formats.
                 2. Added EF_MIPS_OPTIONS_FIRST and EF_MIPS_ARCH_ASE ELF
                    flags.
                 3. Added Table 15 describing special reserved values of the st_shndx
                    field.
                 4. Added definitions of OHW_R8KPFETCH and OHW_R5KEOP masks
                    in the Hardware Patch Option Descriptor. Added new Hardware
                    AND/OR Patch Option Descriptors.
                 5. Added new ODK_GP_GROUP and ODK_IDENT option descriptors.
                 6. Note that R_MIPS_PJUMP requires that ld check that the symbol is
                    not preemptible before performing the relocation.
                 7. Added definitions of event kinds EK_LTR_FCALL and
                    EK_PCREL_GOT0. Fixed values of kinds EK_MEM_*.
                 8. Fixed definition of content kind CK_GP_GROUP.
                 9. Added section on Shared Object Dependencies describing default
                    search paths for DSOs and environment variables to override them.
                10. Added sections defining the .msym and .conflict sections for the
                    quickstart discusion (Section 3.8).
                11. Added DT_MIPS_INTERFACE_SIZE and
                    DT_MIPS_RLD_TEXT_RESOLVE_ADDR descriptions.
                12. Added missing DT_MIPS_FLAGS flags.
                13. Added documentation of the .liblist section (Section 3.8.2).
                14. Added documentation of the .MIPS.symlib section (Section 3.8.4).
                15. Corrected default library search paths in Section 3.4.
                16. Added SHN_MIPS_LCOMMON (thread-local common) and
                    SHN_MIPS_LCOMMON (thread-local undefined) symbol documen-
                    tation in Section 2.5.
                17. Added STO_OPTIONAL symbol documentation in Section 2.5.
007-4658-001   Introduction                                                          Page   5

                 18. Added split common symbol documentation in Section 2.5 (and
                     Section 2.5.1).
                 19. Fixed EK_PCREL_GOT0 definition in Section 2.10.
                 20. Clarified CK_GP_GROUP description in Section 2.12.
                 21. Add comment to ODK_PAD option descriptor, allowing implemen-
                     tations to require that ld do all padding rather than leaving some to
                     rld (Section 2.8).
                 22. Added ODK_PAGESIZE proposal (Section 2.8.10).
Page   6                                                                               007-4658-001

            Section 2 ELF-64 Object File Format
                     The ELF-64 object file format is based on the document [ABI64]. The
                     relevant declarations are contained in the header file /usr/include/elf.h.
                     (Note that /usr/include/sys/elf.h is logically part of /usr/include/elf.h, and
                     is the actual location of most of these declarations.)

                     We call attention to the [ABI32] requirement that all data structures be
                     naturally aligned in the file (see p. 4-3). This implies that all headers, sec-
                     tions, and other major components must be 8-byte aligned, with padding
                     if necessary to accomplish this. Although 4-byte alignment is probably
   ELF-32
                     adequate currently for ELF-32, 8-byte alignment should also be used
                     there to avoid future extension problems. (Note, however, that the
                     DWARF specification fundamentally assumes a byte-stream format.
                     Therefore, the data structures contained in some DWARF sections will
                     violate the alignment requirement. In addition, the .MIPS.events and .MI-
                     PS.content sections have packed byte-stream contents for compactness.)

                     When defining structure fields which are smaller than a convenient stor-
                     age unit (e.g. single-bit flags), we have used C’s bitfield notation (e.g.
                     Elf64_Word:1). The intent is to specify layout equivalent to big-endian
                     bitfields, but the actual structure declarations in header files should use
                     masks and shifts to access them. This avoids problems with byte swap-
                     ping between big- and little-endian hosts.

                 2.1 Infrastructure
                     ELF-64 is defined in terms of the types in Table 1:

Table 1              ELF-64 Data Types

                      Name              Size     Alignment      Purpose
                      Elf64_Addr          8           8         Unsigned program address
                      Elf64_Half          2           2         Unsigned small integer
                      Elf64_Off           8           8         Unsigned file offset
                      Elf64_Sword         4           4         Signed medium integer
                      Elf64_Sxword        8           8         Signed large integer
007-4658-001   ELF-64 Object File Format                                                    Page   7

Table 1        ELF-64 Data Types

                Name              Size     Alignment      Purpose
                Elf64_Word          4         4           Unsigned medium integer
                Elf64_Xword         8         8           Unsigned large integer
                Elf64_Byte          1         1           Unsigned tiny integer
                Elf64_Section       2         2           Section index (unsigned)

               There are places in ELF-64 files where fundamental data types must be
               encoded, for instance in subprogram interface descriptors. We generally
               use the constants in Table 2 to identify them, based on DWARF version 1
               (but not identical).

Table 2        Fundamental Data Types
                Name(s)                           Value    Comments
                FT_unknown                     0x0001      unknown type
                FT_signed_char                 0x0001      8-bit signed character
                FT_unsigned_char               0x0002      8-bit unsigned character
                FT_signed_short                0x0003      16-bit signed short integer
                FT_unsigned_short              0x0004      16-bit unsigned short integer
                FT_signed_int32                0x0005      32-bit signed integer
                FT_unsigned_int32              0x0006      32-bit unsigned integer
                FT_signed_int64                0x0007      64-bit signed integer
                FT_unsigned_int64              0x0008      64-bit unsigned integer
                FT_pointer32                   0x0009      32-bit pointer
                FT_pointer64                   0x000a      64-bit pointer
                FT_float32                     0x000b      32-bit floating point (IEEE)
                FT_float64                     0x000c      64-bit floating point (IEEE)
                FT_float128                    0x000d      128-bit floating point
                FT_complex64                   0x000e      64-bit complex floating point
                FT_complex128                  0x000f      128-bit complex floating point
Page   8                                                                         007-4658-001

Table 2    Fundamental Data Types
            Name(s)                        Value        Comments
            FT_complex256                  0x0010       256-bit complex floating point
            FT_void                        0x0011       void
            FT_bool32                      0x0012       32-bit Boolean (TRUE or FALSE)
            FT_bool64                      0x0013       64-bit Boolean (TRUE or FALSE)
            FT_label32                     0x0014       32-bit label (address)
            FT_label64                     0x0015       64-bit label (address)

            FT_struct                      0x0020       structure (record)
            FT_union                       0x0021       union (variant)
            FT_enum                        0x0022       enumerated type
            FT_typedef                     0x0023       typedef
            FT_set                         0x0024       Pascal: set
            FT_range                       0x0025       Pascal: subrange of integer
            FT_member_ptr                  0x0026       C++: member pointer
            FT_virtual_ptr                 0x0027       C++: virtual pointer
            FT_class                       0x0028       C++: class

           The fundamental types in Table 2 may be modified by the qualifiers in
           Table 3 below, also based on [DWARF-1]:

Table 3    Type Qualifiers
            Name                   Value     Comments
            MOD_pointer_to          0x01     pointer to base type
            MOD_reference_to        0x02     C++: reference to base type
            MOD_const               0x03     const
            MOD_volatile            0x04     volatile
            MOD_lo_user             0x80     first MIPS-specific modifier
            MOD_function            0x80     function returning base type
            MOD_array_of            0x81     array of base type
007-4658-001      ELF-64 Object File Format                                                Page   9

Table 3           Type Qualifiers
                   Name                        Value     Comments
                   MOD_hi_user                 0xff      last MIPS-specific modifier

                  The data structures in the .MIPS.events and .MIPS.content sections use
                  compressed types from the [DWARF] specification, named LEB128 and
                  ULEB128, for (Unsigned) Little-Endian Base 128 numbers. These are
                  "little endian" only in the sense that they avoid using space to represent
                  the "big" end of an integer when the big end is all zeroes (unsigned) or
                  sign extension bits (signed).

                  ULEB128 numbers are encoded as follows: start at the low-order end of
                  an unsigned integer and chop it into 7-bit chunks. Place each chunk into
                  the low-order 7 bits of a byte. Typically, several of the high-order bytes
                  will be zero (unsigned) or copies of the sign bit (signed) — discard them.
                  Emit the remaining bytes in a stream, starting with the low-order byte; set
                  the high order bit on each byte except the last emitted byte. The high bit
                  of zero on the last byte indicates to the decoder that it has encountered
                  the last byte.

               2.2 ELF-64 Header
                  The header format is as defined in [ABI64]; it is reproduced here for ref-
                  erence purposes.

Table 4           ELF-64 Header Structure
                   Field Name                     Type         Comments
                   e_ident[EI_NIDENT]         unsigned char    See Table 5
                   e_type                      Elf64_Half      See [ABI32]
                   e_machine                   Elf64_Half      Machine (EM_MIPS = 8)
                   e_version                   Elf64_Word      File format version
                   e_entry                     Elf64_Addr      Process entry address
                   e_phoff                      Elf64_Off      Program header table file offset
                   e_shoff                      Elf64_Off      Section header table file offset
Page   10                                                                                      007-4658-001

Table 4                 ELF-64 Header Structure
                         Field Name                     Type          Comments
                         e_flags                      Elf64_Word      Flags — see Table 6
                         e_ehsize                     Elf64_Half      ELF header size (bytes)
                         e_phentsize                  Elf64_Half      Program header entry size
                         e_phnum                      Elf64_Half      Number of program headers
                         e_shentsize                  Elf64_Half      Section header entry size
                         e_shnum                      Elf64_Half      Number of section headers
                         e_shstrndx                   Elf64_Half      Section name string table sec-
                                                                      tion header index

                        The structure of the e_ident field is given by Table 5.

Table 5                 ELF-64 Header: e_ident[ ] Contents
                         Offset Name          Index        Value or Interpretation
                         EI_MAG0-3               0-3       Magic string: 0x7f, ’E’, ’L’, ’F’
                         EI_CLASS                 4        Class of format: ELFCLASS64 = 2
                         EI_DATA                  5        Endianness: ELFDATAMSB = 2
                         EI_VERSION               6        Version of format: EV_CURRENT = 1
                         EI_PAD                7-15        Reserved, must be zero

                        Flags currently defined for the e_flags field are given by .

Table 6                 ELF-64 Header: Processor-Specific Flags in e_flags
            Flag Name                    Value             Comments
            EF_MIPS_NOREORDER            0x00000001        At least one .noreorder assembly directive ap-
                                                           peared in a source contributing to the object
            EF_MIPS_PIC                  0x00000002        This file contains position-independent code
007-4658-001               ELF-64 Object File Format                                                 Page   11

Table 6                    ELF-64 Header: Processor-Specific Flags in e_flags
               Flag Name                    Value        Comments
               EF_MIPS_CPIC                 0x00000004   This file’s code follows standard conventions for
                                                         calling position-independent code
               EF_MIPS_UCODE                0x00000010   This file contains UCODE (obsolete)
               EF_MIPS_ABI2                 0x00000020   This file follows the MIPS III 32-bit ABI. (Its
                                                         EI_CLASS will be ELFCLASS32.)
               EF_MIPS_OPTIONS_FIRST        0x00000080   This .MIPS.options section in this file contains
                                                         one or more descriptors, currently types
                                                         ODK_GP_GROUP and/or ODK_IDENT,
                                                         which should be processed first by ld.
               EF_MIPS_ARCH_ASE             0x0f000000   Application-specific architectural extensions
                                                         used by this object file:
               EF_MIPS_ARCH_ASE_MDMX        0x08000000   Uses MDMX multimedia extensions
               EF_MIPS_ARCH_ASE_M16         0x04000000   Uses MIPS-16 ISA extensions
               EF_MIPS_ARCH                 0xf0000000   Architecture assumed by code in this file, given
                                                         by the value of the 4-bit field selected by the
                                                         mask: MIPS I (0), MIPS II (1), MIPS III (2),
                                                         MIPS IV (3)

                           NOTE: PIC code is inherently CPIC, and may or may not set
                           EF_MIPS_CPIC.
Page   12                                                                           007-4658-001

            2.3 ELF-64 Section Header
               The section header format is as defined in [ABI64]; it is reproduced here
               for reference purposes.

Table 7        Section Header Structure (Elf64_Shdr)
                Name                  Type                         Description
                sh_name            Elf64_Word        Section name (index into section
                                                     header string table section)
                sh_type            Elf64_Word        Section type: see Table 8
                sh_flags          Elf64_Xword        Section flags: see Table 9
                sh_addr            Elf64_Addr        Address of first byte, or zero
                sh_offset           Elf64_Off        File offset of section
                sh_size           Elf64_Xword        Section’s size in bytes
                sh_link            Elf64_Word        Table index link: section-specific
                sh_info            Elf64_Word        Extra information: section-specific
                sh_addralign      Elf64_Xword        Address alignment constraint
                sh_entsize        Elf64_Xword        Size of fixed-size entries in section,
                                                     or zero

               The valid section types for section header field sh_type are given in Table
               7 below. Shaded types are MIPS-specific; heavily shaded types are new
               in this specification.

Table 8        Section Types
            Name                             Value                     Description
            SHT_NULL                            0          Inactive section.
            SHT_PROGBITS                        1          Information defined by the program
            SHT_SYMTAB                          2          Symbol table (one per object file)
            SHT_STRTAB                          3          String table (multiple sections OK)
            SHT_RELA                            4          Relocation with explicit addends
007-4658-001       ELF-64 Object File Format                                                  Page   13

Table 8            Section Types
               Name                              Value                  Description
               SHT_HASH                            5        Symbol hash table (one per object)
               SHT_DYNAMIC                         6        Dynamic linking information
               SHT_NOTE                            7        Vendor-specific file information
               SHT_NOBITS                          8        Section contains no bits in object file
               SHT_REL                             9        Relocation without explicit addends
               SHT_SHLIB                           10       Reserved — non-conforming
               SHT_DYNSYM                          11       Dynamic linking symbol table (one)
               SHT_LOPROC                      0x70000000   First processor-specific type
               SHT_HIPROC                      0x7fffffff   Last processor-specific type
               SHT_LOUSER                      0x80000000   First application-specific type
               SHT_HIUSER                      0x8fffffff   Last application-specific type
               SHT_MIPS_LIBLIST                0x70000000   DSO library information used in link
               SHT_MIPS_MSYM                   0x70000001   MIPS symbol table extension
                                                            Symbols conflicting with DSO-de-
               SHT_MIPS_CONFLICT               0x70000002
                                                            fined symbols
               SHT_MIPS_GPTAB                  0x70000003   Global pointer table
               SHT_MIPS_UCODE                  0x70000004   Reserved
                                                            Reserved (obsolete debug informa-
               SHT_MIPS_DEBUG                  0x70000005
                                                            tion)
               SHT_MIPS_REGINFO                0x70000006   Register usage information
               SHT_MIPS_PACKAGE                0x70000007   OSF reserved
               SHT_MIPS_PACKSYM                0x70000008   OSF reserved
               SHT_MIPS_RELD                   0x70000009   Dynamic relocation?
               unused                          0x7000000a
               SHT_MIPS_IFACE                  0x7000000b   Subprogram interface information
               SHT_MIPS_CONTENT                0x7000000c   Section content classification
               SHT_MIPS_OPTIONS                0x7000000d   General options
               SHT_MIPS_DELTASYM               0x7000001b   Delta C++: symbol table
               SHT_MIPS_DELTAINST              0x7000001c   Delta C++: instance table
               SHT_MIPS_DELTACLASS             0x7000001d   Delta C++: class table
               SHT_MIPS_DWARF                  0x7000001e   DWARF debug information
Page   14                                                                                     007-4658-001

Table 8            Section Types
            Name                                      Value                     Description
            SHT_MIPS_DELTADECL                    0x7000001f        Delta C++: declarations
            SHT_MIPS_SYMBOL_LIB                   0x70000020        Symbol-to-library mapping.
            SHT_MIPS_EVENTS                       0x70000021        Event locations
            SHT_MIPS_TRANSLATE                    0x70000022        ???
            SHT_MIPS_PIXIE                        0x70000023        Special pixie sections
            SHT_MIPS_XLATE                        0x70000024        Address translation tablea
            SHT_MIPS_XLATE_DEBUG                  0x70000025        SGI internal address translation tablea
            SHT_MIPS_WHIRL                        0x70000026        Intermediate code
            SHT_MIPS_EH_REGION                    0x70000027        C++ exception handling region info
            SHT_MIPS_XLATE_OLD                    0x70000028        Obsolete
                                                                    Runtime procedure descriptor table
            SHT_MIPS_PDR_EXCEPTION                0x70000029
                                                                    exception information (ucode)
            a   SHT_MIPS_XLATE contains translation data table as created by the xlate library
                from within cord/pixie, for use by debuggers and other tools which need to know how
                to map addresses in the binary text to addresses in the debug information. See the sys-
                tem header file /usr/lib/include/Xlate.h. SHT_MIPS_XLATE_DEBUG has the
                same data format as SHT_MIPS_XLATE.

                   The section attribute flags defined for section header field sh_flags are
                   given in the table below. Again, light shading indicates MIPS-specific
                   flags, and heavier shading new flags.

Table 9            Section Attribute Flags
                   Name                               Value                     Description
                   SHF_WRITE                           0x1          Section writable during execution
                   SHF_ALLOC                           0x2          Section occupies memory
                                                                    Section contains executable instruc-
                   SHF_EXECINSTR                       0x4
                                                                    tions
                   SHF_MASKPROC                   0xf0000000        Reserved for processor-specific flags
                                                                    Section must be part of global data ar-
                   SHF_MIPS_GPREL                 0x10000000
                                                                    ea.c
007-4658-001          ELF-64 Object File Format                                                             Page   15

Table 9               Section Attribute Flags
                      Name                                Value                     Description
                                                                        Section data should be merged to
                      SHF_MIPS_MERGE a                0x20000000
                                                                        eliminate duplication
                                                                        Section data is addresses by default
                      SHF_MIPS_ADDR                   0x40000000        (see Section 2.12). Address size to be
                                                                        inferred from section entry size.
                                                                        Section data is string data by default
                      SHF_MIPS_STRING                 0x80000000
                                                                        (see Section 2.12).
                      SHF_MIPS_NOSTRIP                0x08000000        Section data may not be stripped
                      SHF_MIPS_LOCAL                  0x04000000        Section data local to process b,c
                                                                        Linker must generate implicit hidden
                      SHF_MIPS_NAMES                  0x02000000
                                                                        weak names — see Section 3.1.2
                                                                        Section contains text/data which may
                      SHF_MIPS_NODUPE                 0x01000000        be replicated in other sections. Linker
                                                                        must retain only one copy.
                      a   For a merged section, the SH_INFO value is the size (in bytes) of the objects to
                          be merged. Such sections should not be writable.
                      b   Local (SHF_MIPS_LOCAL) sections are for multi-process programs sharing
                          an address space. They must be copied for each process which attempts to write
                          to them. This copying does not occur until after the second process is spawned, so
                          that the initial process can perform dynamic initialization common to all pro-
                          cesses’ copies of the section. This attribute replaces the predefined COFF lcldta
                          and .lbss sections.
                      c   SHF_MIPS_LOCAL and SHF_MIPS_GPREL are mutually exclusive, i.e. a
                          local data section may not be placed in the short gp-relative data area.

                      A number of special sections are predefined, with standard names and at-
                      tributes. Note, however, that an ELF producer may create arbitrary sec-
                      tions with arbitrary names and attributes, and may generate the
                      predefined sections with additional attributes. For example, executable
                      code may be generated in multiple sections with arbitrary names, not just
                      in .text.

Table 10              Special Sections
               Name                              Type                 Default Attributes
               .bss                          SHT_NOBITS               SHF_ALLOC + SHF_WRITE
Page   16                                                                             007-4658-001

Table 10                    Special Sections
            Name                                Type       Default Attributes
            .comment                      SHT_PROGBITS     none (by default)
            .data                         SHT_PROGBITS     SHF_ALLOC + SHF_WRITE
            .data1                        SHT_PROGBITS     (gABI, not used by MIPS)
            .debug                        SHT_PROGBITS     (gABI, not used by MIPS)
            .dynamic                       SHT_DYNAMIC     SHF_ALLOC a
            .dynstr                        SHT_STRTAB      SHF_ALLOC
            .dynsym                        SHT_DYNSYM      SHF_ALLOC
            .fini                         SHT_PROGBITS     SHF_ALLOC + SHF_EXECINSTR
            .got                          SHT_PROGBITS     SHF_ALLOC + SHF_WRITE +
                                                           SHF_MIPS_GPREL
            .hash                              SHT_HASH    SHF_ALLOC
            .init                         SHT_PROGBITS     SHF_ALLOC + SHF_EXECINSTR
            .interp                       SHT_PROGBITS     SHF_ALLOC
            .line                         SHT_PROGBITS     SHF_ALLOC
            .note                              SHT_NOTE    none (by default)
            .plt                          SHT_PROGBITS     (gABI, not used by MIPS)
            .relname                           SHT_REL     none (by default), see [ABI32]
            .relaname                          SHT_RELA    none (by default), see [ABI32]
            .rodata                       SHT_PROGBITS     SHF_ALLOC
            .rodata1                      SHT_PROGBITS     (gABI, not used by MIPS)
            .shstrtab                      SHT_STRTAB      (gABI, not used by MIPS)
            .strtab                        SHT_STRTAB      none
            .symtab                        SHT_SYMTAB      none
            .text                         SHT_PROGBITS     SHF_ALLOC + SHF_EXECINSTR
            .MIPS.Addrs                  SHT_MIPS_PIXIE    none
            .MIPS.Binmap                 SHT_MIPS_PIXIE    none
            .MIPS.compact_rel           SHT_MIPS_COMPACT   none
                        c
            .conflict                  SHT_MIPS_CONFLICT   SHF_ALLOC
            .MIPS.contentname           SHT_MIPS_CONTENT   SHF_ALLOC+ SHF_MIPS_NOSTRIP
            .debug_abbrev                SHT_MIPS_DWARF    none (generic DWARF section)
007-4658-001                   ELF-64 Object File Format                                        Page   17

Table 10                       Special Sections
               Name                                   Type       Default Attributes
               .debug_aranges                  SHT_MIPS_DWARF    none (generic DWARF section)
               .debug_frame                    SHT_MIPS_DWARF    SHF_MIPS_NOSTRIP
                                                                 (generic DWARF section)
               .debug_funcnames                SHT_MIPS_DWARF    none (generic DWARF section)
               .debug_info                     SHT_MIPS_DWARF    none (generic DWARF section)
               .debug_line                     SHT_MIPS_DWARF    none (generic DWARF section)
               .debug_loc                      SHT_MIPS_DWARF    none (generic DWARF section)
               .debug_pubnames                 SHT_MIPS_DWARF    none (generic DWARF section)
               .debug_str                      SHT_MIPS_DWARF    none (generic DWARF section)
               .debug_typenames                SHT_MIPS_DWARF    none (MIPS DWARF section)
               .debug_varnames                 SHT_MIPS_DWARF    none (MIPS DWARF section)
               .debug_weaknames                SHT_MIPS_DWARF    none (MIPS DWARF section)
               .dynamic                          SHT_DYNAMIC     SHF_ALLOC
               .MIPS.eventsname                SHT_MIPS_EVENTS   SHF_ALLOC+SHF_MIPS_NOSTRIP
               .gptabname b                    SHT_MIPS_GPTAB    none
               .MIPS.Graph                     SHT_MIPS_PIXIE    none
               .MIPS.interfaces                SHT_MIPS_IFACE    SHF_ALLOC+SHF_MIPS_NOSTRIP
               .MIPS.lbss                         SHT_NOBITS     SHF_ALLOC + SHF_WRITE +
               .MIPS.ldata                       SHT_PROGBITS    SHF_MIPS_LOCAL d

               .lib                                obsolete
               .liblist c                     SHT_MIPS_LIBLIST   SHF_ALLOC
               .lit4   b                         SHT_PROGBITS    SHF_ALLOC + SHF_MIPS_MERGE
                                                                 + SHF_MIPS_GPREL a
               .lit8 b                           SHT_PROGBITS    SHF_ALLOC + SHF_MIPS_MERGE
                                                                 + SHF_MIPS_GPREL a
               .MIPS.lit16 b                     SHT_PROGBITS    SHF_ALLOC + SHF_MIPS_MERGE
                                                                 + SHF_MIPS_GPREL a
               .MIPS.Log                       SHT_MIPS_PIXIE    none
               .MIPS.Map                       SHT_MIPS_PIXIE    none
               .mdebug                             obsolete      to be replaced by DWARF sections
               .MIPS.options                  SHT_MIPS_OPTIONS   SHF_ALLOC+SHF_MIPS_NOSTRIP
Page   18                                                                                              007-4658-001

Table 10                         Special Sections
                Name                                      Type               Default Attributes
                .msym                              SHT_MIPS_MSYM             SHF_ALLOC
                .MIPS.Graph                        SHT_MIPS_PIXIE            none
                .MIPS.Perf_argtrace                SHT_MIPS_PIXIE            none
                .MIPS.Perf_bb_offsets              SHT_MIPS_PIXIE            none
                .MIPS.Perf_call_graph              SHT_MIPS_PIXIE            none
                .MIPS.Perf_function                SHT_MIPS_PIXIE            none
                .MIPS.Perf_table                   SHT_MIPS_PIXIE            none
                .MIPS.Perf_weak_names              SHT_MIPS_PIXIE            none
                .rel.dyn                                SHT_REL              SHF_ALLOC
                .reldname                              SHT_RELA              SHF_ALLOC
                        b
                .sbss                                 SHT_NOBITS             SHF_ALLOC + SHF_MIPS_GPREL +
                                                                             SHF_WRITE
                .sdata b                            SHT_PROGBITS             SHF_ALLOC + SHF_MIPS_GPREL +
                                                                             SHF_WRITE
                .srdata b                           SHT_PROGBITS             SHF_ALLOC + SHF_MIPS_GPREL
                .MIPS.symlib                   SHT_MIPS_SYMBOL_LIB           SHF_ALLOC
                .MIPS.translate                     SHT_PROGBITS             SHF_MIPS_NOSTRIP
                                                                             + SHF_ALLOC (non-shared only)
                .ucode                             SHT_MIPS_UCODE            none (obsolete)
                a   [ABI32M] specifies these sections with SHF_WRITE as well. Why?
                b   A MIPS ABI-64 compiliant system must support these sections.
                c
                    A MIPS ABI-64 compliant system must recognize, but may choose to ignore, these sections. Howev-
                    er, if either is supported, both must be.
                d   The .lbss and lcldata sections can be replaced with arbitrary sections having the
                    SHF_MIPS_LOCAL attribute; they will no longer be recognized by the system strictly based on
                    name.

                                 We expect more use of non-predefined sections in the future to achieve
   Linker
   Processing                    greater control over process memory allocation. The linker is expected to
                                 combine sections with matching name and attributes, then groupings
                                 with matching attributes, and finally groupings with consistent attributes
                                 (e.g. all SHT_MIPS_GPREL sections, or all read-only sections). The pre-
                                 cise rules will be defined in Section 3.
007-4658-001       ELF-64 Object File Format                                              Page   19

               2.4 String Table
                   This section type is unchanged from [ABI32]. A String Table section has
                   the following attributes:

                    name            .strtab
                    sh_type         SHT_STRTAB
                    sh_link         SHN_UNDEF
                    sh_info         0
                    sh_flags        SHF_ALLOC
                    requirements    see .symtab

               2.5 Symbol Table
                   A symbol table section is unchanged from [ABI32] except for the types
                   of some of its fields.

                   A symbol table section and its associated string table section must be
                   present for any executable file with DSO dependencies, or for any DSO.
                   It is permissible to remove from it symbols resolved within itself if they
                   are not preemptible (protected) and not visible outside this object. (All
                   defined symbols in an executable file are protected, but symbols must
                   have been explicitly declared protected in a DSO, and hidden in either a
                   DSO or an executable. See the discussion associated with Table 14 for
                   definitions of these terms.)
                   A Symbol Table section has the following attributes:

                    name            .symtab
                    sh_type         SHT_SYMTAB
                    sh_link         Section header index of the associated string table
                    sh_info         0
                    sh_flags        SHF_ALLOC
                    requirements    see discussion above

                   The structure of a symbol table item is given by Table 11 below.
Page   20                                                                          007-4658-001

Table 11    ELF-64 Symbol Table Structure
             Name                        Type          Comments
             st_name                  Elf64_Word       Name’s index into string table
             st_info                  Elf64_Byte       Symbol type and binding: see
                                                       Table 12 and Table 13
             st_other                 Elf64_Byte       Other info: see Table 14
             st_shndx               Elf64_Section      Index of section where defined
             st_value                 Elf64_Addr       Symbol value
             st_size                 Elf64_Xword       Symbol size

            The high-order nibble of the st_info field specifies the symbol’s binding
            (see Table 12), and the low-order nibble specifies its type (see Table 13).

Table 12    Symbol Binding (ELF32_ST_BIND)
             Constant Name             Value    Comments
             STB_LOCAL                    0     Not visible outside object file where defined
             STB_GLOBAL                   1     Visible to all object files. Multiple defini-
                                                tions cause errors. Force extraction of defin-
                                                ing object from archive file.
             STB_WEAK                     2     Visible to all object files. Ignored if
                                                STB_GLOBAL with same name found. Do
                                                not force extraction of defining object from
                                                archive file. Value is 0 if undefined.
             STB_LOPROC                  13     First processor-specific binding
             STB_SPLIT_COMMON            13     Split common symbol. See Section 2.5.1.
             STB_HIPROC                  15     Last processor-specific binding
007-4658-001   ELF-64 Object File Format                                                   Page   21

Table 13       Symbol Type (ELF32_ST_TYPE)
                Constant Name         Value     Comments
                STT_NOTYPE                 0    Not specified
                STT_OBJECT                 1    Data object: variable, array, etc.
                STT_FUNC                   2    Function or other executable code
                STT_SECTION                3    Section. Exists primarily for relocation
                STT_FILE                   4    Name (pathname?) of the source file associated
                                                with object. Binding is STT_LOCAL, section
                                                index is SHN_ABS, and it precedes other
                                                STB_LOCAL symbols if present
                STT_LOPROC             13       First processor-specific type
                STT_HIPROC             15       Last processor-specific type

               The binding type of a symbol is used to control its visibility, as well as
               resolution in the case of multiple definitions, between the relocatable ob-
               jects comprising a program. This semantics is extended to interfaces be-
               tween an executable and/or DSOs unchanged — it is simply interpreted
               by the dynamic linker instead of the static linker. In order to allow inde-
               pendent control of interfaces between executable and DSOs without af-
               fecting the binding type semantics within them, information in the
               st_other field, as given in Table 14 below, is used to specify visibility and
               accessibility of symbols outside the containing executable/DSO, which
               we term the symbol export class.
                 ●   By default, global, weak, or common symbols are preemptible, i.e.
                     they may be preempted by definitions of the same name elsewhere.
                 ●   Symbols defined in the current component are protected if they are
                     visible outside but not preemptible, meaning that any reference to
                     such a symbol from within the defining executable or DSO must
                     resolve to the local definition even if there are definitions in other
                     executables or DSOs which would normally preempt it.
                 ●   Symbols defined in the current component are hidden if their
                     names are not visible outside — such symbols are necessarily pro-
                     tected, and this attribute may be used to control the external inter-
                     face of a DSO, but such objects may still be referenced from
                     outside if an address is passed outside as a pointer.
Page   22                                                                            007-4658-001

                   ●    Symbols are internal if their addresses are not passed outside, e.g.
                        static C functions whose address is never taken.

                  The visibility semantics of these attributes also allow various optimiza-
                  tions. Whereas care must be taken to maintain position-independence and
                  proper GOT usage for references to and definitions of symbols which
                  might be preempted by or referenced from other DSOs, these restrictions
                  all allow references from the same executable/DSO to make stricter as-
                  sumptions about the definitions. References to protected symbols (and
                  hence to hidden or internal symbols) may be optimized by using absolute
                  addresses in executables or by assuming addresses to be relatively near-
                  by. Internal functions do not normally require gp establishment code be-
                  cause they will always be entered from the same executable/DSO with
                  the correct gp already set up.

                  None of these attributes affects resolution of symbols within an execut-
   Linker
   Processing     able or DSO during static linking — such resolution is controlled by the
                  binding type. (However, if the static linker references symbol definitions
                  in other DSOs during link time, it is constrained by their export classes.)
                  Once the static linker has chosen its resolution, these attributes impose
                  two requirements, both based on the fact that various references in the
                  code being linked may have been optimized to take advantage of the at-
                  tributes. First, all of these attributes imply that a symbol must be defined
                  in the current DSO/executable. If a symbol with one of these attributes
                  has no definition within the executable/DSO being linked, then it must be
                  resolved to allocated space if common, resolved to zero if weak, or an er-
                  ror reported otherwise. Second, if any reference to, or definition of, a
                  name is a symbol with one of these attributes, the attribute must be prop-
                  agated to the resolving symbol in the linked object.

Table 14          st_other Field Masks
                Constant Name                  Value    Comments
                STO_EXPORT                       3      DSO export class — one of:
                 STO_DEFAULT                     0      Default: STB_GLOBAL or
                                                        STB_WEAK are preemptible,
                                                        STB_LOCAL are hidden.
                 STO_INTERNAL                    1      Not referenced outside executable/DSO
                 STO_HIDDEN                      2      Not visible outside executable/DSO
                 STO_PROTECTED                   3      Not preemptible
007-4658-001          ELF-64 Object File Format                                                       Page    23

Table 14              st_other Field Masks
                    Constant Name                    Value      Comments
                    STO_OPTIONAL                          4     Symbol is optional. If no definition is
                                                                available at runtime, it is resolved to the
                                                                symbol _RLD_MISSING.

                      Normally in relocatable files, a symbol’s value refers to its offset within
                      the section specified by the st_shndx field. Its value will therefore be ad-
                      justed as the section moves during relocation. Certain special section in-
                      dex values imply other semantics, as described in Table 15:

                      Resolution rules for optional symbols (STO_OPTIONAL) are as follows.
                      The static linker (ld) should convert a reference to an optional definition
   Linker
   Processing         (i.e. in another DSO) to an optional reference. The merge of an optional
                      and a non-optional reference becomes optional. The optional type is ig-
                      nored for SHN_COMMON and SHN_ACOMMON symbols, and does not af-
                      fect stub generation and resolution. In the runtime linker (rld), unresolved
                      optional symbols are silently resolved to the reserved symbol
                      _RLD_MISSING, defined in libc.so.1. Optional references do not trigger
                      the loading of delay-loaded libraries. Therefore, optional references may
                      go unresolved until some other event triggers the loading of the de-
                      lay-loaded library, and one may not check the availability of an optional
                      feature found in a delay-loaded library until some other event has forced
                      the library to be loaded.

Table 15              st_shndx Field Special Values
 Name                  Value       Semantics
                                   The symbol is undefined. Its value will be determined by its appearance
 SHN_UNDEF                 0
                                   as a defined symbol in another object file.
                                   Section indices between SHN_LORESERVE and
 SHN_LORESERVE          0xff00     SHN_HIRESERVE are reserved for special values — they do not re-
                                   fer to the section header table.
                                   Section indices between SHN_LOPROC and SHN_HIPROC are re-
 SHN_LOPROC             0xff00
                                   served for processor-specific values.
 SHN_MIPS_ACOMMON       0xff00     Allocated common symbols in a DSOa,e.
 SHN_MIPS_TEXT          0xff01     Reserved (obsolete).
Page   24                                                                                                      007-4658-001

Table 15                           st_shndx Field Special Values
 Name                               Value         Semantics
 SHN_MIPS_DATA                       0xff02       Reserved (obsolete).
 SHN_MIPS_SCOMMON                    0xff03       gp-addressable common symbolsb (relocatable objects only).
 SHN_MIPS_SUNDEFINED                 0xff04       gp-addressable undefined symbolsc (relocatable objects only).
                                                  Local common, equivalent to SHN_COMMON, except that the com-
                                                  mon block will be allocated in a local section, i.e. one replicated for
 SHN_MIPS_LCOMMON                    0xff05
                                                  each process in a multi-process program sharing memory (see
                                                  SHF_MIPS_LOCAL in Section 2.3).d,e
                                                  Local undefined symbol, equivalent to SHN_UNDEFINED, except
                                                  that the symbol must resolve to a local section, i.e. one replicated for
 SHN_MIPS_LUNDEFINED                 0xff06
                                                  each process in a multi-process program sharing memory (see
                                                  SHF_MIPS_LOCAL in Section 2.3).d
                                                  Section indices between SHN_LOPROC and SHN_HIPROC are re-
 SHN_HIPROC                          0xff1f
                                                  served for processor-specific values.
 SHN_ABS                             0xfff1       The symbol’s value is absolute and does not change due to relocation.
                                                  The symbol labels a common block which has not yet been allocateda.
 SHN_COMMON                          0xfff2       Its st_value specifies alignment, similar to a section header’s
                                                  sh_addralign field. Its size is the number of bytes required.
                                                  Section indices between SHN_LORESERVE and
 SHN_HIRESERVE                       0xffff       SHN_HIRESERVE are reserved for special values — they do not re-
                                                  fer to the section header table.
 a   Normal SHN_COMMON symbols are not allocated in DSOs, which means that if they are not allocated else-
     where (in the main executable or another DSO), rld must allocate them at runtime. SHN_MIPS_ACOMMON
     symbols are used in DSOs to mark common that has been allocated in advance to avoid runtime allocation, but still
     have common semantics, i.e. are not initialized and may be preempted by non-common definitions from any DSO.
     The st_value of such a symbol is its virtual address. It may be relocated, but the alignment of its address must be
     preserved up to modulo 65,536.
 b   SHN_MIPS_SCOMMON symbols are common symbols which must be allocated within 32,768 bytes of gp.
 c   SHN_MIPS_SUNDEFINED symbols are undefined symbols which must be resolved to addresses within 32,768
     bytes of gp.
 d   SHN_MIPS_LCOMMON and SHN_MIPS_LUNDEFINED symbols must be consistently defined in a program,
     i.e. every appearance of the symbol must be either an undefined SHN_MIPS_LCOMMON reference, a
     SHN_MIPS_LUNDEFINED reference, or a definition in a SHF_MIPS_LOCAL section. These symbols may
     not be gp-relative.
 e   SHN_MIPS_ACOMMON symbols with values (virtual addresses) in SHF_MIPS_LOCAL sections are equiva-
     lent to SHN_MIPS_LCOMMON symbols, except that they are pre-allocated by the static linker.

                                   In executable and shared object files, the symbol’s value is a virtual ad-
                                   dress (if defined), and the section header index is irrelevant. If the section
007-4658-001        ELF-64 Object File Format                                              Page   25

                    header index of a function symbol is SHN_UNDEF and the st_value is
                    non-zero, it is the virtual address of a stub for lazy evaluation of a symbol
                    defined in one of the associated DSOs.

                    ELF-32: The extension of using st_other for specifying DSO-related
   ELF-32
                    scope attributes is used in ELF-32 beginning with the IRIX 5.1 release
                    for linker-generated symbols which must be protected. As this field is
                    currently unused, there should be no compatibility issues unless there are
                    tools which attempt to enforce non-use. Tools which ignore this field will
                    be unable to cope with the implied symbol resolution.

               2.5.1 Split Common Symbols

                    It is sometimes desirable for the compiler to split a Fortran COMMON
                    block into multiple pieces for separate allocation (e.g. to control relative
                    position in the processor cache). The MIPSpro compilers do so under ap-
                    propriate options, and represent the resulting decomposition as described
                    below. The static linker (ld) then determines whether the decomposition
                    is safe, and reassembles the COMMON if not.

                    A split common symbol is represented in a relocatable object by a normal
                    symbol for the original COMMON block, plus a split common symbol
                    for each element of the decomposition. The split common symbol inher-
                    its alignment, binding type, export class, and section index field informa-
                    tion from the parent common, allowing its symbol table entry to be
                    redefined as given by the modified version of Table 11 in Table 16 below:

Table 16            ELF-64 Split Common Component Symbol Table Element
                     Name             Type         Comments
                     st_name       Elf64_Word      Component name’s index into string table
                     st_info       Elf64_Byte      STB_SPLIT_COMMON
                     st_other      Elf64_Byte      STO_SC_ALIGN_UNUSED
                     st_shndx    Elf64_Section     Symbol index of parent common symbol
                     st_value      Elf64_Addr      Offset of component from base of parent
                                                   common symbol
                     st_size      Elf64_Xword      Component size
Page   26                                                                          007-4658-001

                A split common symbol is identified by the STB_SPLIT_COMMON value
                of the st_info field, requiring the alternate interpretation of its other fields
                given above.

                Compiler Requirements:
   Compiler
   Processing     ●    The component symbols produced by the compiler must be a parti-
                       tion of the parent COMMON. That is, the first should start at off-
                       set zero, the second at offset size(first), etc., and length(parent) =
                       offset(last)+size(last) = sum(sizes).
                  ●    Subject to the above requirement, the compiler is allowed to split
                       common blocks arbitrarily, and the linker is responsible for identi-
                       fying problems and reassembling the original common block.

                Linker Requirements:
   Linker
   Processing     ●    The linker must produce a final partition which is consistent with
                       each of the individual objects' partitions in the sense that each
                       component from an input relocatable object falls entirely within
                       one of the output components.
                  ●    If the linker partitions the common, it must replace the component
                       symbols by normal (e.g. common, bss, or data) symbols, produc-
                       ing an object which contains no split common component symbols
                       (and therefore looks like an ABI-compliant object). It may do so
                       either by producing a distinct regular symbol for each component,
                       or by replacing the component symbols by appropriate offsets
                       from a single symbol for the common. Similarly, if it reassembles
                       the common, it must remove the component symbols.
                  ●    If the linker partitions the common, the resulting symbols must not
                       be exported, to avoid inadvertent incorrect references if one of the
                       referenced DSOs is replaced later with a version which references
                       the name.
                  ●    The following situations require that the linker reassemble the
                       original common:
                         a. There is an explicit linker request to export the common block
                             symbol (implying that some DSO may contain a reference to
                             it with unknown assumptions).
                         b. The linker finds a relocation against the common block sym-
                             bol (implying code generated to reference the original com-
                             mon block with unknown assumptions).
007-4658-001       ELF-64 Object File Format                                               Page   27

                             c. The linker finds a reference to the common block symbol
                                from any DSO (implying that the DSO contains a reference to
                                it with unknown assumptions).
                            d. The common block symbol is initialized with a single
                                BLOCK DATA (i.e. it is defined at a specific location in a data
                                section).
                             e. The linker finds a PU or object file in which the common has
                                not been split (a variant of (a) and (c) ).
                           A linker implementation may choose to reassemble split common
                           blocks in other circumstances.

               2.6 Hash Table
                   A hash table section is unchanged from [ABI32]. It has the following at-
                   tributes:

                    name             .hash
                    sh_type          SHT_HASH
                    sh_link          Section header index of the associated symbol table
                    sh_info          0
                    sh_flags         SHF_ALLOC
                    requirements     may not be stripped

                   See [ABI32] for a description of the hash table structure and hash func-
                   tion, which are unchanged.

               2.7 Register Information Section
                   This section is strictly a 32-bit ABI section, which specifies the register
                   usage of the code in an object file. In 64-bit ELF, this section is obsolete,
                   and is superceded by the Options Section described in Section 2.8 below.
                   Its section attributes are:

                    name             .reginfo
                    sh_type          SHT_MIPS_REGINFO
                    sh_link          SHN_UNDEF
                    sh_info          0
                    sh_flags         none
Page   28                                                                              007-4658-001

                 requirements    obsolete — not strippable if present in ELF-32 file

                The structure of a Register Information descriptor is given by Table 19 in
                Section 2.8 below.

                ELF-32: MIPS tools will ignore this section in 32-bit ELF if a .MIPS.op-
   ELF-32
                tions section is present.

            2.8 Options Section
                This section specifies miscellaneous options to be applied to an object
                file. An options section is required, and must contain at least an
                ODK_REGINFO descriptor (below). In a shared executable or DSO, the
                options section should immediately follow the program header table for
                best startup performance, and the .dynamic section must contain a
                DT_MIPS_OPTIONS tag pointing to it. In a non-shared program (which is
                not ABI-conformant), the options section must immediately follow the
                program header table.

                Its section attributes are:

                 name            .MIPS.options
                 sh_type         SHT_MIPS_OPTIONS
                 sh_link         SHN_UNDEF
                 sh_info         0
                 sh_flags        SHF_ALLOC + SHF_MIPS_NOSTRIP
                 requirements    mandatory, may not be stripped

                An options record consists of a sequence of variable length (and variable
                format) descriptors, which may apply either to the entire object file or to
                a specific section. Each such descriptor begins with the following header:

Table 17        Options Descriptor Header (Elf_Options)
                 Field Name            Type          Comments
                 kind                Elf64_Byte      Determines interpretation of variable part of
                                                     descriptor — see Table 18 below
007-4658-001   ELF-64 Object File Format                                                          Page   29

Table 17       Options Descriptor Header (Elf_Options)
                Field Name              Type           Comments
                size                 Elf64_Byte        Byte size of descriptor, including this header a
                section            Elf64_Section       Section header index of section affected, or 0
                                                       for global options
                info                 Elf64_Word        Kind-specific information
                a
                    Descriptors may have arbitrary size (up to 255 bytes). However, they must be
                    8-byte aligned, and must be null padded if the given size is not 0 mod 8.

               The Options Descriptor kinds are given in Table 18 below. The various
               descriptors associated with them follow. For each descriptor kind, the as-
               sociated table gives the value of the size field, the usage of the info field,
               and any additional fields required.

Table 18       Options Descriptor Kinds
                Constant Name                 Value      Comments
                ODK_NULL                        0        Undefined
                ODK_REGINFO                     1        Register usage information
                ODK_EXCEPTIONS                  2        Exception processing options
                ODK_PAD                         3        Section padding options
                ODK_HWPATCH                     4        Hardware patches applied
                ODK_FILL                        5        Linker fill value
                ODK_TAGS                        6        Space for tool identification
                ODK_HWAND                       7        Hardware AND patches applied
                ODK_HWOR                        8        Hardware OR patches applied
                ODK_GP_GROUP                    9        GP group to use for text/data sections
                ODK_IDENT                       10       ID information
                ODK_PAGESIZE                    11       Page size information

               The .MIPS.options section replaced .reginfo in ELF-32 with the MIPSpro
               6.0 compilers, although it remains in use in the 5.x (ucode) compilers.
Page   30                                                                                        007-4658-001

            2.8.1 Register Information Option Descriptor

                  The ODK_REGINFO descriptor supercedes what used to be in the special
                  .reginfo section. The structure of a Register Information descriptor is giv-
                  en by Table 19 below.

Table 19          Register Information Structure
                   Field Name                     Type            Comments
                   kind                       Elf64_Byte          value is ODK_REGINFO
                   size                       Elf64_Byte          value is 40
                   section                   Elf64_Section        0
                   info                       Elf64_Word          unused
                   ri_gprmask                 Elf64_Word          Mask of general registers used
                   ri_pad                     Elf64_Word          Unused padding field (for align-
                                                                  ment of following fields -- ELF64
                                                                  only)
                   ri_cprmask[4]            Elf64_Word[4]         Mask of coprocessor registers used
                   ri_gp_value                Elf64_Addr          Initial value of gp a
                   a   If there is no register information descriptor, the initial value of gp is assumed to
                       be 0. The significance of this value is that, for any SHT_MIPS_GPREL sec-
                       tion, if its start address (as given by the section’s sh_addr) is specified as x
                       (which will usually be zero), then gp is assumed to be initialized to its relocated
                       start address plus (ri_gp_value-x). The initial addends of any
                       R_MIPS_GPREL-relocated values will be correct offsets if the section is not
                       moved relative to gp.

                  ELF-32: ELF-32 does not have the ri_pad field. We use this section in-
   ELF-32
                  stead of .reginfo beginning with IRIX 6.0, since we require the additional
                  descriptors described below. However, .reginfo may still be generated for
                  the benefit of foreign (and back-rev) tools.

            2.8.2 Exception Information Option Descriptor

                  The ODK_EXCEPTIONS descriptor contains information only in the info
                  field of the basic options descriptor header, as given by the masks in Ta-
                  ble 20 below. Its size is 8 bytes.
007-4658-001    ELF-64 Object File Format                                                         Page   31

Table 20        Exception Information info Field Masks
                 Mask Name                       Value         Comments
                 OEX_FPU_MIN                 0x0000001f        Min FPU exception enable a
                 OEX_FPU_MAX                 0x00001f00        Max FPU exception enable a
                 OEX_PAGE0                   0x00010000        Page zero of the virtual address space
                                                               must be mapped b
                 OEX_SMM                     0x00020000        Run in sequential memory mode c
                 OEX_PRECISEFP               0x00040000        Run in precise FP exception mode d
                 OEX_DISMISS                 0x00080000        Dismiss invalid address traps e
                 a   These masks bound the setting of the FPU exception enable masks at runtime.
                     The runtime mask may enable only bits in the maximum mask, and must enable
                     bits in the minimum mask. See discussion below.
                 b   If set, loads from page zero of the virtual address space must not cause invalid
                     address faults. However, page zero may be write-protected. "Page zero" here
                     implies the minimum, given by ELF_MIPS_MINPGSZ in elf.h.
                 c   If set, and the process is running on an R8000 or other processor with a sequen-
                     tial memory mode, execute in that mode.
                 d   If set, and the process is running on an R8000 or other processor with a distinct
                     mode for precise floating point exceptions, execute in that mode.
                 e   If set, any invalid address traps encountered should be dismissed without abort-
                     ing or otherwise notifying the running process.

                Linkage and Execution: The static linker (ld) must combine the
   Linker
   Processing   descriptors from all object files linked as follows. The OEX_FPU_MIN
                fields are OR’ed together, so that any exception enable required by any of
                the objects will be set for the process. Similarly, the OEX_FPU_MAX
                fields are AND’ed together, so that any exception required to be
                suppressed by any of the objects will be suppressed for the process. The
                OEX_PAGE0, OEX_SMM, OEX_PRECISEFP, and OEX_DISMISS flags are
                OR’ed together. The linker should always produce an ODK_EXCEPTIONS
                descriptor even if none of the linked objects contained one, so that simple
                tools can be used to manipulate these options. In such a case, the info field
                should contain the value OEX_FPU_MAX, i.e. any FP exceptions allowed,
                and no other options set.

                At execution time, the dynamic linker (rld) must perform a similar task to
                combine the descriptors from the main executable and any DSOs, and it
                must perform the appropriate actions to achieve the implied state
Page   32                                                                          007-4658-001

                  (typically making calls to the kernel). In addition, it must retain the
                  implied state for reference — in the event that a dlopen call is made to
                  open a new DSO, its state must be checked for compatibility with the
                  current state, and that state adjusted as required. The runtime linker is not
                  required to back out the requirements of a DSO which is subsequently
                  removed from the process image via dlclose.

                  For a non-shared program, the kernel or the runtime system (e.g. crt0)
                  must perform the same task, setting the implied initial state in the running
                  process.

                  Both the static and dynamic linkers should report incompatible
                  requirements of their components, i.e. an exception enable bit which is
                  set in the minimum mask and unset in the maximum mask, as errors. The
                  runtime system is not required to enforce retention of the specified modes
                  in the face of explicit attempts to set them by the running process, but it
                  may do so.

                  ELF-32: MIPS generates and uses this descriptor beginning with IRIX
   ELF-32
                  6.0. It may be necessary to suppress it for pure-ABI objects.

            2.8.3 Section Padding Option Descriptor

                  The ODK_PAD descriptor specifies padding required for the referenced
                  data section. The linker must provide for at least the indicated number of
                  bytes preceding or following the data section to be valid parts of the
                  virtual address space, guaranteed not to cause invalid address faults. This
                  facility is intended to allow the code generator to produce memory
                  references which may be beyond the referenced data object (e.g. for
                  software pipelining), with the assurance that they will not cause memory
                  faults at runtime.

                  If the writable flags are not set, the linker may provide padding simply by
                  arranging for other data sections to be contiguous to the section specified,
                  those other data sections need not be writable. If the writable flags are
                  set, writable empty space must be provided. If padding must be applied to
                  a symbol (e.g. because it is undefined or COMMON, and its ultimate sec-
                  tion is unknown), the 16-bit section is a symbol table section, and the
                  pad_symindex field specifies a 32-bit symbol index. In this case, since the
                  symbol may be allocated by another object file in the midst of a larger
                  section, the writable flags may not be set.

                  The format of this descriptor is given in Table 21 below:
007-4658-001         ELF-64 Object File Format                                                            Page   33

Table 21             Section Padding Descriptor
                      Field Name                     Type           Comments
                      kind                       Elf64_Byte         value is ODK_PAD
                      size                       Elf64_Byte         value is 16
                      section                  Elf64_Section        Section to be padded a
                      info & 0x0001                  mask           Prefix writable (OPAD_PREFIX)
                      info & 0x0002                  mask           Postfix writable (OPAD_POSTFIX)
                      info & 0x0004                  mask           Pad symbol b (OPAD_SYMBOL)
                      pad_prefix_size             Elf64_Half        Size (bytes) of prefix required
                      pad_postfix_size            Elf64_Half        Size (bytes) of postfix required
                      pad_symindex               Elf64_Word         Symbol index if OPAD_SYMBOL is set
                      a   The section field normally references a data section to be padded or, if
                          OPAD_SYMBOL is set, a symbol table section in which to find a symbol to be
                          padded. If it is zero, the descriptor applies to all data sections, and the writable
                          flags may not be set in this case.
                      b   If this flag is set, the section field is a symbol table section, and the
                          pad_symindex field specifies a 32-bit symbol index instead of a section for
                          padding (generally undefined or COMMON). The writable flags may not be set
                          in this case.

                     ELF-32: We generate and use this descriptor beginning with IRIX 6.0. It
   ELF-32
                     may be necessary to suppress it for pure-ABI objects.

                     Linkage: It is technically possible for the static linker (ld) to postpone
   Linker
   Processing        processing of padding information (e.g. for symbols and/or sections
                     allocated at the beginning or end of a segment, or for unallocated
                     COMMON symbols), leaving the dynamic linker (rld) to process residual
                     padding descriptors. However, the MIPSpro static linker currently
                     processes padding completely, dealing with unallocated COMMON
                     symbols by turning them into ACOMMON symbols with proper
                     padding, and the MIPSpro dynamic linker does not deal with padding.

                2.8.4 Hardware Patch Option Descriptor

                     The ODK_HWPATCH descriptor contains flags indicating whether various
                     patches required for specific hardware platforms have been applied to the
                     executable or DSO. It contains information only in the info field of the ba-
Page   34                                                                                  007-4658-001

                     sic options descriptor header, as given by the masks in Table 22 below. Its
                     size is 8 bytes. This descriptor is required in all object files, to allow sim-
                     ple post-generation patching.

Table 22             Hardware Patch Options Descriptor
                    Mask Name                 Value        Comments
                    OHW_R4KEOP            0x00000001       Patch for R4000 branch at end-of-page bug
                    OHW_R8KPFETCH         0x00000002       Object contains prefetch instructions which
                                                           may cause R8000 prefetch bug to occur
                    OHW_R5KEOP            0x00000004       Patch for R5000 branch at end-of-page bug
                    OHW_R5KCVTL           0x00000008       R5000 cvt.[ds].l bug: clean=1
                    OHW_R10KLDL           0x00000010       Requires patch for R10000 misaligned load.

                     The static linker must merge (inclusive OR) the OHW_R8KPFETCH flags
   Linker
   Processing        from each of the objects it links. The OHW_R4KEOPR5000 cvt.[ds].l bug.
                     clean=1 and OHW_R5KEOP flags are added by tools after linking.

                2.8.5 Hardware AND/OR Patch Option Descriptors

                     The ODK_HWAND / ODK_HWOR descriptors, like ODK_HWPATCH, con-
                     tain flags indicating whether various patches required for specific hard-
                     ware platforms have been applied to the object file. They contain
                     information in the info field of the basic options descriptor header, plus
                     the following 8 bytes. Their size is 16 bytes. These descriptors are re-
                     quired in all object files, to allow simple post-generation patching. The
                     descriptor layout is given in Table 23 below.

Table 23             Hardware AND/OR Patch Option Descriptor Structure
                      Field Name               Type          Comments
                      kind                  Elf64_Byte       value ODK_HWAND or ODK_HWOR
                      size                  Elf64_Byte       value is 16
                      section              Elf64_Section     0
                      info                  Elf64_Word       32 flags: see Table 24
007-4658-001              ELF-64 Object File Format                                                  Page   35

Table 23                  Hardware AND/OR Patch Option Descriptor Structure
                           Field Name                 Type        Comments
                           hwp_flags1            Elf64_Word       32 flags: see Table 24
                           hwp_flags2            Elf64_Word       32 flags: see Table 24

Table 24                  Hardware Patch AND/OR Options Descriptor Flags
  Mask Name                                   Value           Comments
  ODK_HWAND info masks:
  OHWA0_R4KEOP_CHECKED                     0x00000001         Object checked for R4K end-of-page bug.
  OHWA0_R4KEOP_CLEAN                       0x00000002         Object verified clean of R4K end-of-page bug.
  ODK_HWAND hwp_flags1 masks:
  OHWA1_...                                0x????????         None yet defined.
  ODK_HWAND hwp_flags2 masks:
  OHWA2_...                                0x????????         None yet defined.
  ODK_HWOR info masks:
  OHWO0_FIXADE                             0x00000001         Object requires call to fixade
  ODK_HWOR hwp_flags1 masks:
  OHWO1_...                                0x????????         None yet defined.
  ODK_HWAND hwp_flags2 masks:
  OHWO2_...                                0x????????         None yet defined.

                          The static linker must merge the ODK_HWAND (bitwise AND) and
   Linker
   Processing             ODK_HWOR (bitwise inclusive OR) flags from each of the objects it links.
                          Generating tools should initialize the flags to zero for fields they do not
                          understand, and the linker should assume that missing descriptors contain
                          zeroes.

                  2.8.6 Fill Value Option Descriptor

                          The ODK_FILL descriptor contains information only in the info field of the
                          basic options descriptor header, specifically the value used by the linker
                          to fill uninitialized space. Its size is 8 bytes.
Page   36                                                                              007-4658-001

            2.8.7 Tags Option Descriptor

                  The ODK_TAGS descriptor initially contains only zero-filled space (40
                  bytes). It is reserved for tools to identify processing that has occurred. Its
                  size is 48 bytes.

Table 25          Tags Option Descriptor
                   Field Name                   Type         Comments
                   kind                      Elf64_Byte      value is ODK_TAGS
                   size                      Elf64_Byte      value is 48
                   section                 Elf64_Section     0 (unused)
                   info                         mask         0 (unused)
                   tags                    Elf64_Byte[40]    initially 0. Bytes currently reserved:
                                                             0..4 (Desktop)
                                                             32..39 (other vendors)

                  The purpose of this descriptor is to allow tools to mark the object (exe-
                  cutable or DSO) without substantially rewriting the file, as would be re-
                  quired to add a new descriptor or section. Space in this descriptor should
                  be allocated very carefully, preferably a byte at a time. The .note section
                  is more appropriate if more space is required. The intent is that this allo-
                  cation last essentially forever. Although expansion is theoretically possi-
                  ble, doing so would eliminate its benefit for files created before the
                  expansion.

                  The last 8 bytes of the tags field are reserved for vendor-specific use by
                  non-MIPS/SGI vendors. Note, however, that such usage may conflict
                  with other vendors’ usage, and should therefore be limited to files which
                  is not expected to be handled by other vendors’ software.
You can also read