...

Source file src/pkg/internal/xcoff/xcoff.go

     1	// Copyright 2018 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	package xcoff
     6	
     7	// File Header.
     8	type FileHeader32 struct {
     9		Fmagic   uint16 // Target machine
    10		Fnscns   uint16 // Number of sections
    11		Ftimedat int32  // Time and date of file creation
    12		Fsymptr  uint32 // Byte offset to symbol table start
    13		Fnsyms   int32  // Number of entries in symbol table
    14		Fopthdr  uint16 // Number of bytes in optional header
    15		Fflags   uint16 // Flags
    16	}
    17	
    18	type FileHeader64 struct {
    19		Fmagic   uint16 // Target machine
    20		Fnscns   uint16 // Number of sections
    21		Ftimedat int32  // Time and date of file creation
    22		Fsymptr  uint64 // Byte offset to symbol table start
    23		Fopthdr  uint16 // Number of bytes in optional header
    24		Fflags   uint16 // Flags
    25		Fnsyms   int32  // Number of entries in symbol table
    26	}
    27	
    28	const (
    29		FILHSZ_32 = 20
    30		FILHSZ_64 = 24
    31	)
    32	const (
    33		U802TOCMAGIC = 0737 // AIX 32-bit XCOFF
    34		U64_TOCMAGIC = 0767 // AIX 64-bit XCOFF
    35	)
    36	
    37	// Flags that describe the type of the object file.
    38	const (
    39		F_RELFLG    = 0x0001
    40		F_EXEC      = 0x0002
    41		F_LNNO      = 0x0004
    42		F_FDPR_PROF = 0x0010
    43		F_FDPR_OPTI = 0x0020
    44		F_DSA       = 0x0040
    45		F_VARPG     = 0x0100
    46		F_DYNLOAD   = 0x1000
    47		F_SHROBJ    = 0x2000
    48		F_LOADONLY  = 0x4000
    49	)
    50	
    51	// Section Header.
    52	type SectionHeader32 struct {
    53		Sname    [8]byte // Section name
    54		Spaddr   uint32  // Physical address
    55		Svaddr   uint32  // Virtual address
    56		Ssize    uint32  // Section size
    57		Sscnptr  uint32  // Offset in file to raw data for section
    58		Srelptr  uint32  // Offset in file to relocation entries for section
    59		Slnnoptr uint32  // Offset in file to line number entries for section
    60		Snreloc  uint16  // Number of relocation entries
    61		Snlnno   uint16  // Number of line number entries
    62		Sflags   uint32  // Flags to define the section type
    63	}
    64	
    65	type SectionHeader64 struct {
    66		Sname    [8]byte // Section name
    67		Spaddr   uint64  // Physical address
    68		Svaddr   uint64  // Virtual address
    69		Ssize    uint64  // Section size
    70		Sscnptr  uint64  // Offset in file to raw data for section
    71		Srelptr  uint64  // Offset in file to relocation entries for section
    72		Slnnoptr uint64  // Offset in file to line number entries for section
    73		Snreloc  uint32  // Number of relocation entries
    74		Snlnno   uint32  // Number of line number entries
    75		Sflags   uint32  // Flags to define the section type
    76		Spad     uint32  // Needs to be 72 bytes long
    77	}
    78	
    79	// Flags defining the section type.
    80	const (
    81		STYP_DWARF  = 0x0010
    82		STYP_TEXT   = 0x0020
    83		STYP_DATA   = 0x0040
    84		STYP_BSS    = 0x0080
    85		STYP_EXCEPT = 0x0100
    86		STYP_INFO   = 0x0200
    87		STYP_TDATA  = 0x0400
    88		STYP_TBSS   = 0x0800
    89		STYP_LOADER = 0x1000
    90		STYP_DEBUG  = 0x2000
    91		STYP_TYPCHK = 0x4000
    92		STYP_OVRFLO = 0x8000
    93	)
    94	const (
    95		SSUBTYP_DWINFO  = 0x10000 // DWARF info section
    96		SSUBTYP_DWLINE  = 0x20000 // DWARF line-number section
    97		SSUBTYP_DWPBNMS = 0x30000 // DWARF public names section
    98		SSUBTYP_DWPBTYP = 0x40000 // DWARF public types section
    99		SSUBTYP_DWARNGE = 0x50000 // DWARF aranges section
   100		SSUBTYP_DWABREV = 0x60000 // DWARF abbreviation section
   101		SSUBTYP_DWSTR   = 0x70000 // DWARF strings section
   102		SSUBTYP_DWRNGES = 0x80000 // DWARF ranges section
   103		SSUBTYP_DWLOC   = 0x90000 // DWARF location lists section
   104		SSUBTYP_DWFRAME = 0xA0000 // DWARF frames section
   105		SSUBTYP_DWMAC   = 0xB0000 // DWARF macros section
   106	)
   107	
   108	// Symbol Table Entry.
   109	type SymEnt32 struct {
   110		Nname   [8]byte // Symbol name
   111		Nvalue  uint32  // Symbol value
   112		Nscnum  int16   // Section number of symbol
   113		Ntype   uint16  // Basic and derived type specification
   114		Nsclass int8    // Storage class of symbol
   115		Nnumaux int8    // Number of auxiliary entries
   116	}
   117	
   118	type SymEnt64 struct {
   119		Nvalue  uint64 // Symbol value
   120		Noffset uint32 // Offset of the name in string table or .debug section
   121		Nscnum  int16  // Section number of symbol
   122		Ntype   uint16 // Basic and derived type specification
   123		Nsclass int8   // Storage class of symbol
   124		Nnumaux int8   // Number of auxiliary entries
   125	}
   126	
   127	const SYMESZ = 18
   128	
   129	const (
   130		// Nscnum
   131		N_DEBUG = -2
   132		N_ABS   = -1
   133		N_UNDEF = 0
   134	
   135		//Ntype
   136		SYM_V_INTERNAL  = 0x1000
   137		SYM_V_HIDDEN    = 0x2000
   138		SYM_V_PROTECTED = 0x3000
   139		SYM_V_EXPORTED  = 0x4000
   140		SYM_TYPE_FUNC   = 0x0020 // is function
   141	)
   142	
   143	// Storage Class.
   144	const (
   145		C_NULL    = 0   // Symbol table entry marked for deletion
   146		C_EXT     = 2   // External symbol
   147		C_STAT    = 3   // Static symbol
   148		C_BLOCK   = 100 // Beginning or end of inner block
   149		C_FCN     = 101 // Beginning or end of function
   150		C_FILE    = 103 // Source file name and compiler information
   151		C_HIDEXT  = 107 // Unnamed external symbol
   152		C_BINCL   = 108 // Beginning of include file
   153		C_EINCL   = 109 // End of include file
   154		C_WEAKEXT = 111 // Weak external symbol
   155		C_DWARF   = 112 // DWARF symbol
   156		C_GSYM    = 128 // Global variable
   157		C_LSYM    = 129 // Automatic variable allocated on stack
   158		C_PSYM    = 130 // Argument to subroutine allocated on stack
   159		C_RSYM    = 131 // Register variable
   160		C_RPSYM   = 132 // Argument to function or procedure stored in register
   161		C_STSYM   = 133 // Statically allocated symbol
   162		C_BCOMM   = 135 // Beginning of common block
   163		C_ECOML   = 136 // Local member of common block
   164		C_ECOMM   = 137 // End of common block
   165		C_DECL    = 140 // Declaration of object
   166		C_ENTRY   = 141 // Alternate entry
   167		C_FUN     = 142 // Function or procedure
   168		C_BSTAT   = 143 // Beginning of static block
   169		C_ESTAT   = 144 // End of static block
   170		C_GTLS    = 145 // Global thread-local variable
   171		C_STTLS   = 146 // Static thread-local variable
   172	)
   173	
   174	// File Auxiliary Entry
   175	type AuxFile64 struct {
   176		Xfname   [8]byte // Name or offset inside string table
   177		Xftype   uint8   // Source file string type
   178		Xauxtype uint8   // Type of auxiliary entry
   179	}
   180	
   181	// Function Auxiliary Entry
   182	type AuxFcn32 struct {
   183		Xexptr   uint32 // File offset to exception table entry
   184		Xfsize   uint32 // Size of function in bytes
   185		Xlnnoptr uint32 // File pointer to line number
   186		Xendndx  uint32 // Symbol table index of next entry
   187		Xpad     uint16 // Unused
   188	}
   189	type AuxFcn64 struct {
   190		Xlnnoptr uint64 // File pointer to line number
   191		Xfsize   uint32 // Size of function in bytes
   192		Xendndx  uint32 // Symbol table index of next entry
   193		Xpad     uint8  // Unused
   194		Xauxtype uint8  // Type of auxiliary entry
   195	}
   196	
   197	type AuxSect64 struct {
   198		Xscnlen  uint64 // section length
   199		Xnreloc  uint64 // Num RLDs
   200		pad      uint8
   201		Xauxtype uint8 // Type of auxiliary entry
   202	}
   203	
   204	// csect Auxiliary Entry.
   205	type AuxCSect32 struct {
   206		Xscnlen   int32  // Length or symbol table index
   207		Xparmhash uint32 // Offset of parameter type-check string
   208		Xsnhash   uint16 // .typchk section number
   209		Xsmtyp    uint8  // Symbol alignment and type
   210		Xsmclas   uint8  // Storage-mapping class
   211		Xstab     uint32 // Reserved
   212		Xsnstab   uint16 // Reserved
   213	}
   214	
   215	type AuxCSect64 struct {
   216		Xscnlenlo uint32 // Lower 4 bytes of length or symbol table index
   217		Xparmhash uint32 // Offset of parameter type-check string
   218		Xsnhash   uint16 // .typchk section number
   219		Xsmtyp    uint8  // Symbol alignment and type
   220		Xsmclas   uint8  // Storage-mapping class
   221		Xscnlenhi int32  // Upper 4 bytes of length or symbol table index
   222		Xpad      uint8  // Unused
   223		Xauxtype  uint8  // Type of auxiliary entry
   224	}
   225	
   226	// Auxiliary type
   227	const (
   228		_AUX_EXCEPT = 255
   229		_AUX_FCN    = 254
   230		_AUX_SYM    = 253
   231		_AUX_FILE   = 252
   232		_AUX_CSECT  = 251
   233		_AUX_SECT   = 250
   234	)
   235	
   236	// Symbol type field.
   237	const (
   238		XTY_ER = 0 // External reference
   239		XTY_SD = 1 // Section definition
   240		XTY_LD = 2 // Label definition
   241		XTY_CM = 3 // Common csect definition
   242	)
   243	
   244	// Defines for File auxiliary definitions: x_ftype field of x_file
   245	const (
   246		XFT_FN = 0   // Source File Name
   247		XFT_CT = 1   // Compile Time Stamp
   248		XFT_CV = 2   // Compiler Version Number
   249		XFT_CD = 128 // Compiler Defined Information
   250	)
   251	
   252	// Storage-mapping class.
   253	const (
   254		XMC_PR     = 0  // Program code
   255		XMC_RO     = 1  // Read-only constant
   256		XMC_DB     = 2  // Debug dictionary table
   257		XMC_TC     = 3  // TOC entry
   258		XMC_UA     = 4  // Unclassified
   259		XMC_RW     = 5  // Read/Write data
   260		XMC_GL     = 6  // Global linkage
   261		XMC_XO     = 7  // Extended operation
   262		XMC_SV     = 8  // 32-bit supervisor call descriptor
   263		XMC_BS     = 9  // BSS class
   264		XMC_DS     = 10 // Function descriptor
   265		XMC_UC     = 11 // Unnamed FORTRAN common
   266		XMC_TC0    = 15 // TOC anchor
   267		XMC_TD     = 16 // Scalar data entry in the TOC
   268		XMC_SV64   = 17 // 64-bit supervisor call descriptor
   269		XMC_SV3264 = 18 // Supervisor call descriptor for both 32-bit and 64-bit
   270		XMC_TL     = 20 // Read/Write thread-local data
   271		XMC_UL     = 21 // Read/Write thread-local data (.tbss)
   272		XMC_TE     = 22 // TOC entry
   273	)
   274	
   275	// Loader Header.
   276	type LoaderHeader32 struct {
   277		Lversion int32  // Loader section version number
   278		Lnsyms   int32  // Number of symbol table entries
   279		Lnreloc  int32  // Number of relocation table entries
   280		Listlen  uint32 // Length of import file ID string table
   281		Lnimpid  int32  // Number of import file IDs
   282		Limpoff  uint32 // Offset to start of import file IDs
   283		Lstlen   uint32 // Length of string table
   284		Lstoff   uint32 // Offset to start of string table
   285	}
   286	
   287	type LoaderHeader64 struct {
   288		Lversion int32  // Loader section version number
   289		Lnsyms   int32  // Number of symbol table entries
   290		Lnreloc  int32  // Number of relocation table entries
   291		Listlen  uint32 // Length of import file ID string table
   292		Lnimpid  int32  // Number of import file IDs
   293		Lstlen   uint32 // Length of string table
   294		Limpoff  uint64 // Offset to start of import file IDs
   295		Lstoff   uint64 // Offset to start of string table
   296		Lsymoff  uint64 // Offset to start of symbol table
   297		Lrldoff  uint64 // Offset to start of relocation entries
   298	}
   299	
   300	const (
   301		LDHDRSZ_32 = 32
   302		LDHDRSZ_64 = 56
   303	)
   304	
   305	// Loader Symbol.
   306	type LoaderSymbol32 struct {
   307		Lname   [8]byte // Symbol name or byte offset into string table
   308		Lvalue  uint32  // Address field
   309		Lscnum  int16   // Section number containing symbol
   310		Lsmtype int8    // Symbol type, export, import flags
   311		Lsmclas int8    // Symbol storage class
   312		Lifile  int32   // Import file ID; ordinal of import file IDs
   313		Lparm   uint32  // Parameter type-check field
   314	}
   315	
   316	type LoaderSymbol64 struct {
   317		Lvalue  uint64 // Address field
   318		Loffset uint32 // Byte offset into string table of symbol name
   319		Lscnum  int16  // Section number containing symbol
   320		Lsmtype int8   // Symbol type, export, import flags
   321		Lsmclas int8   // Symbol storage class
   322		Lifile  int32  // Import file ID; ordinal of import file IDs
   323		Lparm   uint32 // Parameter type-check field
   324	}
   325	
   326	type Reloc32 struct {
   327		Rvaddr  uint32 // (virtual) address of reference
   328		Rsymndx uint32 // Index into symbol table
   329		Rsize   uint8  // Sign and reloc bit len
   330		Rtype   uint8  // Toc relocation type
   331	}
   332	
   333	type Reloc64 struct {
   334		Rvaddr  uint64 // (virtual) address of reference
   335		Rsymndx uint32 // Index into symbol table
   336		Rsize   uint8  // Sign and reloc bit len
   337		Rtype   uint8  // Toc relocation type
   338	}
   339	
   340	const (
   341		R_POS = 0x00 // A(sym) Positive Relocation
   342		R_NEG = 0x01 // -A(sym) Negative Relocation
   343		R_REL = 0x02 // A(sym-*) Relative to self
   344		R_TOC = 0x03 // A(sym-TOC) Relative to TOC
   345		R_TRL = 0x12 // A(sym-TOC) TOC Relative indirect load.
   346	
   347		R_TRLA = 0x13 // A(sym-TOC) TOC Rel load address. modifiable inst
   348		R_GL   = 0x05 // A(external TOC of sym) Global Linkage
   349		R_TCL  = 0x06 // A(local TOC of sym) Local object TOC address
   350		R_RL   = 0x0C // A(sym) Pos indirect load. modifiable instruction
   351		R_RLA  = 0x0D // A(sym) Pos Load Address. modifiable instruction
   352		R_REF  = 0x0F // AL0(sym) Non relocating ref. No garbage collect
   353		R_BA   = 0x08 // A(sym) Branch absolute. Cannot modify instruction
   354		R_RBA  = 0x18 // A(sym) Branch absolute. modifiable instruction
   355		R_BR   = 0x0A // A(sym-*) Branch rel to self. non modifiable
   356		R_RBR  = 0x1A // A(sym-*) Branch rel to self. modifiable instr
   357	
   358		R_TLS    = 0x20 // General-dynamic reference to TLS symbol
   359		R_TLS_IE = 0x21 // Initial-exec reference to TLS symbol
   360		R_TLS_LD = 0x22 // Local-dynamic reference to TLS symbol
   361		R_TLS_LE = 0x23 // Local-exec reference to TLS symbol
   362		R_TLSM   = 0x24 // Module reference to TLS symbol
   363		R_TLSML  = 0x25 // Module reference to local (own) module
   364	
   365		R_TOCU = 0x30 // Relative to TOC - high order bits
   366		R_TOCL = 0x31 // Relative to TOC - low order bits
   367	)
   368	

View as plain text