189857Sobrien/* external.h -- External COFF structures 289857Sobrien 3218822Sdim Copyright 2001, 2006 Free Software Foundation, Inc. 489857Sobrien 589857Sobrien This program is free software; you can redistribute it and/or modify 689857Sobrien it under the terms of the GNU General Public License as published by 789857Sobrien the Free Software Foundation; either version 2 of the License, or 889857Sobrien (at your option) any later version. 989857Sobrien 1089857Sobrien This program is distributed in the hope that it will be useful, 1189857Sobrien but WITHOUT ANY WARRANTY; without even the implied warranty of 1289857Sobrien MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1389857Sobrien GNU General Public License for more details. 1489857Sobrien 1589857Sobrien You should have received a copy of the GNU General Public License 1689857Sobrien along with this program; if not, write to the Free Software 17218822Sdim Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 1889857Sobrien 1989857Sobrien#ifndef COFF_EXTERNAL_H 2089857Sobrien#define COFF_EXTERNAL_H 2189857Sobrien 2289857Sobrien#ifndef DO_NOT_DEFINE_FILHDR 2389857Sobrien/********************** FILE HEADER **********************/ 2489857Sobrien 2589857Sobrienstruct external_filehdr 2689857Sobrien { 2789857Sobrien char f_magic[2]; /* magic number */ 2889857Sobrien char f_nscns[2]; /* number of sections */ 2989857Sobrien char f_timdat[4]; /* time & date stamp */ 3089857Sobrien char f_symptr[4]; /* file pointer to symtab */ 3189857Sobrien char f_nsyms[4]; /* number of symtab entries */ 3289857Sobrien char f_opthdr[2]; /* sizeof(optional hdr) */ 3389857Sobrien char f_flags[2]; /* flags */ 3489857Sobrien }; 3589857Sobrien 3689857Sobrien#define FILHDR struct external_filehdr 3789857Sobrien#define FILHSZ 20 3889857Sobrien#endif 3989857Sobrien 4089857Sobrien#ifndef DO_NOT_DEFINE_AOUTHDR 4189857Sobrien/********************** AOUT "OPTIONAL HEADER" **********************/ 4289857Sobrien 4389857Sobrientypedef struct external_aouthdr 4489857Sobrien { 4589857Sobrien char magic[2]; /* type of file */ 4689857Sobrien char vstamp[2]; /* version stamp */ 4789857Sobrien char tsize[4]; /* text size in bytes, padded to FW bdry*/ 4889857Sobrien char dsize[4]; /* initialized data " " */ 4989857Sobrien char bsize[4]; /* uninitialized data " " */ 5089857Sobrien char entry[4]; /* entry pt. */ 5189857Sobrien char text_start[4]; /* base of text used for this file */ 5289857Sobrien char data_start[4]; /* base of data used for this file */ 53218822Sdim } ATTRIBUTE_PACKED 5489857SobrienAOUTHDR; 5589857Sobrien 5689857Sobrien#define AOUTHDRSZ 28 5789857Sobrien#define AOUTSZ 28 5889857Sobrien 59218822Sdimtypedef struct external_aouthdr64 60218822Sdim{ 61218822Sdim char magic[2]; /* Type of file. */ 62218822Sdim char vstamp[2]; /* Version stamp. */ 63218822Sdim char tsize[4]; /* Text size in bytes, padded to FW bdry*/ 64218822Sdim char dsize[4]; /* Initialized data " ". */ 65218822Sdim char bsize[4]; /* Uninitialized data " ". */ 66218822Sdim char entry[4]; /* Entry pt. */ 67218822Sdim char text_start[4]; /* Base of text used for this file. */ 68218822Sdim} 69218822SdimAOUTHDR64; 70218822Sdim#define AOUTHDRSZ64 24 71218822Sdim 72218822Sdim#endif /* not DO_NOT_DEFINE_AOUTHDR */ 73218822Sdim 7489857Sobrien#ifndef DO_NOT_DEFINE_SCNHDR 7589857Sobrien/********************** SECTION HEADER **********************/ 7689857Sobrien 7789857Sobrienstruct external_scnhdr 7889857Sobrien { 7989857Sobrien char s_name[8]; /* section name */ 8089857Sobrien char s_paddr[4]; /* physical address, aliased s_nlib */ 8189857Sobrien char s_vaddr[4]; /* virtual address */ 8289857Sobrien char s_size[4]; /* section size */ 8389857Sobrien char s_scnptr[4]; /* file ptr to raw data for section */ 8489857Sobrien char s_relptr[4]; /* file ptr to relocation */ 8589857Sobrien char s_lnnoptr[4]; /* file ptr to line numbers */ 8689857Sobrien char s_nreloc[2]; /* number of relocation entries */ 8789857Sobrien char s_nlnno[2]; /* number of line number entries */ 8889857Sobrien char s_flags[4]; /* flags */ 8989857Sobrien }; 9089857Sobrien 9189857Sobrien#define SCNHDR struct external_scnhdr 9289857Sobrien#define SCNHSZ 40 9389857Sobrien 9489857Sobrien/* Names of "special" sections. */ 9589857Sobrien 9689857Sobrien#define _TEXT ".text" 9789857Sobrien#define _DATA ".data" 9889857Sobrien#define _BSS ".bss" 9989857Sobrien#define _COMMENT ".comment" 10089857Sobrien#define _LIB ".lib" 10189857Sobrien#endif /* not DO_NOT_DEFINE_SCNHDR */ 10289857Sobrien 10389857Sobrien#ifndef DO_NOT_DEFINE_LINENO 10489857Sobrien 10589857Sobrien/********************** LINE NUMBERS **********************/ 10689857Sobrien 10789857Sobrien#ifndef L_LNNO_SIZE 10889857Sobrien#error L_LNNO_SIZE needs to be defined 10989857Sobrien#endif 11089857Sobrien 11189857Sobrien/* 1 line number entry for every "breakpointable" source line in a section. 11289857Sobrien Line numbers are grouped on a per function basis; first entry in a function 11389857Sobrien grouping will have l_lnno = 0 and in place of physical address will be the 11489857Sobrien symbol table index of the function name. */ 11589857Sobrienstruct external_lineno 11689857Sobrien{ 11789857Sobrien union 11889857Sobrien { 11989857Sobrien char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ 12089857Sobrien char l_paddr[4]; /* (physical) address of line number */ 12189857Sobrien } l_addr; 12289857Sobrien 12389857Sobrien char l_lnno[L_LNNO_SIZE]; /* line number */ 12489857Sobrien}; 12589857Sobrien 12689857Sobrien#define LINENO struct external_lineno 12789857Sobrien#define LINESZ (4 + L_LNNO_SIZE) 12889857Sobrien 12989857Sobrien#if L_LNNO_SIZE == 4 13089857Sobrien#define GET_LINENO_LNNO(abfd, ext) H_GET_32 (abfd, (ext->l_lnno)) 13189857Sobrien#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_32 (abfd, val, (ext->l_lnno)) 13289857Sobrien#endif 13389857Sobrien#if L_LNNO_SIZE == 2 13489857Sobrien#define GET_LINENO_LNNO(abfd, ext) H_GET_16 (abfd, (ext->l_lnno)) 13589857Sobrien#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_16 (abfd, val, (ext->l_lnno)) 13689857Sobrien#endif 13789857Sobrien 13889857Sobrien#endif /* not DO_NOT_DEFINE_LINENO */ 13989857Sobrien 14089857Sobrien#ifndef DO_NOT_DEFINE_SYMENT 14189857Sobrien/********************** SYMBOLS **********************/ 14289857Sobrien 14389857Sobrien#define E_SYMNMLEN 8 /* # characters in a symbol name */ 14489857Sobrien#ifndef E_FILNMLEN 14589857Sobrien#define E_FILNMLEN 14 14689857Sobrien#endif 14789857Sobrien#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ 14889857Sobrien 14989857Sobrienstruct external_syment 15089857Sobrien{ 15189857Sobrien union 15289857Sobrien { 15389857Sobrien char e_name[E_SYMNMLEN]; 15489857Sobrien 15589857Sobrien struct 15689857Sobrien { 15789857Sobrien char e_zeroes[4]; 15889857Sobrien char e_offset[4]; 15989857Sobrien } e; 16089857Sobrien } e; 16189857Sobrien 16289857Sobrien char e_value[4]; 16389857Sobrien char e_scnum[2]; 16489857Sobrien char e_type[2]; 16589857Sobrien char e_sclass[1]; 16689857Sobrien char e_numaux[1]; 167218822Sdim} ATTRIBUTE_PACKED ; 16889857Sobrien 16989857Sobrien#define SYMENT struct external_syment 17089857Sobrien#define SYMESZ 18 17189857Sobrien 17289857Sobrien#ifndef N_BTMASK 17389857Sobrien#define N_BTMASK 0xf 17489857Sobrien#endif 17589857Sobrien 17689857Sobrien#ifndef N_TMASK 17789857Sobrien#define N_TMASK 0x30 17889857Sobrien#endif 17989857Sobrien 18089857Sobrien#ifndef N_BTSHFT 18189857Sobrien#define N_BTSHFT 4 18289857Sobrien#endif 18389857Sobrien 18489857Sobrien#ifndef N_TSHIFT 18589857Sobrien#define N_TSHIFT 2 18689857Sobrien#endif 18789857Sobrien 18889857Sobrien#endif /* not DO_NOT_DEFINE_SYMENT */ 18989857Sobrien 19089857Sobrien#ifndef DO_NOT_DEFINE_AUXENT 19189857Sobrien 19289857Sobrienunion external_auxent 19389857Sobrien{ 19489857Sobrien struct 19589857Sobrien { 19689857Sobrien char x_tagndx[4]; /* str, un, or enum tag indx */ 19789857Sobrien 19889857Sobrien union 19989857Sobrien { 20089857Sobrien struct 20189857Sobrien { 20289857Sobrien char x_lnno[2]; /* declaration line number */ 20389857Sobrien char x_size[2]; /* str/union/array size */ 20489857Sobrien } x_lnsz; 20589857Sobrien 20689857Sobrien char x_fsize[4]; /* size of function */ 20789857Sobrien 20889857Sobrien } x_misc; 20989857Sobrien 21089857Sobrien union 21189857Sobrien { 21289857Sobrien struct /* if ISFCN, tag, or .bb */ 21389857Sobrien { 21489857Sobrien char x_lnnoptr[4]; /* ptr to fcn line # */ 21589857Sobrien char x_endndx[4]; /* entry ndx past block end */ 21689857Sobrien } x_fcn; 21789857Sobrien 21889857Sobrien struct /* if ISARY, up to 4 dimen. */ 21989857Sobrien { 22089857Sobrien char x_dimen[E_DIMNUM][2]; 22189857Sobrien } x_ary; 22289857Sobrien 22389857Sobrien } x_fcnary; 22489857Sobrien 22589857Sobrien char x_tvndx[2]; /* tv index */ 22689857Sobrien 22789857Sobrien } x_sym; 22889857Sobrien 22989857Sobrien union 23089857Sobrien { 23189857Sobrien char x_fname[E_FILNMLEN]; 23289857Sobrien 23389857Sobrien struct 23489857Sobrien { 23589857Sobrien char x_zeroes[4]; 23689857Sobrien char x_offset[4]; 23789857Sobrien } x_n; 23889857Sobrien 23989857Sobrien } x_file; 24089857Sobrien 24189857Sobrien struct 24289857Sobrien { 24389857Sobrien char x_scnlen[4]; /* section length */ 24489857Sobrien char x_nreloc[2]; /* # relocation entries */ 24589857Sobrien char x_nlinno[2]; /* # line numbers */ 24689857Sobrien#ifdef INCLUDE_COMDAT_FIELDS_IN_AUXENT 24789857Sobrien char x_checksum[4]; /* section COMDAT checksum */ 24889857Sobrien char x_associated[2]; /* COMDAT associated section index */ 24989857Sobrien char x_comdat[1]; /* COMDAT selection number */ 25089857Sobrien#endif 25189857Sobrien } x_scn; 25289857Sobrien 25389857Sobrien struct 25489857Sobrien { 25589857Sobrien char x_tvfill[4]; /* tv fill value */ 25689857Sobrien char x_tvlen[2]; /* length of .tv */ 25789857Sobrien char x_tvran[2][2]; /* tv range */ 25889857Sobrien } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ 259218822Sdim} ATTRIBUTE_PACKED ; 26089857Sobrien 26189857Sobrien#define AUXENT union external_auxent 26289857Sobrien#define AUXESZ 18 26389857Sobrien 26489857Sobrien#define _ETEXT "etext" 26589857Sobrien 26689857Sobrien#endif /* not DO_NOT_DEFINE_AUXENT */ 26789857Sobrien 26889857Sobrien#endif /* COFF_EXTERNAL_H */ 269