| // Copyright 2014 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| /* |
| * Plan 9 a.out constants and data structures |
| */ |
| |
| package plan9obj |
| |
| import ( |
| "bytes" |
| "encoding/binary" |
| ) |
| |
| // Plan 9 Program header. |
| type prog struct { |
| Magic uint32 /* magic number */ |
| Text uint32 /* size of text segment */ |
| Data uint32 /* size of initialized data */ |
| Bss uint32 /* size of uninitialized data */ |
| Syms uint32 /* size of symbol table */ |
| Entry uint32 /* entry point */ |
| Spsz uint32 /* size of pc/sp offset table */ |
| Pcsz uint32 /* size of pc/line number table */ |
| } |
| |
| // Plan 9 symbol table entries. |
| type sym struct { |
| value uint64 |
| typ byte |
| name []byte |
| } |
| |
| const ( |
| hsize = 4 * 8 |
| _HDR_MAGIC = 0x00008000 /* header expansion */ |
| ) |
| |
| func magic(f, b int) string { |
| buf := new(bytes.Buffer) |
| var i uint32 = uint32((f) | ((((4 * (b)) + 0) * (b)) + 7)) |
| binary.Write(buf, binary.BigEndian, i) |
| return string(buf.Bytes()) |
| } |
| |
| var ( |
| _A_MAGIC = magic(0, 8) /* 68020 (retired) */ |
| _I_MAGIC = magic(0, 11) /* intel 386 */ |
| _J_MAGIC = magic(0, 12) /* intel 960 (retired) */ |
| _K_MAGIC = magic(0, 13) /* sparc */ |
| _V_MAGIC = magic(0, 16) /* mips 3000 BE */ |
| _X_MAGIC = magic(0, 17) /* att dsp 3210 (retired) */ |
| _M_MAGIC = magic(0, 18) /* mips 4000 BE */ |
| _D_MAGIC = magic(0, 19) /* amd 29000 (retired) */ |
| _E_MAGIC = magic(0, 20) /* arm */ |
| _Q_MAGIC = magic(0, 21) /* powerpc */ |
| _N_MAGIC = magic(0, 22) /* mips 4000 LE */ |
| _L_MAGIC = magic(0, 23) /* dec alpha (retired) */ |
| _P_MAGIC = magic(0, 24) /* mips 3000 LE */ |
| _U_MAGIC = magic(0, 25) /* sparc64 (retired) */ |
| _S_MAGIC = magic(_HDR_MAGIC, 26) /* amd64 */ |
| _T_MAGIC = magic(_HDR_MAGIC, 27) /* powerpc64 */ |
| _R_MAGIC = magic(_HDR_MAGIC, 28) /* arm64 */ |
| ) |
| |
| type ExecTable struct { |
| Magic string |
| Ptrsz int |
| Hsize uint32 |
| } |
| |
| var exectab = []ExecTable{ |
| {_A_MAGIC, 4, hsize}, |
| {_I_MAGIC, 4, hsize}, |
| {_J_MAGIC, 4, hsize}, |
| {_K_MAGIC, 4, hsize}, |
| {_V_MAGIC, 4, hsize}, |
| {_X_MAGIC, 4, hsize}, |
| {_M_MAGIC, 4, hsize}, |
| {_D_MAGIC, 4, hsize}, |
| {_E_MAGIC, 4, hsize}, |
| {_Q_MAGIC, 4, hsize}, |
| {_N_MAGIC, 4, hsize}, |
| {_L_MAGIC, 4, hsize}, |
| {_P_MAGIC, 4, hsize}, |
| {_U_MAGIC, 4, hsize}, |
| {_S_MAGIC, 8, hsize + 8}, |
| {_T_MAGIC, 8, hsize + 8}, |
| {_R_MAGIC, 8, hsize + 8}, |
| } |