1/* external.h -- External COFF structures 2 3 Copyright 2001, 2006, 2010 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 18 MA 02110-1301, USA. */ 19 20#ifndef COFF_EXTERNAL_H 21#define COFF_EXTERNAL_H 22 23#ifndef DO_NOT_DEFINE_FILHDR 24/********************** FILE HEADER **********************/ 25 26struct external_filehdr 27 { 28 char f_magic[2]; /* magic number */ 29 char f_nscns[2]; /* number of sections */ 30 char f_timdat[4]; /* time & date stamp */ 31 char f_symptr[4]; /* file pointer to symtab */ 32 char f_nsyms[4]; /* number of symtab entries */ 33 char f_opthdr[2]; /* sizeof(optional hdr) */ 34 char f_flags[2]; /* flags */ 35 }; 36 37#define FILHDR struct external_filehdr 38#define FILHSZ 20 39#endif 40 41#ifndef DO_NOT_DEFINE_AOUTHDR 42/********************** AOUT "OPTIONAL HEADER" **********************/ 43 44typedef struct external_aouthdr 45 { 46 char magic[2]; /* type of file */ 47 char vstamp[2]; /* version stamp */ 48 char tsize[4]; /* text size in bytes, padded to FW bdry*/ 49 char dsize[4]; /* initialized data " " */ 50 char bsize[4]; /* uninitialized data " " */ 51 char entry[4]; /* entry pt. */ 52 char text_start[4]; /* base of text used for this file */ 53 char data_start[4]; /* base of data used for this file */ 54 } ATTRIBUTE_PACKED 55AOUTHDR; 56 57#define AOUTHDRSZ 28 58#define AOUTSZ 28 59 60typedef struct external_aouthdr64 61{ 62 char magic[2]; /* Type of file. */ 63 char vstamp[2]; /* Version stamp. */ 64 char tsize[4]; /* Text size in bytes, padded to FW bdry*/ 65 char dsize[4]; /* Initialized data " ". */ 66 char bsize[4]; /* Uninitialized data " ". */ 67 char entry[4]; /* Entry pt. */ 68 char text_start[4]; /* Base of text used for this file. */ 69} 70AOUTHDR64; 71#define AOUTHDRSZ64 24 72 73#endif /* not DO_NOT_DEFINE_AOUTHDR */ 74 75#ifndef DO_NOT_DEFINE_SCNHDR 76/********************** SECTION HEADER **********************/ 77 78struct external_scnhdr 79 { 80 char s_name[8]; /* section name */ 81 char s_paddr[4]; /* physical address, aliased s_nlib */ 82 char s_vaddr[4]; /* virtual address */ 83 char s_size[4]; /* section size */ 84 char s_scnptr[4]; /* file ptr to raw data for section */ 85 char s_relptr[4]; /* file ptr to relocation */ 86 char s_lnnoptr[4]; /* file ptr to line numbers */ 87 char s_nreloc[2]; /* number of relocation entries */ 88 char s_nlnno[2]; /* number of line number entries */ 89 char s_flags[4]; /* flags */ 90 }; 91 92#define SCNHDR struct external_scnhdr 93#define SCNHSZ 40 94 95/* Names of "special" sections. */ 96 97#define _TEXT ".text" 98#define _DATA ".data" 99#define _BSS ".bss" 100#define _COMMENT ".comment" 101#define _LIB ".lib" 102#endif /* not DO_NOT_DEFINE_SCNHDR */ 103 104#ifndef DO_NOT_DEFINE_LINENO 105 106/********************** LINE NUMBERS **********************/ 107 108#ifndef L_LNNO_SIZE 109#error L_LNNO_SIZE needs to be defined 110#endif 111 112/* 1 line number entry for every "breakpointable" source line in a section. 113 Line numbers are grouped on a per function basis; first entry in a function 114 grouping will have l_lnno = 0 and in place of physical address will be the 115 symbol table index of the function name. */ 116struct external_lineno 117{ 118 union 119 { 120 char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ 121 char l_paddr[4]; /* (physical) address of line number */ 122 } l_addr; 123 124 char l_lnno[L_LNNO_SIZE]; /* line number */ 125}; 126 127#define LINENO struct external_lineno 128#define LINESZ (4 + L_LNNO_SIZE) 129 130#if L_LNNO_SIZE == 4 131#define GET_LINENO_LNNO(abfd, ext) H_GET_32 (abfd, (ext->l_lnno)) 132#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_32 (abfd, val, (ext->l_lnno)) 133#endif 134#if L_LNNO_SIZE == 2 135#define GET_LINENO_LNNO(abfd, ext) H_GET_16 (abfd, (ext->l_lnno)) 136#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_16 (abfd, val, (ext->l_lnno)) 137#endif 138 139#endif /* not DO_NOT_DEFINE_LINENO */ 140 141#ifndef DO_NOT_DEFINE_SYMENT 142/********************** SYMBOLS **********************/ 143 144#define E_SYMNMLEN 8 /* # characters in a symbol name */ 145#ifndef E_FILNMLEN 146#define E_FILNMLEN 14 147#endif 148#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ 149 150struct external_syment 151{ 152 union 153 { 154 char e_name[E_SYMNMLEN]; 155 156 struct 157 { 158 char e_zeroes[4]; 159 char e_offset[4]; 160 } e; 161 } e; 162 163 char e_value[4]; 164 char e_scnum[2]; 165 char e_type[2]; 166 char e_sclass[1]; 167 char e_numaux[1]; 168} ATTRIBUTE_PACKED ; 169 170#define SYMENT struct external_syment 171#define SYMESZ 18 172 173#ifndef N_BTMASK 174#define N_BTMASK 0xf 175#endif 176 177#ifndef N_TMASK 178#define N_TMASK 0x30 179#endif 180 181#ifndef N_BTSHFT 182#define N_BTSHFT 4 183#endif 184 185#ifndef N_TSHIFT 186#define N_TSHIFT 2 187#endif 188 189#endif /* not DO_NOT_DEFINE_SYMENT */ 190 191#ifndef DO_NOT_DEFINE_AUXENT 192 193union external_auxent 194{ 195 struct 196 { 197 char x_tagndx[4]; /* str, un, or enum tag indx */ 198 199 union 200 { 201 struct 202 { 203 char x_lnno[2]; /* declaration line number */ 204 char x_size[2]; /* str/union/array size */ 205 } x_lnsz; 206 207 char x_fsize[4]; /* size of function */ 208 209 } x_misc; 210 211 union 212 { 213 struct /* if ISFCN, tag, or .bb */ 214 { 215 char x_lnnoptr[4]; /* ptr to fcn line # */ 216 char x_endndx[4]; /* entry ndx past block end */ 217 } x_fcn; 218 219 struct /* if ISARY, up to 4 dimen. */ 220 { 221 char x_dimen[E_DIMNUM][2]; 222 } x_ary; 223 224 } x_fcnary; 225 226 char x_tvndx[2]; /* tv index */ 227 228 } x_sym; 229 230 union 231 { 232 char x_fname[E_FILNMLEN]; 233 234 struct 235 { 236 char x_zeroes[4]; 237 char x_offset[4]; 238 } x_n; 239 240 } x_file; 241 242 struct 243 { 244 char x_scnlen[4]; /* section length */ 245 char x_nreloc[2]; /* # relocation entries */ 246 char x_nlinno[2]; /* # line numbers */ 247#ifdef INCLUDE_COMDAT_FIELDS_IN_AUXENT 248 char x_checksum[4]; /* section COMDAT checksum */ 249 char x_associated[2]; /* COMDAT associated section index */ 250 char x_comdat[1]; /* COMDAT selection number */ 251#endif 252 } x_scn; 253 254 struct 255 { 256 char x_tvfill[4]; /* tv fill value */ 257 char x_tvlen[2]; /* length of .tv */ 258 char x_tvran[2][2]; /* tv range */ 259 } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ 260} ATTRIBUTE_PACKED ; 261 262#define AUXENT union external_auxent 263#define AUXESZ 18 264 265#define _ETEXT "etext" 266 267#endif /* not DO_NOT_DEFINE_AUXENT */ 268 269#endif /* COFF_EXTERNAL_H */ 270