X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fcoff%2Fxcoff.h;h=a645acce059eaf2ebab618a3686a1e84272ec6be;hb=3734bec8336f6f33927ab99460cb681035c2ca4f;hp=b25c2945c5b26d7e277fd47e6bd95a7589e52c07;hpb=1fdf02497c16f3f011e3548c4bb810b26ac670b9;p=deliverable%2Fbinutils-gdb.git diff --git a/include/coff/xcoff.h b/include/coff/xcoff.h index b25c2945c5..a645acce05 100644 --- a/include/coff/xcoff.h +++ b/include/coff/xcoff.h @@ -1,13 +1,13 @@ /* Internal format of XCOFF object file data structures for BFD. - Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1995-2020 Free Software Foundation, Inc. Written by Ian Lance Taylor , Cygnus Support. This file is part of BFD, the Binary File Descriptor library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -17,29 +17,73 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ #ifndef _INTERNAL_XCOFF_H #define _INTERNAL_XCOFF_H -/* - * LINKER - */ +/* XCOFF specific f_flags. */ -/* - * names of "special" sections - */ +/* File was profiled with fdpr. */ +#define F_FDPR_PROF 0x0010 + +/* File was reordered with fdpr. */ +#define F_FDPR_OPTI 0x0020 + +/* File use very large program support. */ +#define F_DSA 0x0040 + +/* One aux header specifying medium page sizes is non-zero. */ +#define F_VARPG 0x0100 + +/* Read/write sections are non-executable. */ +#define F_NONEXEC 0x8000 + +/* Linker */ + +/* Names of "special" sections. */ #define _TEXT ".text" #define _DATA ".data" #define _BSS ".bss" #define _PAD ".pad" #define _LOADER ".loader" +#define _EXCEPT ".except" +#define _TYPCHK ".typchk" + +/* XCOFF uses special .dwXXX sections with the type STYP_DWARF. */ +#define STYP_DWARF 0x0010 + +/* High-order 16-bits dwarf subtypes. */ +#define SSUBTYP_DWINFO 0x10000 +#define SSUBTYP_DWLINE 0x20000 +#define SSUBTYP_DWPBNMS 0x30000 +#define SSUBTYP_DWPBTYP 0x40000 +#define SSUBTYP_DWARNGE 0x50000 +#define SSUBTYP_DWABREV 0x60000 +#define SSUBTYP_DWSTR 0x70000 +#define SSUBTYP_DWRNGES 0x80000 /* XCOFF uses a special .loader section with type STYP_LOADER. */ #define STYP_LOADER 0x1000 +/* Specifies an exception section. A section of this type provides + information to identify the reason that a trap or ececptin occured within + and executable object program */ +#define STYP_EXCEPT 0x0100 + +/* Specifies an initialized thread-local data section. */ +#define STYP_TDATA 0x0400 + +/* Specifies an uninitialized thread-local data section. */ +#define STYP_TBSS 0x0800 + /* XCOFF uses a special .debug section with type STYP_DEBUG. */ -#define STYP_DEBUG 0x2000 +#define STYP_DEBUG 0x2000 + +/* Specifies a type check section. A section of this type contains parameter + argument type check strings used by the AIX binder. */ +#define STYP_TYPCHK 0x4000 /* XCOFF handles line number or relocation overflow by creating another section header with STYP_OVRFLO set. */ @@ -49,7 +93,6 @@ #define RS6K_AOUTHDR_NMAGIC 0x0108 /* new: text r/o, data r/w */ #define RS6K_AOUTHDR_ZMAGIC 0x010B /* paged: text r/o, both page-aligned */ - /* XCOFF relocation types. The relocations are described in the function xcoff[64]_ppc_relocate_section in coff64-rs6000.c and coff-rs6000.c */ @@ -76,23 +119,27 @@ #define R_RBAC (0x19) #define R_RBR (0x1a) #define R_RBRC (0x1b) +#define R_TLS (0x20) +#define R_TLS_IE (0x21) +#define R_TLS_LD (0x22) +#define R_TLS_LE (0x23) +#define R_TLSM (0x24) +#define R_TLSML (0x25) +#define R_TOCU (0x30) +#define R_TOCL (0x31) +/* Storage class #defines, from /usr/include/storclass.h that are not already + defined in internal.h */ -/* - * Storage class #defines, from /usr/include/storclass.h - * That are not already defined in internal.h - */ -#define C_INFO 110 /* Comment string in .info section */ +/* Comment string in .info section */ +#define C_INFO 110 +/* Dwarf symbol. */ +#define C_DWARF 112 -/* - * AUXILLARY SYMBOL ENTRIES - * - * auxemt - */ +/* Auxillary Symbol Entries */ /* x_smtyp values: */ - #define SMTYP_ALIGN(x) ((x) >> 3) /* log2 of alignment */ #define SMTYP_SMTYP(x) ((x) & 0x7) /* symbol type */ /* Symbol type values: */ @@ -104,7 +151,6 @@ #define XTY_US 5 /* "Reserved for internal use" */ /* x_smclas values: */ - #define XMC_PR 0 /* Read-only program code */ #define XMC_RO 1 /* Read-only constant */ #define XMC_DB 2 /* Read-only debug dictionary table */ @@ -124,36 +170,47 @@ #define XMC_TD 16 /* Read-write data in TOC */ #define XMC_SV64 17 /* Read-only 64 bit supervisor call */ #define XMC_SV3264 18 /* Read-only 32 or 64 bit supervisor call */ +/* 19 ??? */ +#define XMC_TL 20 /* Read-write initialized TLS data */ +#define XMC_TU 21 /* Read-write uninitialized TLS data */ +#define XMC_TE 22 /* Same as XMC_TC but mapped after it */ /* The ldhdr structure. This appears at the start of the .loader section. */ struct internal_ldhdr { - /* - * The version number: - * 1 : 32 bit - * 2 : 64 bit - */ + /* The version number: + 1 : 32 bit + 2 : 64 bit */ unsigned long l_version; + /* The number of symbol table entries. */ bfd_size_type l_nsyms; + /* The number of relocation table entries. */ bfd_size_type l_nreloc; + /* The length of the import file string table. */ bfd_size_type l_istlen; + /* The number of import files. */ bfd_size_type l_nimpid; + /* The offset from the start of the .loader section to the first entry in the import file table. */ bfd_size_type l_impoff; + /* The length of the string table. */ bfd_size_type l_stlen; + /* The offset from the start of the .loader section to the first entry in the string table. */ bfd_size_type l_stoff; + /* The offset to start of the symbol table, only in XCOFF64 */ bfd_vma l_symoff; + /* The offset to the start of the relocation table, only in XCOFF64 */ bfd_vma l_rldoff; }; @@ -164,28 +221,37 @@ struct internal_ldhdr struct internal_ldsym { union + { + /* The symbol name if <= SYMNMLEN characters. */ + char _l_name[SYMNMLEN]; + struct { - /* The symbol name if <= SYMNMLEN characters. */ - char _l_name[SYMNMLEN]; - struct - { - /* Zero if the symbol name is more than SYMNMLEN characters. */ - long _l_zeroes; - /* The offset in the string table if the symbol name is more - than SYMNMLEN characters. */ - long _l_offset; - } _l_l; - } _l; + /* Zero if the symbol name is more than SYMNMLEN characters. */ + long _l_zeroes; + + /* The offset in the string table if the symbol name is more + than SYMNMLEN characters. */ + long _l_offset; + } + _l_l; + } + _l; + /* The symbol value. */ bfd_vma l_value; + /* The symbol section number. */ short l_scnum; + /* The symbol type and flags. */ char l_smtype; + /* The symbol storage class. */ char l_smclas; + /* The import file ID. */ bfd_size_type l_ifile; + /* Offset to the parameter type check string. */ bfd_size_type l_parm; }; @@ -199,6 +265,8 @@ struct internal_ldsym #define L_ENTRY (0x20) /* Exported symbol. */ #define L_EXPORT (0x10) +/* Weak symbol. */ +#define L_WEAK (0x08) /* The ldrel structure. This is used to represent a reloc in the .loader section. */ @@ -207,10 +275,13 @@ struct internal_ldrel { /* The reloc address. */ bfd_vma l_vaddr; + /* The symbol table index in the .loader section symbol table. */ bfd_size_type l_symndx; + /* The relocation type and size. */ short l_rtype; + /* The section number this relocation applies to. */ short l_rsecnm; }; @@ -229,14 +300,16 @@ struct xcoff_link_hash_entry asection *toc_section; union - { - /* If we have created a TOC entry (the XCOFF_SET_TOC flag is - set), this is the offset in toc_section. */ - bfd_vma toc_offset; - /* If the TOC entry comes from an input file, this is set to the - symbol index of the C_HIDEXT XMC_TC or XMC_TD symbol. */ - long toc_indx; - } u; + { + /* If we have created a TOC entry (the XCOFF_SET_TOC flag is + set), this is the offset in toc_section. */ + bfd_vma toc_offset; + + /* If the TOC entry comes from an input file, this is set to the + symbol index of the C_HIDEXT XMC_TC or XMC_TD symbol. */ + long toc_indx; + } + u; /* If this symbol is a function entry point which is called, this field holds a pointer to the function descriptor. If this symbol @@ -259,78 +332,47 @@ struct xcoff_link_hash_entry unsigned char smclas; }; -/* - * #define for xcoff_link_hash_entry.flags - * - * XCOFF_REF_REGULAR - * Symbol is referenced by a regular object. - * - * XCOFF_DEF_REGULAR - * Symbol is defined by a regular object. - * - * XCOFF_DEF_DYNAMIC - * Symbol is defined by a dynamic object. - * - * XCOFF_LDREL - * Symbol is used in a reloc being copied into the .loader section. - * - * XCOFF_ENTRY - * Symbol is the entry point. - * - * XCOFF_CALLED - * Symbol is called; this is, it appears in a R_BR reloc. - * - * XCOFF_SET_TOC - * Symbol needs the TOC entry filled in. - * - * XCOFF_IMPORT - * Symbol is explicitly imported. - * - * XCOFF_EXPORT - * Symbol is explicitly exported. - * - * XCOFF_BUILT_LDSYM - * Symbol has been processed by xcoff_build_ldsyms. - * - * XCOFF_MARK - * Symbol is mentioned by a section which was not garbage collected. - * - * XCOFF_HAS_SIZE - * Symbol size is recorded in size_list list from hash table. - * - * XCOFF_DESCRIPTOR - * Symbol is a function descriptor. - * - * XCOFF_MULTIPLY_DEFINED - * Multiple definitions have been for the symbol. - * - * XCOFF_RTINIT - * Symbol is the __rtinit symbol - * - * XCOFF_SYSCALL32 - * Symbol is an imported 32 bit syscall - * - * XCOFF_SYSCALL64 - * Symbol is an imported 64 bit syscall - */ +/* Flags for xcoff_link_hash_entry. */ +/* Symbol is referenced by a regular object. */ #define XCOFF_REF_REGULAR 0x00000001 +/* Symbol is defined by a regular object. */ #define XCOFF_DEF_REGULAR 0x00000002 +/* Symbol is defined by a dynamic object. */ #define XCOFF_DEF_DYNAMIC 0x00000004 +/* Symbol is used in a reloc being copied into the .loader section. */ #define XCOFF_LDREL 0x00000008 +/* Symbol is the entry point. */ #define XCOFF_ENTRY 0x00000010 +/* Symbol is for a function and is the target of a relocation. + The relocation may or may not be a branch-type relocation. */ #define XCOFF_CALLED 0x00000020 +/* Symbol needs the TOC entry filled in. */ #define XCOFF_SET_TOC 0x00000040 +/* Symbol is implicitly or explicitly imported. */ #define XCOFF_IMPORT 0x00000080 +/* Symbol is explicitly exported. */ #define XCOFF_EXPORT 0x00000100 +/* Symbol has been processed by xcoff_build_ldsyms. */ #define XCOFF_BUILT_LDSYM 0x00000200 +/* Symbol is mentioned by a section which was not garbage collected. */ #define XCOFF_MARK 0x00000400 +/* Symbol size is recorded in size_list list from hash table. */ #define XCOFF_HAS_SIZE 0x00000800 +/* Symbol is a function descriptor. */ #define XCOFF_DESCRIPTOR 0x00001000 +/* Multiple definitions have been for the symbol. */ #define XCOFF_MULTIPLY_DEFINED 0x00002000 +/* Symbol is the __rtinit symbol. */ #define XCOFF_RTINIT 0x00004000 +/* Symbol is an imported 32 bit syscall. */ #define XCOFF_SYSCALL32 0x00008000 +/* Symbol is an imported 64 bit syscall. */ #define XCOFF_SYSCALL64 0x00010000 +/* Symbol was not explicitly defined by the time it was marked. */ +#define XCOFF_WAS_UNDEFINED 0x00020000 +/* We have assigned an output XCOFF entry to this symbol. */ +#define XCOFF_ALLOCATED 0x00040000 /* The XCOFF linker hash table. */ @@ -342,63 +384,9 @@ struct xcoff_link_hash_entry #define XCOFF_SPECIAL_SECTION_END 4 #define XCOFF_SPECIAL_SECTION_END2 5 -struct xcoff_link_hash_table -{ - struct bfd_link_hash_table root; - - /* The .debug string hash table. We need to compute this while - reading the input files, so that we know how large the .debug - section will be before we assign section positions. */ - struct bfd_strtab_hash *debug_strtab; - - /* The .debug section we will use for the final output. */ - asection *debug_section; - - /* The .loader section we will use for the final output. */ - asection *loader_section; - - /* A count of non TOC relative relocs which will need to be - allocated in the .loader section. */ - size_t ldrel_count; - - /* The .loader section header. */ - struct internal_ldhdr ldhdr; - - /* The .gl section we use to hold global linkage code. */ - asection *linkage_section; - - /* The .tc section we use to hold toc entries we build for global - linkage code. */ - asection *toc_section; - - /* The .ds section we use to hold function descriptors which we - create for exported symbols. */ - asection *descriptor_section; - - /* The list of import files. */ - struct xcoff_import_file *imports; - - /* Required alignment of sections within the output file. */ - unsigned long file_align; - - /* Whether the .text section must be read-only. */ - boolean textro; - - /* Whether garbage collection was done. */ - boolean gc; - - /* A linked list of symbols for which we have size information. */ - struct xcoff_link_size_list - { - struct xcoff_link_size_list *next; - struct xcoff_link_hash_entry *h; - bfd_size_type size; - } *size_list; - - /* Magic sections: _text, _etext, _data, _edata, _end, end. */ - asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS]; -}; - +/* These flags indicate which of -bexpall and -bexpfull are in effect. */ +#define XCOFF_EXPALL 1 +#define XCOFF_EXPFULL 2 /* This structure is used to pass information through xcoff_link_hash_traverse. */ @@ -406,63 +394,78 @@ struct xcoff_link_hash_table struct xcoff_loader_info { /* Set if a problem occurred. */ - boolean failed; + bfd_boolean failed; + /* Output BFD. */ bfd *output_bfd; + /* Link information structure. */ struct bfd_link_info *info; - /* Whether all defined symbols should be exported. */ - boolean export_defineds; + + /* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags. */ + unsigned int auto_export_flags; + /* Number of ldsym structures. */ size_t ldsym_count; + /* Size of string table. */ size_t string_size; + /* String table. */ - bfd_byte *strings; + char *strings; + /* Allocated size of string table. */ size_t string_alc; }; /* In case we're on a 32-bit machine, construct a 64-bit "-1" value from smaller values. Start with zero, widen, *then* decrement. */ -#define MINUS_ONE (((bfd_vma)0) - 1) - - -/* - * __rtinit - * from /usr/include/rtinit.h - */ -struct __rtinit { - int (*rtl) PARAMS ((void)); /* Pointer to runtime linker. - XXX: Is the parameter really void? */ - int init_offset; /* Offset to array of init functions - (0 if none). */ - int fini_offset; /* Offset to array of fini functions - (0 if none). */ - int __rtinit_descriptor_size; /* Size of __RTINIT_DESCRIPTOR. - This value should be used instead - of sizeof(__RTINIT_DESCRIPTOR). */ +#define MINUS_ONE (((bfd_vma) 0) - 1) + +/* __rtinit, from /usr/include/rtinit.h. */ +struct __rtinit +{ + /* Pointer to runtime linker. + XXX: Is the parameter really void? */ + int (*rtl) (void); + + /* Offset to array of init functions, 0 if none. */ + int init_offset; + + /* Offset to array of fini functions, 0 if none. */ + int fini_offset; + + /* Size of __RTINIT_DESCRIPTOR. This value should be used instead of + sizeof(__RTINIT_DESCRIPTOR). */ + int __rtinit_descriptor_size; }; #define RTINIT_DESCRIPTOR_SIZE (12) -struct __rtinit_descriptor { - int f; /* Init/fini function. */ - int name_offset; /* Offset (within __rtinit symbol) - to name of function. */ - unsigned char flags; /* Flags */ -}; +struct __rtinit_descriptor +{ + /* Init/fini function. */ + int f; + /* Offset, relative to the start of the __rtinit symbol, to name of the + function. */ + int name_offset; + + /* Flags */ + unsigned char flags; +}; -/* - * ARCHIVE - */ +/* Archive */ #define XCOFFARMAG "\012" #define XCOFFARMAGBIG "\012" #define SXCOFFARMAG 8 +/* The size of the ascii archive elements */ +#define XCOFFARMAG_ELEMENT_SIZE 12 +#define XCOFFARMAGBIG_ELEMENT_SIZE 20 + /* This terminates an XCOFF archive member name. */ #define XCOFFARFMAG "`\012" @@ -476,23 +479,23 @@ struct xcoff_ar_file_hdr char magic[SXCOFFARMAG]; /* Offset of the member table (decimal ASCII string). */ - char memoff[12]; + char memoff[XCOFFARMAG_ELEMENT_SIZE]; /* Offset of the global symbol table (decimal ASCII string). */ - char symoff[12]; + char symoff[XCOFFARMAG_ELEMENT_SIZE]; /* Offset of the first member in the archive (decimal ASCII string). */ - char firstmemoff[12]; + char firstmemoff[XCOFFARMAG_ELEMENT_SIZE]; /* Offset of the last member in the archive (decimal ASCII string). */ - char lastmemoff[12]; + char lastmemoff[XCOFFARMAG_ELEMENT_SIZE]; /* Offset of the first member on the free list (decimal ASCII string). */ - char freeoff[12]; + char freeoff[XCOFFARMAG_ELEMENT_SIZE]; }; -#define SIZEOF_AR_FILE_HDR (5 * 12 + SXCOFFARMAG) +#define SIZEOF_AR_FILE_HDR (SXCOFFARMAG + 5 * XCOFFARMAG_ELEMENT_SIZE) /* This is the equivalent data structure for the big archive format. */ @@ -502,42 +505,41 @@ struct xcoff_ar_file_hdr_big char magic[SXCOFFARMAG]; /* Offset of the member table (decimal ASCII string). */ - char memoff[20]; + char memoff[XCOFFARMAGBIG_ELEMENT_SIZE]; /* Offset of the global symbol table for 32-bit objects (decimal ASCII string). */ - char symoff[20]; + char symoff[XCOFFARMAGBIG_ELEMENT_SIZE]; /* Offset of the global symbol table for 64-bit objects (decimal ASCII string). */ - char symoff64[20]; + char symoff64[XCOFFARMAGBIG_ELEMENT_SIZE]; /* Offset of the first member in the archive (decimal ASCII string). */ - char firstmemoff[20]; + char firstmemoff[XCOFFARMAGBIG_ELEMENT_SIZE]; /* Offset of the last member in the archive (decimal ASCII string). */ - char lastmemoff[20]; + char lastmemoff[XCOFFARMAGBIG_ELEMENT_SIZE]; /* Offset of the first member on the free list (decimal ASCII string). */ - char freeoff[20]; + char freeoff[XCOFFARMAGBIG_ELEMENT_SIZE]; }; -#define SIZEOF_AR_FILE_HDR_BIG (6 * 20 + SXCOFFARMAG) - +#define SIZEOF_AR_FILE_HDR_BIG (SXCOFFARMAG + 6 * XCOFFARMAGBIG_ELEMENT_SIZE) /* Each XCOFF archive member starts with this (printable) structure. */ struct xcoff_ar_hdr { /* File size not including the header (decimal ASCII string). */ - char size[12]; + char size[XCOFFARMAG_ELEMENT_SIZE]; /* File offset of next archive member (decimal ASCII string). */ - char nextoff[12]; + char nextoff[XCOFFARMAG_ELEMENT_SIZE]; /* File offset of previous archive member (decimal ASCII string). */ - char prevoff[12]; + char prevoff[XCOFFARMAG_ELEMENT_SIZE]; /* File mtime (decimal ASCII string). */ char date[12]; @@ -562,20 +564,20 @@ struct xcoff_ar_hdr bytes is given in the size field. */ }; -#define SIZEOF_AR_HDR (7 * 12 + 4) +#define SIZEOF_AR_HDR (3 * XCOFFARMAG_ELEMENT_SIZE + 4 * 12 + 4) /* The equivalent for the big archive format. */ struct xcoff_ar_hdr_big { /* File size not including the header (decimal ASCII string). */ - char size[20]; + char size[XCOFFARMAGBIG_ELEMENT_SIZE]; /* File offset of next archive member (decimal ASCII string). */ - char nextoff[20]; + char nextoff[XCOFFARMAGBIG_ELEMENT_SIZE]; /* File offset of previous archive member (decimal ASCII string). */ - char prevoff[20]; + char prevoff[XCOFFARMAGBIG_ELEMENT_SIZE]; /* File mtime (decimal ASCII string). */ char date[12]; @@ -600,13 +602,27 @@ struct xcoff_ar_hdr_big bytes is given in the size field. */ }; -#define SIZEOF_AR_HDR_BIG (3 * 20 + 4 * 12 + 4) +#define SIZEOF_AR_HDR_BIG (3 * XCOFFARMAGBIG_ELEMENT_SIZE + 4 * 12 + 4) /* We often have to distinguish between the old and big file format. Make it a bit cleaner. We can use `xcoff_ardata' here because the - `hdr' member has the same size and position in both formats. */ + `hdr' member has the same size and position in both formats. + is the default format, return TRUE even when xcoff_ardata is + NULL. */ +#ifndef SMALL_ARCHIVE +/* Creates big archives by default */ #define xcoff_big_format_p(abfd) \ - (xcoff_ardata (abfd)->magic[1] == 'b') + ((NULL != bfd_ardata (abfd) && NULL == xcoff_ardata (abfd)) || \ + ((NULL != bfd_ardata (abfd)) && \ + (NULL != xcoff_ardata (abfd)) && \ + (xcoff_ardata (abfd)->magic[1] == 'b'))) +#else +/* Creates small archives by default. */ +#define xcoff_big_format_p(abfd) \ + (((NULL != bfd_ardata (abfd)) && \ + (NULL != xcoff_ardata (abfd)) && \ + (xcoff_ardata (abfd)->magic[1] == 'b'))) +#endif /* We store a copy of the xcoff_ar_file_hdr in the tdata field of the artdata structure. Similar for the big archive. */ @@ -623,4 +639,8 @@ struct xcoff_ar_hdr_big #define arch_xhdr_big(bfd) \ ((struct xcoff_ar_hdr_big *) arch_eltdata (bfd)->arch_header) +/* True if symbols of class CLASS are external. */ +#define EXTERN_SYM_P(CLASS) \ + ((CLASS) == C_EXT || (CLASS) == C_AIX_WEAKEXT) + #endif /* _INTERNAL_XCOFF_H */