xcoff.mx raw
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 uint32 // Time and date of file creation
12 Fsymptr uint32 // Byte offset to symbol table start
13 Fnsyms uint32 // 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 uint32 // 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 uint32 // 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 uint16 // Section number of symbol
113 Ntype uint16 // Basic and derived type specification
114 Nsclass uint8 // Storage class of symbol
115 Nnumaux uint8 // 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 uint16 // Section number of symbol
122 Ntype uint16 // Basic and derived type specification
123 Nsclass uint8 // Storage class of symbol
124 Nnumaux uint8 // 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 uint32 // 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 uint32 // 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 uint32 // Loader section version number
278 Lnsyms uint32 // Number of symbol table entries
279 Lnreloc uint32 // Number of relocation table entries
280 Listlen uint32 // Length of import file ID string table
281 Lnimpid uint32 // 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 uint32 // Loader section version number
289 Lnsyms uint32 // Number of symbol table entries
290 Lnreloc uint32 // Number of relocation table entries
291 Listlen uint32 // Length of import file ID string table
292 Lnimpid uint32 // 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 uint16 // Section number containing symbol
310 Lsmtype uint8 // Symbol type, export, import flags
311 Lsmclas uint8 // Symbol storage class
312 Lifile uint32 // 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 uint16 // Section number containing symbol
320 Lsmtype uint8 // Symbol type, export, import flags
321 Lsmclas uint8 // Symbol storage class
322 Lifile uint32 // 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