[BACK]Return to internal.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / external / gpl3 / binutils / dist / include / coff

Annotation of src/external/gpl3/binutils/dist/include/coff/internal.h, Revision 1.1.1.1

1.1       skrll       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 1999, 2000, 2001, 2002, 2003, 2004. 2005, 2006, 2007
                      5:    Free Software Foundation, Inc.
                      6:
                      7:    This program is free software; you can redistribute it and/or modify
                      8:    it under the terms of the GNU General Public License as published by
                      9:    the Free Software Foundation; either version 2 of the License, or
                     10:    (at your option) any later version.
                     11:
                     12:    This program is distributed in the hope that it will be useful,
                     13:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15:    GNU General Public License for more details.
                     16:
                     17:    You should have received a copy of the GNU General Public License
                     18:    along with this program; if not, write to the Free Software
                     19:    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
                     20:
                     21: #ifndef GNU_COFF_INTERNAL_H
                     22: #define GNU_COFF_INTERNAL_H 1
                     23:
                     24: /* First, make "signed char" work, even on old compilers. */
                     25: #ifndef signed
                     26: #ifndef __STDC__
                     27: #define        signed                  /**/
                     28: #endif
                     29: #endif
                     30:
                     31: /********************** FILE HEADER **********************/
                     32:
                     33: /* extra stuff in a PE header. */
                     34:
                     35: struct internal_extra_pe_filehdr
                     36: {
                     37:   /* DOS header data follows for PE stuff */
                     38:   unsigned short e_magic;      /* Magic number, 0x5a4d */
                     39:   unsigned short e_cblp;       /* Bytes on last page of file, 0x90 */
                     40:   unsigned short e_cp;         /* Pages in file, 0x3 */
                     41:   unsigned short e_crlc;       /* Relocations, 0x0 */
                     42:   unsigned short e_cparhdr;    /* Size of header in paragraphs, 0x4 */
                     43:   unsigned short e_minalloc;   /* Minimum extra paragraphs needed, 0x0 */
                     44:   unsigned short e_maxalloc;   /* Maximum extra paragraphs needed, 0xFFFF */
                     45:   unsigned short e_ss;         /* Initial (relative) SS value, 0x0 */
                     46:   unsigned short e_sp;         /* Initial SP value, 0xb8 */
                     47:   unsigned short e_csum;       /* Checksum, 0x0 */
                     48:   unsigned short e_ip;         /* Initial IP value, 0x0 */
                     49:   unsigned short e_cs;         /* Initial (relative) CS value, 0x0 */
                     50:   unsigned short e_lfarlc;     /* File address of relocation table, 0x40 */
                     51:   unsigned short e_ovno;       /* Overlay number, 0x0 */
                     52:   unsigned short e_res[4];     /* Reserved words, all 0x0 */
                     53:   unsigned short e_oemid;      /* OEM identifier (for e_oeminfo), 0x0 */
                     54:   unsigned short e_oeminfo;    /* OEM information; e_oemid specific, 0x0 */
                     55:   unsigned short e_res2[10];   /* Reserved words, all 0x0 */
                     56:   bfd_vma  e_lfanew;           /* File address of new exe header, 0x80 */
                     57:   unsigned long dos_message[16]; /* text which always follows dos header */
                     58:   bfd_vma  nt_signature;       /* required NT signature, 0x4550 */
                     59: };
                     60:
                     61: struct internal_filehdr
                     62: {
                     63:   struct internal_extra_pe_filehdr pe;
                     64:
                     65:   /* Standard coff internal info.  */
                     66:   unsigned short f_magic;      /* magic number                 */
                     67:   unsigned short f_nscns;      /* number of sections           */
                     68:   long f_timdat;               /* time & date stamp            */
                     69:   bfd_vma f_symptr;            /* file pointer to symtab       */
                     70:   long f_nsyms;                        /* number of symtab entries     */
                     71:   unsigned short f_opthdr;     /* sizeof(optional hdr)         */
                     72:   unsigned short f_flags;      /* flags                        */
                     73:   unsigned short f_target_id;  /* (TI COFF specific)           */
                     74: };
                     75:
                     76:
                     77: /* Bits for f_flags:
                     78:        F_RELFLG        relocation info stripped from file
                     79:        F_EXEC          file is executable (no unresolved external references)
                     80:        F_LNNO          line numbers stripped from file
                     81:        F_LSYMS         local symbols stripped from file
                     82:        F_AR16WR        file is 16-bit little-endian
                     83:        F_AR32WR        file is 32-bit little-endian
                     84:        F_AR32W         file is 32-bit big-endian
                     85:        F_DYNLOAD       rs/6000 aix: dynamically loadable w/imports & exports
                     86:        F_SHROBJ        rs/6000 aix: file is a shared object
                     87:         F_DLL           PE format DLL.  */
                     88:
                     89: #define        F_RELFLG        (0x0001)
                     90: #define        F_EXEC          (0x0002)
                     91: #define        F_LNNO          (0x0004)
                     92: #define        F_LSYMS         (0x0008)
                     93: #define        F_AR16WR        (0x0080)
                     94: #define        F_AR32WR        (0x0100)
                     95: #define        F_AR32W         (0x0200)
                     96: #define        F_DYNLOAD       (0x1000)
                     97: #define        F_SHROBJ        (0x2000)
                     98: #define F_DLL           (0x2000)
                     99:
                    100: /* Extra structure which is used in the optional header.  */
                    101: typedef struct _IMAGE_DATA_DIRECTORY
                    102: {
                    103:   bfd_vma VirtualAddress;
                    104:   long    Size;
                    105: }  IMAGE_DATA_DIRECTORY;
                    106: #define PE_EXPORT_TABLE                        0
                    107: #define PE_IMPORT_TABLE                        1
                    108: #define PE_RESOURCE_TABLE              2
                    109: #define PE_EXCEPTION_TABLE             3
                    110: #define PE_CERTIFICATE_TABLE           4
                    111: #define PE_BASE_RELOCATION_TABLE       5
                    112: #define PE_DEBUG_DATA                  6
                    113: #define PE_ARCHITECTURE                        7
                    114: #define PE_GLOBAL_PTR                  8
                    115: #define PE_TLS_TABLE                   9
                    116: #define PE_LOAD_CONFIG_TABLE           10
                    117: #define PE_BOUND_IMPORT_TABLE          11
                    118: #define PE_IMPORT_ADDRESS_TABLE                12
                    119: #define PE_DELAY_IMPORT_DESCRIPTOR     13
                    120: #define PE_CLR_RUNTIME_HEADER          14
                    121: /* DataDirectory[15] is currently reserved, so no define. */
                    122: #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES  16
                    123:
                    124: /* Default image base for NT.  */
                    125: #define NT_EXE_IMAGE_BASE 0x400000
                    126: #define NT_DLL_IMAGE_BASE 0x10000000
                    127:
                    128: /* Default image base for BeOS. */
                    129: #define BEOS_EXE_IMAGE_BASE 0x80000000
                    130: #define BEOS_DLL_IMAGE_BASE 0x10000000
                    131:
                    132: /* Extra stuff in a PE aouthdr */
                    133:
                    134: #define PE_DEF_SECTION_ALIGNMENT 0x1000
                    135: #ifndef PE_DEF_FILE_ALIGNMENT
                    136: # define PE_DEF_FILE_ALIGNMENT 0x200
                    137: #endif
                    138:
                    139: struct internal_extra_pe_aouthdr
                    140: {
                    141:   /* FIXME: The following entries are in AOUTHDR.  But they aren't
                    142:      available internally in bfd.  We add them here so that objdump
                    143:      can dump them.  */
                    144:   /* The state of the image file  */
                    145:   short Magic;
                    146:   /* Linker major version number */
                    147:   char MajorLinkerVersion;
                    148:   /* Linker minor version number  */
                    149:   char MinorLinkerVersion;
                    150:   /* Total size of all code sections  */
                    151:   long SizeOfCode;
                    152:   /* Total size of all initialized data sections  */
                    153:   long SizeOfInitializedData;
                    154:   /* Total size of all uninitialized data sections  */
                    155:   long SizeOfUninitializedData;
                    156:   /* Address of entry point relative to image base.  */
                    157:   bfd_vma AddressOfEntryPoint;
                    158:   /* Address of the first code section relative to image base.  */
                    159:   bfd_vma BaseOfCode;
                    160:   /* Address of the first data section relative to image base.  */
                    161:   bfd_vma BaseOfData;
                    162:
                    163:   /* PE stuff  */
                    164:   bfd_vma ImageBase;           /* address of specific location in memory that
                    165:                                   file is located, NT default 0x10000 */
                    166:
                    167:   bfd_vma SectionAlignment;    /* section alignment default 0x1000 */
                    168:   bfd_vma FileAlignment;       /* file alignment default 0x200 */
                    169:   short   MajorOperatingSystemVersion; /* minimum version of the operating */
                    170:   short   MinorOperatingSystemVersion; /* system req'd for exe, default to 1*/
                    171:   short   MajorImageVersion;   /* user defineable field to store version of */
                    172:   short   MinorImageVersion;   /* exe or dll being created, default to 0 */
                    173:   short   MajorSubsystemVersion; /* minimum subsystem version required to */
                    174:   short   MinorSubsystemVersion; /* run exe; default to 3.1 */
                    175:   long    Reserved1;           /* seems to be 0 */
                    176:   long    SizeOfImage;         /* size of memory to allocate for prog */
                    177:   long    SizeOfHeaders;       /* size of PE header and section table */
                    178:   long    CheckSum;            /* set to 0 */
                    179:   short   Subsystem;
                    180:
                    181:   /* type of subsystem exe uses for user interface,
                    182:      possible values:
                    183:      1 - NATIVE   Doesn't require a subsystem
                    184:      2 - WINDOWS_GUI runs in Windows GUI subsystem
                    185:      3 - WINDOWS_CUI runs in Windows char sub. (console app)
                    186:      5 - OS2_CUI runs in OS/2 character subsystem
                    187:      7 - POSIX_CUI runs in Posix character subsystem */
                    188:   short   DllCharacteristics;  /* flags for DLL init, use 0 */
                    189:   bfd_vma SizeOfStackReserve;  /* amount of memory to reserve  */
                    190:   bfd_vma SizeOfStackCommit;   /* amount of memory initially committed for
                    191:                                   initial thread's stack, default is 0x1000 */
                    192:   bfd_vma SizeOfHeapReserve;   /* amount of virtual memory to reserve and */
                    193:   bfd_vma SizeOfHeapCommit;    /* commit, don't know what to defaut it to */
                    194:   long    LoaderFlags;         /* can probably set to 0 */
                    195:   long    NumberOfRvaAndSizes; /* number of entries in next entry, 16 */
                    196:   IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
                    197: };
                    198:
                    199: /********************** AOUT "OPTIONAL HEADER" **********************/
                    200: struct internal_aouthdr
                    201: {
                    202:   short magic;                 /* type of file                         */
                    203:   short vstamp;                        /* version stamp                        */
                    204:   bfd_vma tsize;               /* text size in bytes, padded to FW bdry*/
                    205:   bfd_vma dsize;               /* initialized data "  "                */
                    206:   bfd_vma bsize;               /* uninitialized data "   "             */
                    207:   bfd_vma entry;               /* entry pt.                            */
                    208:   bfd_vma text_start;          /* base of text used for this file */
                    209:   bfd_vma data_start;          /* base of data used for this file */
                    210:
                    211:   /* i960 stuff */
                    212:   unsigned long tagentries;    /* number of tag entries to follow */
                    213:
                    214:   /* RS/6000 stuff */
                    215:   bfd_vma o_toc;               /* address of TOC                       */
                    216:   short o_snentry;             /* section number for entry point */
                    217:   short o_sntext;              /* section number for text      */
                    218:   short o_sndata;              /* section number for data      */
                    219:   short o_sntoc;               /* section number for toc       */
                    220:   short o_snloader;            /* section number for loader section */
                    221:   short o_snbss;               /* section number for bss       */
                    222:   short o_algntext;            /* max alignment for text       */
                    223:   short o_algndata;            /* max alignment for data       */
                    224:   short o_modtype;             /* Module type field, 1R,RE,RO  */
                    225:   short o_cputype;             /* Encoded CPU type             */
                    226:   bfd_vma o_maxstack;  /* max stack size allowed.      */
                    227:   bfd_vma o_maxdata;   /* max data size allowed.       */
                    228:
                    229:   /* ECOFF stuff */
                    230:   bfd_vma bss_start;           /* Base of bss section.         */
                    231:   bfd_vma gp_value;            /* GP register value.           */
                    232:   unsigned long gprmask;       /* General registers used.      */
                    233:   unsigned long cprmask[4];    /* Coprocessor registers used.  */
                    234:   unsigned long fprmask;       /* Floating pointer registers used.  */
                    235:
                    236:   /* Apollo stuff */
                    237:   long o_inlib;                        /* inlib data */
                    238:   long o_sri;                  /* Static Resource Information */
                    239:   long vid[2];                 /* Version id */
                    240:
                    241:   struct internal_extra_pe_aouthdr pe;
                    242: };
                    243:
                    244: /********************** STORAGE CLASSES **********************/
                    245:
                    246: /* This used to be defined as -1, but now n_sclass is unsigned.  */
                    247: #define C_EFCN         0xff    /* physical end of function     */
                    248: #define C_NULL         0
                    249: #define C_AUTO         1       /* automatic variable           */
                    250: #define C_EXT          2       /* external symbol              */
                    251: #define C_STAT         3       /* static                       */
                    252: #define C_REG          4       /* register variable            */
                    253: #define C_EXTDEF       5       /* external definition          */
                    254: #define C_LABEL                6       /* label                        */
                    255: #define C_ULABEL       7       /* undefined label              */
                    256: #define C_MOS          8       /* member of structure          */
                    257: #define C_ARG          9       /* function argument            */
                    258: #define C_STRTAG       10      /* structure tag                */
                    259: #define C_MOU          11      /* member of union              */
                    260: #define C_UNTAG                12      /* union tag                    */
                    261: #define C_TPDEF                13      /* type definition              */
                    262: #define C_USTATIC      14      /* undefined static             */
                    263: #define C_ENTAG                15      /* enumeration tag              */
                    264: #define C_MOE          16      /* member of enumeration        */
                    265: #define C_REGPARM      17      /* register parameter           */
                    266: #define C_FIELD                18      /* bit field                    */
                    267: #define C_AUTOARG      19      /* auto argument                */
                    268: #define C_LASTENT      20      /* dummy entry (end of block)   */
                    269: #define C_BLOCK                100     /* ".bb" or ".eb"               */
                    270: #define C_FCN          101     /* ".bf" or ".ef"               */
                    271: #define C_EOS          102     /* end of structure             */
                    272: #define C_FILE         103     /* file name                    */
                    273: #define C_LINE         104     /* line # reformatted as symbol table entry */
                    274: #define C_ALIAS                105     /* duplicate tag                */
                    275: #define C_HIDDEN       106     /* ext symbol in dmert public lib */
                    276:
                    277: #if defined _AIX52 || defined AIX_WEAK_SUPPORT
                    278: #define C_WEAKEXT      111     /* weak symbol -- AIX standard.  */
                    279: #else
                    280: #define C_WEAKEXT      127     /* weak symbol -- GNU extension.  */
                    281: #endif
                    282:
                    283: /* New storage classes for TI COFF */
                    284: #define C_UEXT         19      /* Tentative external definition */
                    285: #define C_STATLAB      20      /* Static load time label */
                    286: #define C_EXTLAB       21      /* External load time label */
                    287: #define C_SYSTEM       23      /* System Wide variable */
                    288:
                    289: /* New storage classes for WINDOWS_NT   */
                    290: #define C_SECTION       104     /* section name */
                    291: #define C_NT_WEAK      105     /* weak external */
                    292:
                    293:  /* New storage classes for 80960 */
                    294:
                    295: /* C_LEAFPROC is obsolete.  Use C_LEAFEXT or C_LEAFSTAT */
                    296: #define C_LEAFPROC     108     /* Leaf procedure, "call" via BAL */
                    297:
                    298: #define C_SCALL                107     /* Procedure reachable via system call */
                    299: #define C_LEAFEXT       108    /* External leaf */
                    300: #define C_LEAFSTAT      113    /* Static leaf */
                    301: #define C_OPTVAR       109     /* Optimized variable           */
                    302: #define C_DEFINE       110     /* Preprocessor #define         */
                    303: #define C_PRAGMA       111     /* Advice to compiler or linker */
                    304: #define C_SEGMENT      112     /* 80960 segment name           */
                    305:
                    306:   /* Storage classes for m88k */
                    307: #define C_SHADOW        107     /* shadow symbol                */
                    308: #define C_VERSION       108     /* coff version symbol          */
                    309:
                    310:  /* New storage classes for RS/6000 */
                    311: #define C_HIDEXT        107    /* Un-named external symbol */
                    312: #define C_BINCL         108    /* Marks beginning of include file */
                    313: #define C_EINCL         109    /* Marks ending of include file */
                    314:
                    315:  /* storage classes for stab symbols for RS/6000 */
                    316: #define C_GSYM          (0x80)
                    317: #define C_LSYM          (0x81)
                    318: #define C_PSYM          (0x82)
                    319: #define C_RSYM          (0x83)
                    320: #define C_RPSYM         (0x84)
                    321: #define C_STSYM         (0x85)
                    322: #define C_TCSYM         (0x86)
                    323: #define C_BCOMM         (0x87)
                    324: #define C_ECOML         (0x88)
                    325: #define C_ECOMM         (0x89)
                    326: #define C_DECL          (0x8c)
                    327: #define C_ENTRY         (0x8d)
                    328: #define C_FUN           (0x8e)
                    329: #define C_BSTAT         (0x8f)
                    330: #define C_ESTAT         (0x90)
                    331:
                    332: /* Storage classes for Thumb symbols */
                    333: #define C_THUMBEXT      (128 + C_EXT)          /* 130 */
                    334: #define C_THUMBSTAT     (128 + C_STAT)         /* 131 */
                    335: #define C_THUMBLABEL    (128 + C_LABEL)                /* 134 */
                    336: #define C_THUMBEXTFUNC  (C_THUMBEXT  + 20)     /* 150 */
                    337: #define C_THUMBSTATFUNC (C_THUMBSTAT + 20)     /* 151 */
                    338:
                    339: /********************** SECTION HEADER **********************/
                    340:
                    341: #define SCNNMLEN (8)
                    342:
                    343: struct internal_scnhdr
                    344: {
                    345:   char s_name[SCNNMLEN];       /* section name                 */
                    346:
                    347:   /* Physical address, aliased s_nlib.
                    348:      In the pei format, this field is the virtual section size
                    349:      (the size of the section after being loaded int memory),
                    350:      NOT the physical address.  */
                    351:   bfd_vma s_paddr;
                    352:
                    353:   bfd_vma s_vaddr;             /* virtual address              */
                    354:   bfd_vma s_size;              /* section size                 */
                    355:   bfd_vma s_scnptr;            /* file ptr to raw data for section */
                    356:   bfd_vma s_relptr;            /* file ptr to relocation       */
                    357:   bfd_vma s_lnnoptr;           /* file ptr to line numbers     */
                    358:   unsigned long s_nreloc;      /* number of relocation entries */
                    359:   unsigned long s_nlnno;       /* number of line number entries*/
                    360:   long s_flags;                        /* flags                        */
                    361:   long s_align;                        /* used on I960                 */
                    362:   unsigned char s_page;         /* TI COFF load page            */
                    363: };
                    364:
                    365: /* s_flags "type".  */
                    366: #define STYP_REG        (0x0000)       /* "regular": allocated, relocated, loaded */
                    367: #define STYP_DSECT      (0x0001)       /* "dummy":  relocated only*/
                    368: #define STYP_NOLOAD     (0x0002)       /* "noload": allocated, relocated, not loaded */
                    369: #define STYP_GROUP      (0x0004)       /* "grouped": formed of input sections */
                    370: #define STYP_PAD        (0x0008)       /* "padding": not allocated, not relocated, loaded */
                    371: #define STYP_COPY       (0x0010)       /* "copy": for decision function used by field update;  not allocated, not relocated,
                    372:                                                                             loaded; reloc & lineno entries processed normally */
                    373: #define STYP_TEXT       (0x0020)       /* section contains text only */
                    374: #define S_SHRSEG        (0x0020)       /* In 3b Update files (output of ogen), sections which appear in SHARED segments of the Pfile
                    375:                                                                             will have the S_SHRSEG flag set by ogen, to inform dufr that updating 1 copy of the proc. will
                    376:                                                                             update all process invocations. */
                    377: #define STYP_DATA       (0x0040)       /* section contains data only */
                    378: #define STYP_BSS        (0x0080)       /* section contains bss only */
                    379: #define S_NEWFCN        (0x0100)       /* In a minimal file or an update file, a new function (as compared with a replaced function) */
                    380: #define STYP_INFO       (0x0200)       /* comment: not allocated not relocated, not loaded */
                    381: #define STYP_OVER       (0x0400)       /* overlay: relocated not allocated or loaded */
                    382: #define STYP_LIB        (0x0800)       /* for .lib: same as INFO */
                    383: #define STYP_MERGE      (0x2000)       /* merge section -- combines with text, data or bss sections only */
                    384: #define STYP_REVERSE_PAD (0x4000)      /* section will be padded with no-op instructions
                    385:                                           wherever padding is necessary and there is a
                    386:                                           word of contiguous bytes beginning on a word
                    387:                                           boundary. */
                    388:
                    389: #define STYP_LIT       0x8020  /* Literal data (like STYP_TEXT) */
                    390:
                    391:
                    392: /********************** LINE NUMBERS **********************/
                    393:
                    394: /* 1 line number entry for every "breakpointable" source line in a section.
                    395:    Line numbers are grouped on a per function basis; first entry in a function
                    396:    grouping will have l_lnno = 0 and in place of physical address will be the
                    397:    symbol table index of the function name.  */
                    398:
                    399: struct internal_lineno
                    400: {
                    401:   union
                    402:   {
                    403:     bfd_signed_vma l_symndx;           /* function name symbol index, iff l_lnno == 0*/
                    404:     bfd_signed_vma l_paddr;            /* (physical) address of line number    */
                    405:   }     l_addr;
                    406:   unsigned long l_lnno;                /* line number          */
                    407: };
                    408:
                    409: /********************** SYMBOLS **********************/
                    410:
                    411: #define SYMNMLEN       8       /* # characters in a symbol name        */
                    412: #define FILNMLEN       14      /* # characters in a file name          */
                    413: #define DIMNUM         4       /* # array dimensions in auxiliary entry */
                    414:
                    415: struct internal_syment
                    416: {
                    417:   union
                    418:   {
                    419:     char _n_name[SYMNMLEN];    /* old COFF version             */
                    420:     struct
                    421:     {
                    422:       bfd_hostptr_t _n_zeroes; /* new == 0                     */
                    423:       bfd_hostptr_t _n_offset; /* offset into string table     */
                    424:     }      _n_n;
                    425:     char *_n_nptr[2];          /* allows for overlaying        */
                    426:   }     _n;
                    427:   bfd_vma n_value;             /* value of symbol              */
                    428:   short n_scnum;               /* section number               */
                    429:   unsigned short n_flags;      /* copy of flags from filhdr    */
                    430:   unsigned short n_type;       /* type and derived type        */
                    431:   unsigned char n_sclass;      /* storage class                */
                    432:   unsigned char n_numaux;      /* number of aux. entries       */
                    433: };
                    434:
                    435: #define n_name         _n._n_name
                    436: #define n_zeroes       _n._n_n._n_zeroes
                    437: #define n_offset       _n._n_n._n_offset
                    438:
                    439: /* Relocatable symbols have number of the section in which they are defined,
                    440:    or one of the following:  */
                    441:
                    442: #define N_UNDEF        ((short)0)      /* undefined symbol */
                    443: #define N_ABS  ((short)-1)     /* value of symbol is absolute */
                    444: #define N_DEBUG        ((short)-2)     /* debugging symbol -- value is meaningless */
                    445: #define N_TV   ((short)-3)     /* indicates symbol needs preload transfer vector */
                    446: #define P_TV   ((short)-4)     /* indicates symbol needs postload transfer vector*/
                    447:
                    448: /* Type of a symbol, in low N bits of the word.  */
                    449:
                    450: #define T_NULL         0
                    451: #define T_VOID         1       /* function argument (only used by compiler) */
                    452: #define T_CHAR         2       /* character            */
                    453: #define T_SHORT                3       /* short integer        */
                    454: #define T_INT          4       /* integer              */
                    455: #define T_LONG         5       /* long integer         */
                    456: #define T_FLOAT                6       /* floating point       */
                    457: #define T_DOUBLE       7       /* double word          */
                    458: #define T_STRUCT       8       /* structure            */
                    459: #define T_UNION                9       /* union                */
                    460: #define T_ENUM         10      /* enumeration          */
                    461: #define T_MOE          11      /* member of enumeration*/
                    462: #define T_UCHAR                12      /* unsigned character   */
                    463: #define T_USHORT       13      /* unsigned short       */
                    464: #define T_UINT         14      /* unsigned integer     */
                    465: #define T_ULONG                15      /* unsigned long        */
                    466: #define T_LNGDBL       16      /* long double          */
                    467:
                    468: /* Derived types, in n_type.  */
                    469:
                    470: #define DT_NON         (0)     /* no derived type */
                    471: #define DT_PTR         (1)     /* pointer */
                    472: #define DT_FCN         (2)     /* function */
                    473: #define DT_ARY         (3)     /* array */
                    474:
                    475: #define BTYPE(x)       ((x) & N_BTMASK)
                    476: #define DTYPE(x)       (((x) & N_TMASK) >> N_BTSHFT)
                    477:
                    478: #define ISPTR(x) \
                    479:   (((unsigned long) (x) & N_TMASK) == ((unsigned long) DT_PTR << N_BTSHFT))
                    480: #define ISFCN(x) \
                    481:   (((unsigned long) (x) & N_TMASK) == ((unsigned long) DT_FCN << N_BTSHFT))
                    482: #define ISARY(x) \
                    483:   (((unsigned long) (x) & N_TMASK) == ((unsigned long) DT_ARY << N_BTSHFT))
                    484: #define ISTAG(x) \
                    485:   ((x) == C_STRTAG || (x) == C_UNTAG || (x) == C_ENTAG)
                    486: #define DECREF(x) \
                    487:   ((((x) >> N_TSHIFT) & ~ N_BTMASK) | ((x) & N_BTMASK))
                    488:
                    489: union internal_auxent
                    490: {
                    491:   struct
                    492:   {
                    493:
                    494:     union
                    495:     {
                    496:       long l;                  /* str, un, or enum tag indx */
                    497:       struct coff_ptr_struct *p;
                    498:     }     x_tagndx;
                    499:
                    500:     union
                    501:     {
                    502:       struct
                    503:       {
                    504:        unsigned short x_lnno;  /* declaration line number */
                    505:        unsigned short x_size;  /* str/union/array size */
                    506:       }      x_lnsz;
                    507:       long x_fsize;            /* size of function */
                    508:     }     x_misc;
                    509:
                    510:     union
                    511:     {
                    512:       struct
                    513:       {                                /* if ISFCN, tag, or .bb */
                    514:        bfd_signed_vma x_lnnoptr;               /* ptr to fcn line # */
                    515:        union
                    516:        {                       /* entry ndx past block end */
                    517:          long l;
                    518:          struct coff_ptr_struct *p;
                    519:        }     x_endndx;
                    520:       }      x_fcn;
                    521:
                    522:       struct
                    523:       {                                /* if ISARY, up to 4 dimen. */
                    524:        unsigned short x_dimen[DIMNUM];
                    525:       }      x_ary;
                    526:     }     x_fcnary;
                    527:
                    528:     unsigned short x_tvndx;    /* tv index */
                    529:   }      x_sym;
                    530:
                    531:   union
                    532:   {
                    533:     char x_fname[FILNMLEN];
                    534:     struct
                    535:     {
                    536:       long x_zeroes;
                    537:       long x_offset;
                    538:     }      x_n;
                    539:   }     x_file;
                    540:
                    541:   struct
                    542:   {
                    543:     long x_scnlen;             /* section length */
                    544:     unsigned short x_nreloc;   /* # relocation entries */
                    545:     unsigned short x_nlinno;   /* # line numbers */
                    546:     unsigned long x_checksum;  /* section COMDAT checksum for PE */
                    547:     unsigned short x_associated; /* COMDAT associated section index for PE */
                    548:     unsigned char x_comdat;    /* COMDAT selection number for PE */
                    549:   }      x_scn;
                    550:
                    551:   struct
                    552:   {
                    553:     long x_tvfill;             /* tv fill value */
                    554:     unsigned short x_tvlen;    /* length of .tv */
                    555:     unsigned short x_tvran[2]; /* tv range */
                    556:   }      x_tv;                 /* info about .tv section (in auxent of symbol .tv)) */
                    557:
                    558:   /******************************************
                    559:    * RS/6000-specific auxent - last auxent for every external symbol
                    560:    ******************************************/
                    561:   struct
                    562:   {
                    563:     union
                    564:       {                                /* csect length or enclosing csect */
                    565:        bfd_signed_vma l;
                    566:        struct coff_ptr_struct *p;
                    567:       } x_scnlen;
                    568:     long x_parmhash;           /* parm type hash index */
                    569:     unsigned short x_snhash;   /* sect num with parm hash */
                    570:     unsigned char x_smtyp;     /* symbol align and type */
                    571:     /* 0-4 - Log 2 of alignment */
                    572:     /* 5-7 - symbol type */
                    573:     unsigned char x_smclas;    /* storage mapping class */
                    574:     long x_stab;               /* dbx stab info index */
                    575:     unsigned short x_snstab;   /* sect num with dbx stab */
                    576:   }      x_csect;              /* csect definition information */
                    577:
                    578: /* x_smtyp values:  */
                    579:
                    580: #define        SMTYP_ALIGN(x)  ((x) >> 3)      /* log2 of alignment */
                    581: #define        SMTYP_SMTYP(x)  ((x) & 0x7)     /* symbol type */
                    582: /* Symbol type values:  */
                    583: #define        XTY_ER  0               /* External reference */
                    584: #define        XTY_SD  1               /* Csect definition */
                    585: #define        XTY_LD  2               /* Label definition */
                    586: #define XTY_CM 3               /* .BSS */
                    587: #define        XTY_EM  4               /* Error message */
                    588: #define        XTY_US  5               /* "Reserved for internal use" */
                    589:
                    590: /* x_smclas values:  */
                    591:
                    592: #define        XMC_PR  0               /* Read-only program code */
                    593: #define        XMC_RO  1               /* Read-only constant */
                    594: #define        XMC_DB  2               /* Read-only debug dictionary table */
                    595: #define        XMC_TC  3               /* Read-write general TOC entry */
                    596: #define        XMC_UA  4               /* Read-write unclassified */
                    597: #define        XMC_RW  5               /* Read-write data */
                    598: #define        XMC_GL  6               /* Read-only global linkage */
                    599: #define        XMC_XO  7               /* Read-only extended operation */
                    600: #define        XMC_SV  8               /* Read-only supervisor call */
                    601: #define        XMC_BS  9               /* Read-write BSS */
                    602: #define        XMC_DS  10              /* Read-write descriptor csect */
                    603: #define        XMC_UC  11              /* Read-write unnamed Fortran common */
                    604: #define        XMC_TI  12              /* Read-only traceback index csect */
                    605: #define        XMC_TB  13              /* Read-only traceback table csect */
                    606: /*             14      ??? */
                    607: #define        XMC_TC0 15              /* Read-write TOC anchor */
                    608: #define XMC_TD 16              /* Read-write data in TOC */
                    609:
                    610:   /******************************************
                    611:    *  I960-specific *2nd* aux. entry formats
                    612:    ******************************************/
                    613:   struct
                    614:   {
                    615:     /* This is a very old typo that keeps getting propagated. */
                    616: #define x_stdindx x_stindx
                    617:     long x_stindx;             /* sys. table entry */
                    618:   }      x_sc;                 /* system call entry */
                    619:
                    620:   struct
                    621:   {
                    622:     unsigned long x_balntry;   /* BAL entry point */
                    623:   }      x_bal;                        /* BAL-callable function */
                    624:
                    625:   struct
                    626:   {
                    627:     unsigned long x_timestamp; /* time stamp */
                    628:     char x_idstring[20];       /* producer identity string */
                    629:   }      x_ident;              /* Producer ident info */
                    630:
                    631: };
                    632:
                    633: /********************** RELOCATION DIRECTIVES **********************/
                    634:
                    635: struct internal_reloc
                    636: {
                    637:   bfd_vma r_vaddr;             /* Virtual address of reference */
                    638:   long r_symndx;               /* Index into symbol table      */
                    639:   unsigned short r_type;       /* Relocation type              */
                    640:   unsigned char r_size;                /* Used by RS/6000 and ECOFF    */
                    641:   unsigned char r_extern;      /* Used by ECOFF                */
                    642:   unsigned long r_offset;      /* Used by Alpha ECOFF, SPARC, others */
                    643: };
                    644:
                    645: /* X86-64 relocations.  */
                    646: #define R_AMD64_ABS             0 /* Reference is absolute, no relocation is necessary.  */
                    647: #define R_AMD64_DIR64           1 /* 64-bit address (VA).  */
                    648: #define R_AMD64_DIR32           2 /* 32-bit address (VA) R_DIR32.  */
                    649: #define R_AMD64_IMAGEBASE       3 /* 32-bit absolute ref w/o base R_IMAGEBASE.  */
                    650: #define R_AMD64_PCRLONG                 4 /* 32-bit relative address from byte following reloc R_PCRLONG.  */
                    651: #define R_AMD64_PCRLONG_1       5 /* 32-bit relative address from byte distance 1 from reloc.  */
                    652: #define R_AMD64_PCRLONG_2       6 /* 32-bit relative address from byte distance 2 from reloc.  */
                    653: #define R_AMD64_PCRLONG_3       7 /* 32-bit relative address from byte distance 3 from reloc.  */
                    654: #define R_AMD64_PCRLONG_4       8 /* 32-bit relative address from byte distance 4 from reloc.  */
                    655: #define R_AMD64_PCRLONG_5       9 /* 32-bit relative address from byte distance 5 from reloc.  */
                    656: #define R_AMD64_SECTION                10 /* Section index.  */
                    657: #define R_AMD64_SECREL         11 /* 32 bit offset from base of section containing target R_SECREL.  */
                    658: #define R_AMD64_SECREL7                12 /* 7 bit unsigned offset from base of section containing target.  */
                    659: #define R_AMD64_TOKEN          13 /* 32 bit metadata token.  */
                    660: #define R_AMD64_PCRQUAD                14 /* Pseude PC64 relocation - Note: not specified by MS/AMD but need for gas pc-relative 64bit wide relocation generated by ELF.  */
                    661:
                    662: /* i386 Relocations.  */
                    663:
                    664: #define R_DIR16         1
                    665: #define R_REL24          5
                    666: #define R_DIR32         6
                    667: #define R_IMAGEBASE     7
                    668: #define R_SECREL32     11
                    669: #define R_RELBYTE      15
                    670: #define R_RELWORD      16
                    671: #define R_RELLONG      17
                    672: #define R_PCRBYTE      18
                    673: #define R_PCRWORD      19
                    674: #define R_PCRLONG      20
                    675: #define R_PCR24         21
                    676: #define R_IPRSHORT     24
                    677: #define R_IPRLONG      26
                    678: #define R_GETSEG       29
                    679: #define R_GETPA        30
                    680: #define R_TAGWORD      31
                    681: #define R_JUMPTARG     32      /* strange 29k 00xx00xx reloc */
                    682: #define R_PARTLS16      32
                    683: #define R_PARTMS8       33
                    684:
                    685: #define R_PCR16L       128
                    686: #define R_PCR26L       129
                    687: #define R_VRT16        130
                    688: #define R_HVRT16       131
                    689: #define R_LVRT16       132
                    690: #define R_VRT32        133
                    691:
                    692:
                    693: /* This reloc identifies mov.b instructions with a 16bit absolute
                    694:    address.  The linker tries to turn insns with this reloc into
                    695:    an absolute 8-bit address.  */
                    696: #define R_MOV16B1      0x41
                    697:
                    698: /* This reloc identifies mov.b instructions which had a 16bit
                    699:    absolute address which have been shortened into a 8-bit
                    700:    absolute address.  */
                    701: #define R_MOV16B2      0x42
                    702:
                    703: /* This reloc identifies jmp insns with a 16bit target address;
                    704:    the linker tries to turn these insns into bra insns with
                    705:    an 8bit pc-relative target.  */
                    706: #define R_JMP1         0x43
                    707:
                    708: /* This reloc identifies a bra with an 8-bit pc-relative
                    709:    target that was formerly a jmp insn with a 16bit target.  */
                    710: #define R_JMP2                 0x44
                    711:
                    712: /* ??? */
                    713: #define R_RELLONG_NEG          0x45
                    714:
                    715: /* This reloc identifies jmp insns with a 24bit target address;
                    716:    the linker tries to turn these insns into bra insns with
                    717:    an 8bit pc-relative target.  */
                    718: #define R_JMPL1        0x46
                    719:
                    720: /* This reloc identifies a bra with an 8-bit pc-relative
                    721:    target that was formerly a jmp insn with a 24bit target.  */
                    722: #define R_JMPL2                0x47
                    723:
                    724: /* This reloc identifies mov.b instructions with a 24bit absolute
                    725:    address.  The linker tries to turn insns with this reloc into
                    726:    an absolute 8-bit address.  */
                    727:
                    728: #define R_MOV24B1      0x48
                    729:
                    730: /* This reloc identifies mov.b instructions which had a 24bit
                    731:    absolute address which have been shortened into a 8-bit
                    732:    absolute address.  */
                    733: #define R_MOV24B2      0x49
                    734:
                    735: /* An h8300 memory indirect jump/call.  Forces the address of the jump/call
                    736:    target into the function vector (in page zero), and the address of the
                    737:    vector entry to be placed in the jump/call instruction.  */
                    738: #define R_MEM_INDIRECT 0x4a
                    739:
                    740: /* This reloc identifies a 16bit pc-relative branch target which was
                    741:    shortened into an 8bit pc-relative branch target.  */
                    742: #define R_PCRWORD_B    0x4b
                    743:
                    744: /* This reloc identifies mov.[wl] instructions with a 32/24 bit
                    745:    absolute address; the linker may turn this into a mov.[wl]
                    746:    insn with a 16bit absolute address.  */
                    747: #define R_MOVL1        0x4c
                    748:
                    749: /* This reloc identifies mov.[wl] insns which formerly had
                    750:    a 32/24bit absolute address and now have a 16bit absolute address.  */
                    751: #define R_MOVL2        0x4d
                    752:
                    753: /* This reloc identifies a bCC:8 which will have it's condition
                    754:    inverted and its target redirected to the target of the branch
                    755:    in the following insn.  */
                    756: #define R_BCC_INV      0x4e
                    757:
                    758: /* This reloc identifies a jmp instruction that has been deleted.  */
                    759: #define R_JMP_DEL      0x4f
                    760:
                    761: /* Z8k modes */
                    762: #define R_IMM16   0x01         /* 16 bit abs */
                    763: #define R_JR     0x02          /* jr  8 bit disp */
                    764: #define R_IMM4L   0x23         /* low nibble */
                    765: #define R_IMM8    0x22         /* 8 bit abs */
                    766: #define R_IMM32   R_RELLONG    /* 32 bit abs */
                    767: #define R_CALL    R_DA         /* Absolute address which could be a callr */
                    768: #define R_JP     R_DA          /* Absolute address which could be a jp */
                    769: #define R_REL16   0x04         /* 16 bit PC rel */
                    770: #define R_CALLR          0x05          /* callr 12 bit disp */
                    771: #define R_SEG     0x10         /* set if in segmented mode */
                    772: #define R_IMM4H   0x24         /* high nibble */
                    773: #define R_DISP7   0x25          /* djnz displacement */
                    774:
                    775: /* Z80 modes */
                    776: #define R_OFF8    0x32         /* 8 bit signed abs, for (i[xy]+d) */
                    777: #define R_IMM24   0x33          /* 24 bit abs */
                    778: /* R_JR, R_IMM8, R_IMM16, R_IMM32 - as for Z8k */
                    779:
                    780: /* H8500 modes */
                    781:
                    782: #define R_H8500_IMM8   1               /*  8 bit immediate     */
                    783: #define R_H8500_IMM16  2               /* 16 bit immediate     */
                    784: #define R_H8500_PCREL8         3               /*  8 bit pcrel         */
                    785: #define R_H8500_PCREL16 4              /* 16 bit pcrel         */
                    786: #define R_H8500_HIGH8          5               /* high 8 bits of 24 bit address */
                    787: #define R_H8500_LOW16  7               /* low 16 bits of 24 bit immediate */
                    788: #define R_H8500_IMM24  6               /* 24 bit immediate */
                    789: #define R_H8500_IMM32   8               /* 32 bit immediate */
                    790: #define R_H8500_HIGH16  9              /* high 16 bits of 32 bit immediate */
                    791:
                    792: /* W65 modes */
                    793:
                    794: #define R_W65_ABS8     1  /* addr & 0xff               */
                    795: #define R_W65_ABS16    2  /* addr & 0xffff             */
                    796: #define R_W65_ABS24    3  /* addr & 0xffffff           */
                    797:
                    798: #define R_W65_ABS8S8    4  /* (addr >> 8) & 0xff       */
                    799: #define R_W65_ABS8S16   5  /* (addr >> 16) & 0xff      */
                    800:
                    801: #define R_W65_ABS16S8   6  /* (addr >> 8) & 0ffff      */
                    802: #define R_W65_ABS16S16  7  /* (addr >> 16) & 0ffff     */
                    803:
                    804: #define R_W65_PCR8     8
                    805: #define R_W65_PCR16    9
                    806:
                    807: #define R_W65_DP       10  /* direct page 8 bits only   */
                    808:
                    809: #endif /* GNU_COFF_INTERNAL_H */

CVSweb <webmaster@jp.NetBSD.org>