1 /*** coff information for WDC 65816 */ 2 3 /********************** FILE HEADER **********************/ 4 5 struct external_filehdr { 6 char f_magic[2]; /* magic number */ 7 char f_nscns[2]; /* number of sections */ 8 char f_timdat[4]; /* time & date stamp */ 9 char f_symptr[4]; /* file pointer to symtab */ 10 char f_nsyms[4]; /* number of symtab entries */ 11 char f_opthdr[2]; /* sizeof(optional hdr) */ 12 char f_flags[2]; /* flags */ 13 }; 14 15 16 17 #define W65MAGIC 0x6500 18 19 20 #define W65BADMAG(x) (((x).f_magic!=W65MAGIC)) 21 22 #define FILHDR struct external_filehdr 23 #define FILHSZ sizeof(FILHDR) 24 25 26 /********************** AOUT "OPTIONAL HEADER" **********************/ 27 28 29 typedef struct 30 { 31 char magic[2]; /* type of file */ 32 char vstamp[2]; /* version stamp */ 33 char tsize[4]; /* text size in bytes, padded to FW bdry*/ 34 char dsize[4]; /* initialized data " " */ 35 char bsize[4]; /* uninitialized data " " */ 36 char entry[4]; /* entry pt. */ 37 char text_start[4]; /* base of text used for this file */ 38 char data_start[4]; /* base of data used for this file */ 39 } 40 AOUTHDR; 41 42 43 #define AOUTHDRSZ (sizeof(AOUTHDR)) 44 #define AOUTSZ (sizeof(AOUTHDR)) 45 46 47 48 49 /********************** SECTION HEADER **********************/ 50 51 52 struct external_scnhdr { 53 char s_name[8]; /* section name */ 54 char s_paddr[4]; /* physical address, aliased s_nlib */ 55 char s_vaddr[4]; /* virtual address */ 56 char s_size[4]; /* section size */ 57 char s_scnptr[4]; /* file ptr to raw data for section */ 58 char s_relptr[4]; /* file ptr to relocation */ 59 char s_lnnoptr[4]; /* file ptr to line numbers */ 60 char s_nreloc[2]; /* number of relocation entries */ 61 char s_nlnno[2]; /* number of line number entries*/ 62 char s_flags[4]; /* flags */ 63 }; 64 65 /* 66 * names of "special" sections 67 */ 68 #define _TEXT ".text" 69 #define _DATA ".data" 70 #define _BSS ".bss" 71 72 73 #define SCNHDR struct external_scnhdr 74 #define SCNHSZ sizeof(SCNHDR) 75 76 77 /********************** LINE NUMBERS **********************/ 78 79 /* 1 line number entry for every "breakpointable" source line in a section. 80 * Line numbers are grouped on a per function basis; first entry in a function 81 * grouping will have l_lnno = 0 and in place of physical address will be the 82 * symbol table index of the function name. 83 */ 84 struct external_lineno { 85 union { 86 char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ 87 char l_paddr[4]; /* (physical) address of line number */ 88 } l_addr; 89 char l_lnno[4]; /* line number */ 90 }; 91 92 #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) (ext->l_lnno)); 93 #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_32(abfd,val, (bfd_byte *) (ext->l_lnno)); 94 95 #define LINENO struct external_lineno 96 #define LINESZ sizeof(LINENO) 97 98 99 /********************** SYMBOLS **********************/ 100 101 #define E_SYMNMLEN 8 /* # characters in a symbol name */ 102 #define E_FILNMLEN 14 /* # characters in a file name */ 103 #define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ 104 105 struct external_syment 106 { 107 union { 108 char e_name[E_SYMNMLEN]; 109 struct { 110 char e_zeroes[4]; 111 char e_offset[4]; 112 } e; 113 } e; 114 char e_value[4]; 115 char e_scnum[2]; 116 char e_type[2]; 117 char e_sclass[1]; 118 char e_numaux[1]; 119 }; 120 121 122 123 #define N_BTMASK (017) 124 #define N_TMASK (060) 125 #define N_BTSHFT (4) 126 #define N_TSHIFT (2) 127 128 129 union external_auxent { 130 struct { 131 char x_tagndx[4]; /* str, un, or enum tag indx */ 132 union { 133 struct { 134 char x_lnno[2]; /* declaration line number */ 135 char x_size[2]; /* str/union/array size */ 136 } x_lnsz; 137 char x_fsize[4]; /* size of function */ 138 } x_misc; 139 union { 140 struct { /* if ISFCN, tag, or .bb */ 141 char x_lnnoptr[4]; /* ptr to fcn line # */ 142 char x_endndx[4]; /* entry ndx past block end */ 143 } x_fcn; 144 struct { /* if ISARY, up to 4 dimen. */ 145 char x_dimen[E_DIMNUM][2]; 146 } x_ary; 147 } x_fcnary; 148 char x_tvndx[2]; /* tv index */ 149 } x_sym; 150 151 union { 152 char x_fname[E_FILNMLEN]; 153 struct { 154 char x_zeroes[4]; 155 char x_offset[4]; 156 } x_n; 157 } x_file; 158 159 struct { 160 char x_scnlen[4]; /* section length */ 161 char x_nreloc[2]; /* # relocation entries */ 162 char x_nlinno[2]; /* # line numbers */ 163 } x_scn; 164 165 struct { 166 char x_tvfill[4]; /* tv fill value */ 167 char x_tvlen[2]; /* length of .tv */ 168 char x_tvran[2][2]; /* tv range */ 169 } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ 170 171 172 }; 173 174 #define SYMENT struct external_syment 175 #define SYMESZ 18 176 #define AUXENT union external_auxent 177 #define AUXESZ 18 178 179 180 181 /********************** RELOCATION DIRECTIVES **********************/ 182 183 /* The external reloc has an offset field, because some of the reloc 184 types on the w65 don't have room in the instruction for the entire 185 offset - eg the strange jump and high page addressing modes */ 186 187 struct external_reloc { 188 char r_vaddr[4]; 189 char r_symndx[4]; 190 char r_offset[4]; 191 char r_type[2]; 192 char r_stuff[2]; 193 }; 194 195 196 #define RELOC struct external_reloc 197 #define RELSZ 16 198 199 200 201 202