| [10] | 1 | /* Internal format of COFF object file data structures, for GNU BFD.
|
|---|
| 2 | This file is part of BFD, the Binary File Descriptor library.
|
|---|
| 3 |
|
|---|
| 4 | Copyright 2001 Free Software Foundation, Inc.
|
|---|
| 5 |
|
|---|
| 6 | This program is free software; you can redistribute it and/or modify
|
|---|
| 7 | it under the terms of the GNU General Public License as published by
|
|---|
| 8 | the Free Software Foundation; either version 2 of the License, or
|
|---|
| 9 | (at your option) any later version.
|
|---|
| 10 |
|
|---|
| 11 | This program is distributed in the hope that it will be useful,
|
|---|
| 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|---|
| 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|---|
| 14 | GNU General Public License for more details.
|
|---|
| 15 |
|
|---|
| 16 | You should have received a copy of the GNU General Public License
|
|---|
| 17 | along with this program; if not, write to the Free Software
|
|---|
| 18 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|---|
| 19 |
|
|---|
| 20 | #ifndef GNU_COFF_INTERNAL_H
|
|---|
| 21 | #define GNU_COFF_INTERNAL_H 1
|
|---|
| 22 |
|
|---|
| 23 | /* First, make "signed char" work, even on old compilers. */
|
|---|
| 24 | #ifndef signed
|
|---|
| 25 | #ifndef __STDC__
|
|---|
| 26 | #define signed /**/
|
|---|
| 27 | #endif
|
|---|
| 28 | #endif
|
|---|
| 29 |
|
|---|
| 30 | /********************** FILE HEADER **********************/
|
|---|
| 31 |
|
|---|
| 32 | /* extra stuff in a PE header. */
|
|---|
| 33 |
|
|---|
| 34 | struct internal_extra_pe_filehdr
|
|---|
| 35 | {
|
|---|
| 36 | /* DOS header data follows for PE stuff */
|
|---|
| 37 | unsigned short e_magic; /* Magic number, 0x5a4d */
|
|---|
| 38 | unsigned short e_cblp; /* Bytes on last page of file, 0x90 */
|
|---|
| 39 | unsigned short e_cp; /* Pages in file, 0x3 */
|
|---|
| 40 | unsigned short e_crlc; /* Relocations, 0x0 */
|
|---|
| 41 | unsigned short e_cparhdr; /* Size of header in paragraphs, 0x4 */
|
|---|
| 42 | unsigned short e_minalloc; /* Minimum extra paragraphs needed, 0x0 */
|
|---|
| 43 | unsigned short e_maxalloc; /* Maximum extra paragraphs needed, 0xFFFF */
|
|---|
| 44 | unsigned short e_ss; /* Initial (relative) SS value, 0x0 */
|
|---|
| 45 | unsigned short e_sp; /* Initial SP value, 0xb8 */
|
|---|
| 46 | unsigned short e_csum; /* Checksum, 0x0 */
|
|---|
| 47 | unsigned short e_ip; /* Initial IP value, 0x0 */
|
|---|
| 48 | unsigned short e_cs; /* Initial (relative) CS value, 0x0 */
|
|---|
| 49 | unsigned short e_lfarlc; /* File address of relocation table, 0x40 */
|
|---|
| 50 | unsigned short e_ovno; /* Overlay number, 0x0 */
|
|---|
| 51 | unsigned short e_res[4]; /* Reserved words, all 0x0 */
|
|---|
| 52 | unsigned short e_oemid; /* OEM identifier (for e_oeminfo), 0x0 */
|
|---|
| 53 | unsigned short e_oeminfo; /* OEM information; e_oemid specific, 0x0 */
|
|---|
| 54 | unsigned short e_res2[10]; /* Reserved words, all 0x0 */
|
|---|
| 55 | bfd_vma e_lfanew; /* File address of new exe header, 0x80 */
|
|---|
| 56 | unsigned long dos_message[16]; /* text which always follows dos header */
|
|---|
| 57 | bfd_vma nt_signature; /* required NT signature, 0x4550 */
|
|---|
| 58 | };
|
|---|
| 59 |
|
|---|
| 60 | struct internal_filehdr
|
|---|
| 61 | {
|
|---|
| 62 | struct internal_extra_pe_filehdr pe;
|
|---|
| 63 |
|
|---|
| [609] | 64 | /* Standard coff internal info. */
|
|---|
| [10] | 65 | unsigned short f_magic; /* magic number */
|
|---|
| 66 | unsigned short f_nscns; /* number of sections */
|
|---|
| 67 | long f_timdat; /* time & date stamp */
|
|---|
| 68 | bfd_vma f_symptr; /* file pointer to symtab */
|
|---|
| 69 | long f_nsyms; /* number of symtab entries */
|
|---|
| 70 | unsigned short f_opthdr; /* sizeof(optional hdr) */
|
|---|
| 71 | unsigned short f_flags; /* flags */
|
|---|
| 72 | unsigned short f_target_id; /* (TI COFF specific) */
|
|---|
| 73 | };
|
|---|
| 74 |
|
|---|
| 75 |
|
|---|
| 76 | /* Bits for f_flags:
|
|---|
| [609] | 77 | F_RELFLG relocation info stripped from file
|
|---|
| 78 | F_EXEC file is executable (no unresolved external references)
|
|---|
| 79 | F_LNNO line numbers stripped from file
|
|---|
| 80 | F_LSYMS local symbols stripped from file
|
|---|
| 81 | F_AR16WR file is 16-bit little-endian
|
|---|
| 82 | F_AR32WR file is 32-bit little-endian
|
|---|
| 83 | F_AR32W file is 32-bit big-endian
|
|---|
| 84 | F_DYNLOAD rs/6000 aix: dynamically loadable w/imports & exports
|
|---|
| 85 | F_SHROBJ rs/6000 aix: file is a shared object
|
|---|
| 86 | F_DLL PE format DLL. */
|
|---|
| [10] | 87 |
|
|---|
| 88 | #define F_RELFLG (0x0001)
|
|---|
| 89 | #define F_EXEC (0x0002)
|
|---|
| 90 | #define F_LNNO (0x0004)
|
|---|
| 91 | #define F_LSYMS (0x0008)
|
|---|
| 92 | #define F_AR16WR (0x0080)
|
|---|
| 93 | #define F_AR32WR (0x0100)
|
|---|
| 94 | #define F_AR32W (0x0200)
|
|---|
| 95 | #define F_DYNLOAD (0x1000)
|
|---|
| 96 | #define F_SHROBJ (0x2000)
|
|---|
| 97 | #define F_DLL (0x2000)
|
|---|
| 98 |
|
|---|
| [609] | 99 | /* Extra structure which is used in the optional header. */
|
|---|
| [10] | 100 | typedef struct _IMAGE_DATA_DIRECTORY
|
|---|
| 101 | {
|
|---|
| 102 | bfd_vma VirtualAddress;
|
|---|
| 103 | long Size;
|
|---|
| 104 | } IMAGE_DATA_DIRECTORY;
|
|---|
| 105 | #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
|
|---|
| 106 |
|
|---|
| 107 | /* Default image base for NT. */
|
|---|
| 108 | #define NT_EXE_IMAGE_BASE 0x400000
|
|---|
| 109 | #define NT_DLL_IMAGE_BASE 0x10000000
|
|---|
| 110 |
|
|---|
| 111 | /* Default image base for BeOS. */
|
|---|
| 112 | #define BEOS_EXE_IMAGE_BASE 0x80000000
|
|---|
| 113 | #define BEOS_DLL_IMAGE_BASE 0x10000000
|
|---|
| 114 |
|
|---|
| 115 | /* Extra stuff in a PE aouthdr */
|
|---|
| 116 |
|
|---|
| 117 | #define PE_DEF_SECTION_ALIGNMENT 0x1000
|
|---|
| 118 | #ifndef PE_DEF_FILE_ALIGNMENT
|
|---|
| 119 | # define PE_DEF_FILE_ALIGNMENT 0x200
|
|---|
| 120 | #endif
|
|---|
| 121 |
|
|---|
| 122 | struct internal_extra_pe_aouthdr
|
|---|
| 123 | {
|
|---|
| 124 | /* PE stuff */
|
|---|
| 125 | bfd_vma ImageBase; /* address of specific location in memory that
|
|---|
| 126 | file is located, NT default 0x10000 */
|
|---|
| 127 |
|
|---|
| 128 | bfd_vma SectionAlignment; /* section alignment default 0x1000 */
|
|---|
| 129 | bfd_vma FileAlignment; /* file alignment default 0x200 */
|
|---|
| 130 | short MajorOperatingSystemVersion; /* minimum version of the operating */
|
|---|
| 131 | short MinorOperatingSystemVersion; /* system req'd for exe, default to 1*/
|
|---|
| 132 | short MajorImageVersion; /* user defineable field to store version of */
|
|---|
| 133 | short MinorImageVersion; /* exe or dll being created, default to 0 */
|
|---|
| 134 | short MajorSubsystemVersion; /* minimum subsystem version required to */
|
|---|
| 135 | short MinorSubsystemVersion; /* run exe; default to 3.1 */
|
|---|
| 136 | long Reserved1; /* seems to be 0 */
|
|---|
| 137 | long SizeOfImage; /* size of memory to allocate for prog */
|
|---|
| 138 | long SizeOfHeaders; /* size of PE header and section table */
|
|---|
| 139 | long CheckSum; /* set to 0 */
|
|---|
| 140 | short Subsystem;
|
|---|
| 141 |
|
|---|
| 142 | /* type of subsystem exe uses for user interface,
|
|---|
| 143 | possible values:
|
|---|
| 144 | 1 - NATIVE Doesn't require a subsystem
|
|---|
| 145 | 2 - WINDOWS_GUI runs in Windows GUI subsystem
|
|---|
| 146 | 3 - WINDOWS_CUI runs in Windows char sub. (console app)
|
|---|
| 147 | 5 - OS2_CUI runs in OS/2 character subsystem
|
|---|
| 148 | 7 - POSIX_CUI runs in Posix character subsystem */
|
|---|
| 149 | short DllCharacteristics; /* flags for DLL init, use 0 */
|
|---|
| 150 | bfd_vma SizeOfStackReserve; /* amount of memory to reserve */
|
|---|
| 151 | bfd_vma SizeOfStackCommit; /* amount of memory initially committed for
|
|---|
| 152 | initial thread's stack, default is 0x1000 */
|
|---|
| 153 | bfd_vma SizeOfHeapReserve; /* amount of virtual memory to reserve and */
|
|---|
| 154 | bfd_vma SizeOfHeapCommit; /* commit, don't know what to defaut it to */
|
|---|
| 155 | long LoaderFlags; /* can probably set to 0 */
|
|---|
| 156 | long NumberOfRvaAndSizes; /* number of entries in next entry, 16 */
|
|---|
| 157 | IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
|
|---|
| 158 | };
|
|---|
| 159 |
|
|---|
| 160 | /********************** AOUT "OPTIONAL HEADER" **********************/
|
|---|
| 161 | struct internal_aouthdr
|
|---|
| 162 | {
|
|---|
| 163 | short magic; /* type of file */
|
|---|
| 164 | short vstamp; /* version stamp */
|
|---|
| 165 | bfd_vma tsize; /* text size in bytes, padded to FW bdry*/
|
|---|
| 166 | bfd_vma dsize; /* initialized data " " */
|
|---|
| 167 | bfd_vma bsize; /* uninitialized data " " */
|
|---|
| 168 | bfd_vma entry; /* entry pt. */
|
|---|
| 169 | bfd_vma text_start; /* base of text used for this file */
|
|---|
| 170 | bfd_vma data_start; /* base of data used for this file */
|
|---|
| 171 |
|
|---|
| 172 | /* i960 stuff */
|
|---|
| 173 | unsigned long tagentries; /* number of tag entries to follow */
|
|---|
| 174 |
|
|---|
| 175 | /* RS/6000 stuff */
|
|---|
| [609] | 176 | bfd_vma o_toc; /* address of TOC */
|
|---|
| [10] | 177 | short o_snentry; /* section number for entry point */
|
|---|
| 178 | short o_sntext; /* section number for text */
|
|---|
| 179 | short o_sndata; /* section number for data */
|
|---|
| 180 | short o_sntoc; /* section number for toc */
|
|---|
| 181 | short o_snloader; /* section number for loader section */
|
|---|
| 182 | short o_snbss; /* section number for bss */
|
|---|
| 183 | short o_algntext; /* max alignment for text */
|
|---|
| 184 | short o_algndata; /* max alignment for data */
|
|---|
| 185 | short o_modtype; /* Module type field, 1R,RE,RO */
|
|---|
| 186 | short o_cputype; /* Encoded CPU type */
|
|---|
| [609] | 187 | bfd_vma o_maxstack; /* max stack size allowed. */
|
|---|
| 188 | bfd_vma o_maxdata; /* max data size allowed. */
|
|---|
| [10] | 189 |
|
|---|
| 190 | /* ECOFF stuff */
|
|---|
| 191 | bfd_vma bss_start; /* Base of bss section. */
|
|---|
| 192 | bfd_vma gp_value; /* GP register value. */
|
|---|
| 193 | unsigned long gprmask; /* General registers used. */
|
|---|
| 194 | unsigned long cprmask[4]; /* Coprocessor registers used. */
|
|---|
| 195 | unsigned long fprmask; /* Floating pointer registers used. */
|
|---|
| 196 |
|
|---|
| 197 | /* Apollo stuff */
|
|---|
| 198 | long o_inlib; /* inlib data */
|
|---|
| 199 | long o_sri; /* Static Resource Information */
|
|---|
| 200 | long vid[2]; /* Version id */
|
|---|
| 201 |
|
|---|
| 202 | struct internal_extra_pe_aouthdr pe;
|
|---|
| 203 | };
|
|---|
| 204 |
|
|---|
| 205 | /********************** STORAGE CLASSES **********************/
|
|---|
| 206 |
|
|---|
| 207 | /* This used to be defined as -1, but now n_sclass is unsigned. */
|
|---|
| 208 | #define C_EFCN 0xff /* physical end of function */
|
|---|
| 209 | #define C_NULL 0
|
|---|
| 210 | #define C_AUTO 1 /* automatic variable */
|
|---|
| 211 | #define C_EXT 2 /* external symbol */
|
|---|
| 212 | #define C_STAT 3 /* static */
|
|---|
| 213 | #define C_REG 4 /* register variable */
|
|---|
| 214 | #define C_EXTDEF 5 /* external definition */
|
|---|
| 215 | #define C_LABEL 6 /* label */
|
|---|
| 216 | #define C_ULABEL 7 /* undefined label */
|
|---|
| 217 | #define C_MOS 8 /* member of structure */
|
|---|
| 218 | #define C_ARG 9 /* function argument */
|
|---|
| 219 | #define C_STRTAG 10 /* structure tag */
|
|---|
| 220 | #define C_MOU 11 /* member of union */
|
|---|
| 221 | #define C_UNTAG 12 /* union tag */
|
|---|
| 222 | #define C_TPDEF 13 /* type definition */
|
|---|
| 223 | #define C_USTATIC 14 /* undefined static */
|
|---|
| 224 | #define C_ENTAG 15 /* enumeration tag */
|
|---|
| 225 | #define C_MOE 16 /* member of enumeration */
|
|---|
| 226 | #define C_REGPARM 17 /* register parameter */
|
|---|
| 227 | #define C_FIELD 18 /* bit field */
|
|---|
| 228 | #define C_AUTOARG 19 /* auto argument */
|
|---|
| 229 | #define C_LASTENT 20 /* dummy entry (end of block) */
|
|---|
| 230 | #define C_BLOCK 100 /* ".bb" or ".eb" */
|
|---|
| 231 | #define C_FCN 101 /* ".bf" or ".ef" */
|
|---|
| 232 | #define C_EOS 102 /* end of structure */
|
|---|
| 233 | #define C_FILE 103 /* file name */
|
|---|
| 234 | #define C_LINE 104 /* line # reformatted as symbol table entry */
|
|---|
| 235 | #define C_ALIAS 105 /* duplicate tag */
|
|---|
| 236 | #define C_HIDDEN 106 /* ext symbol in dmert public lib */
|
|---|
| 237 |
|
|---|
| 238 | #define C_WEAKEXT 127 /* weak symbol -- GNU extension */
|
|---|
| 239 |
|
|---|
| 240 | /* New storage classes for TI COFF */
|
|---|
| 241 | #define C_UEXT 19 /* Tentative external definition */
|
|---|
| 242 | #define C_STATLAB 20 /* Static load time label */
|
|---|
| 243 | #define C_EXTLAB 21 /* External load time label */
|
|---|
| 244 | #define C_SYSTEM 23 /* System Wide variable */
|
|---|
| 245 |
|
|---|
| 246 | /* New storage classes for WINDOWS_NT */
|
|---|
| 247 | #define C_SECTION 104 /* section name */
|
|---|
| 248 | #define C_NT_WEAK 105 /* weak external */
|
|---|
| 249 |
|
|---|
| 250 | /* New storage classes for 80960 */
|
|---|
| 251 |
|
|---|
| 252 | /* C_LEAFPROC is obsolete. Use C_LEAFEXT or C_LEAFSTAT */
|
|---|
| 253 | #define C_LEAFPROC 108 /* Leaf procedure, "call" via BAL */
|
|---|
| 254 |
|
|---|
| 255 | #define C_SCALL 107 /* Procedure reachable via system call */
|
|---|
| 256 | #define C_LEAFEXT 108 /* External leaf */
|
|---|
| 257 | #define C_LEAFSTAT 113 /* Static leaf */
|
|---|
| 258 | #define C_OPTVAR 109 /* Optimized variable */
|
|---|
| 259 | #define C_DEFINE 110 /* Preprocessor #define */
|
|---|
| 260 | #define C_PRAGMA 111 /* Advice to compiler or linker */
|
|---|
| 261 | #define C_SEGMENT 112 /* 80960 segment name */
|
|---|
| 262 |
|
|---|
| 263 | /* Storage classes for m88k */
|
|---|
| 264 | #define C_SHADOW 107 /* shadow symbol */
|
|---|
| 265 | #define C_VERSION 108 /* coff version symbol */
|
|---|
| 266 |
|
|---|
| 267 | /* New storage classes for RS/6000 */
|
|---|
| 268 | #define C_HIDEXT 107 /* Un-named external symbol */
|
|---|
| 269 | #define C_BINCL 108 /* Marks beginning of include file */
|
|---|
| 270 | #define C_EINCL 109 /* Marks ending of include file */
|
|---|
| 271 |
|
|---|
| 272 | /* storage classes for stab symbols for RS/6000 */
|
|---|
| 273 | #define C_GSYM (0x80)
|
|---|
| 274 | #define C_LSYM (0x81)
|
|---|
| 275 | #define C_PSYM (0x82)
|
|---|
| 276 | #define C_RSYM (0x83)
|
|---|
| 277 | #define C_RPSYM (0x84)
|
|---|
| 278 | #define C_STSYM (0x85)
|
|---|
| 279 | #define C_TCSYM (0x86)
|
|---|
| 280 | #define C_BCOMM (0x87)
|
|---|
| 281 | #define C_ECOML (0x88)
|
|---|
| 282 | #define C_ECOMM (0x89)
|
|---|
| 283 | #define C_DECL (0x8c)
|
|---|
| 284 | #define C_ENTRY (0x8d)
|
|---|
| 285 | #define C_FUN (0x8e)
|
|---|
| 286 | #define C_BSTAT (0x8f)
|
|---|
| 287 | #define C_ESTAT (0x90)
|
|---|
| 288 |
|
|---|
| 289 | /* Storage classes for Thumb symbols */
|
|---|
| 290 | #define C_THUMBEXT (128 + C_EXT) /* 130 */
|
|---|
| 291 | #define C_THUMBSTAT (128 + C_STAT) /* 131 */
|
|---|
| 292 | #define C_THUMBLABEL (128 + C_LABEL) /* 134 */
|
|---|
| 293 | #define C_THUMBEXTFUNC (C_THUMBEXT + 20) /* 150 */
|
|---|
| 294 | #define C_THUMBSTATFUNC (C_THUMBSTAT + 20) /* 151 */
|
|---|
| 295 |
|
|---|
| 296 | /********************** SECTION HEADER **********************/
|
|---|
| 297 |
|
|---|
| 298 | #define SCNNMLEN (8)
|
|---|
| 299 |
|
|---|
| 300 | struct internal_scnhdr
|
|---|
| 301 | {
|
|---|
| 302 | char s_name[SCNNMLEN]; /* section name */
|
|---|
| 303 |
|
|---|
| 304 | /* Physical address, aliased s_nlib.
|
|---|
| 305 | In the pei format, this field is the virtual section size
|
|---|
| 306 | (the size of the section after being loaded int memory),
|
|---|
| 307 | NOT the physical address. */
|
|---|
| 308 | bfd_vma s_paddr;
|
|---|
| 309 |
|
|---|
| 310 | bfd_vma s_vaddr; /* virtual address */
|
|---|
| 311 | bfd_vma s_size; /* section size */
|
|---|
| 312 | bfd_vma s_scnptr; /* file ptr to raw data for section */
|
|---|
| 313 | bfd_vma s_relptr; /* file ptr to relocation */
|
|---|
| 314 | bfd_vma s_lnnoptr; /* file ptr to line numbers */
|
|---|
| |
|---|