X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=sidebyside;f=bfd%2Flibecoff.h;h=98e330af3f39f4c8980ceecdc5b53defa29f6ec1;hb=41792d688a5a1f158d6e9ecda2b603ae122d69a1;hp=74361c507573f8f3de948acfc7787ad9eb58cf04;hpb=dae31cf51ba2425ba562de00011f49c16e25951a;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/libecoff.h b/bfd/libecoff.h index 74361c5075..98e330af3f 100644 --- a/bfd/libecoff.h +++ b/bfd/libecoff.h @@ -1,98 +1,96 @@ /* BFD ECOFF object file private structure. - Copyright (C) 1993 Free Software Foundation, Inc. + Copyright (C) 1993-2020 Free Software Foundation, Inc. Written by Ian Lance Taylor, Cygnus Support. -This file is part of BFD, the Binary File Descriptor library. + 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 -(at your option) any later version. + 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 3 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -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., 675 Mass Ave, Cambridge, MA 02139, USA. */ + 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., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "bfdlink.h" + +#ifndef ECOFF_H +#include "coff/ecoff.h" +#endif /* This is the backend information kept for ECOFF files. This - structure is constant for a particular backend. ECOFF already - keeps a bfd_coff_backend_data structure in the bfd_target - backend_data field, so a pointer to this backend structure is kept - in the tdata field. */ + structure is constant for a particular backend. The first element + is the COFF backend data structure, so that ECOFF targets can use + the generic COFF code. */ -#define ecoff_backend(abfd) (ecoff_data (abfd)->backend_data) +#define ecoff_backend(abfd) \ + ((struct ecoff_backend_data *) (abfd)->xvec->backend_data) struct ecoff_backend_data { + /* COFF backend information. This must be the first field. */ + bfd_coff_backend_data coff; /* Supported architecture. */ enum bfd_architecture arch; - /* Big endian magic number. */ - int big_magic; - /* Little endian magic number. */ - int little_magic; - /* Alignment of debugging information. E.g., 4. */ - bfd_size_type debug_align; + /* Initial portion of armap string. */ + const char *armap_start; /* The page boundary used to align sections in a demand-paged executable file. E.g., 0x1000. */ bfd_vma round; + /* TRUE if the .rdata section is part of the text segment, as on the + Alpha. FALSE if .rdata is part of the data segment, as on the + MIPS. */ + bfd_boolean rdata_in_text; /* Bitsize of constructor entries. */ unsigned int constructor_bitsize; - /* Sizes of external symbolic information. */ - bfd_size_type external_hdr_size; - bfd_size_type external_dnr_size; - bfd_size_type external_pdr_size; - bfd_size_type external_sym_size; - bfd_size_type external_opt_size; - bfd_size_type external_fdr_size; - bfd_size_type external_rfd_size; - bfd_size_type external_ext_size; - /* Functions to swap in external symbolic data. */ - void (*swap_hdr_in) PARAMS ((bfd *, PTR, HDRR *)); - void (*swap_dnr_in) PARAMS ((bfd *, PTR, DNR *)); - void (*swap_pdr_in) PARAMS ((bfd *, PTR, PDR *)); - void (*swap_sym_in) PARAMS ((bfd *, PTR, SYMR *)); - void (*swap_opt_in) PARAMS ((bfd *, PTR, OPTR *)); - void (*swap_fdr_in) PARAMS ((bfd *, PTR, FDR *)); - void (*swap_rfd_in) PARAMS ((bfd *, PTR, RFDT *)); - void (*swap_ext_in) PARAMS ((bfd *, PTR, EXTR *)); - /* Functions to swap out external symbolic data. */ - void (*swap_hdr_out) PARAMS ((bfd *, const HDRR *, PTR)); - void (*swap_dnr_out) PARAMS ((bfd *, const DNR *, PTR)); - void (*swap_pdr_out) PARAMS ((bfd *, const PDR *, PTR)); - void (*swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR)); - void (*swap_opt_out) PARAMS ((bfd *, const OPTR *, PTR)); - void (*swap_fdr_out) PARAMS ((bfd *, const FDR *, PTR)); - void (*swap_rfd_out) PARAMS ((bfd *, const RFDT *, PTR)); - void (*swap_ext_out) PARAMS ((bfd *, const EXTR *, PTR)); - /* It so happens that the auxiliary type information has the same - type and format for all known ECOFF targets. I don't see any - reason that that should change, so at least for now the auxiliary - swapping information is not in this table. */ + /* Reloc to use for constructor entries. */ + reloc_howto_type *constructor_reloc; + /* How to swap debugging information. */ + struct ecoff_debug_swap debug_swap; /* External reloc size. */ bfd_size_type external_reloc_size; /* Reloc swapping functions. */ - void (*swap_reloc_in) PARAMS ((bfd *, PTR, struct internal_reloc *)); - void (*swap_reloc_out) PARAMS ((bfd *, const struct internal_reloc *, PTR)); + void (*swap_reloc_in) (bfd *, void *, struct internal_reloc *); + void (*swap_reloc_out) (bfd *, const struct internal_reloc *, void *); + /* Backend reloc tweaking. */ + void (*adjust_reloc_in) + (bfd *, const struct internal_reloc *, arelent *); + void (*adjust_reloc_out) + (bfd *, const arelent *, struct internal_reloc *); + /* Relocate section contents while linking. */ + bfd_boolean (*relocate_section) + (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, void *); + /* Do final adjustments to filehdr and aouthdr. */ + bfd_boolean (*adjust_headers) + (bfd *, struct internal_filehdr *, struct internal_aouthdr *); + /* Read an element from an archive at a given file position. This + is needed because OSF/1 3.2 uses a weird archive format. */ + bfd *(*get_elt_at_filepos) (bfd *, file_ptr); }; +/* ECOFF targets don't support COFF long section names, so this + macro is provided to use as an initialiser for the related + members of the embedded bfd_coff_backend_data struct. */ +#define ECOFF_NO_LONG_SECTION_NAMES (FALSE), _bfd_ecoff_no_long_sections + /* This is the target specific information kept for ECOFF files. */ #define ecoff_data(abfd) ((abfd)->tdata.ecoff_obj_data) typedef struct ecoff_tdata { - /* Constant backend information. */ - const struct ecoff_backend_data *backend_data; - /* The reloc file position, set by ecoff_compute_section_file_positions. */ file_ptr reloc_filepos; - /* The symbol table file position, set by ecoff_mkobject_hook. */ + /* The symbol table file position, set by _bfd_ecoff_mkobject_hook. */ file_ptr sym_filepos; /* The start and end of the text segment. Only valid for an @@ -106,45 +104,50 @@ typedef struct ecoff_tdata /* The maximum size of objects to optimize using gp. This is typically set by the -G option to the compiler, assembler or linker. */ - int gp_size; + unsigned int gp_size; /* The register masks. When linking, all the masks found in the - input files are combined into the masks of the output file. */ + input files are combined into the masks of the output file. + These are not all used for all targets, but that's OK, because + the relevant ones are the only ones swapped in and out. */ unsigned long gprmask; + unsigned long fprmask; unsigned long cprmask[4]; - /* The size of the unswapped ECOFF symbolic information. */ - bfd_size_type raw_size; + /* The ECOFF symbolic debugging information. */ + struct ecoff_debug_info debug_info; /* The unswapped ECOFF symbolic information. */ - PTR raw_syments; - - /* The swapped ECOFF symbolic header. */ - HDRR symbolic_header; - - /* Pointers to the unswapped symbolic information. */ - unsigned char *line; - PTR external_dnr; /* struct dnr_ext */ - PTR external_pdr; /* struct pdr_ext */ - PTR external_sym; /* struct sym_ext */ - PTR external_opt; /* struct opt_ext */ - union aux_ext *external_aux; - char *ss; - char *ssext; - PTR external_fdr; /* struct fdr_ext */ - PTR external_rfd; /* struct rfd_ext */ - PTR external_ext; /* struct ext_ext */ - - /* The swapped FDR information. */ - FDR *fdr; - - /* The FDR index. This is set for an input BFD to a link so that - the external symbols can set their FDR index correctly. */ - unsigned int ifdbase; + void * raw_syments; /* The canonical BFD symbols. */ struct ecoff_symbol_struct *canonical_symbols; + /* A mapping from external symbol numbers to entries in the linker + hash table, used when linking. */ + struct ecoff_link_hash_entry **sym_hashes; + + /* A mapping from reloc symbol indices to sections, used when + linking. */ + asection **symndx_to_section; + + /* TRUE if this BFD was written by the backend linker. */ + bfd_boolean linker; + + /* TRUE if a warning that multiple global pointer values are + needed in the output binary was issued already. */ + bfd_boolean issued_multiple_gp_warning; + + /* Used by find_nearest_line entry point. The structure could be + included directly in this one, but there's no point to wasting + the memory just for the infrequently called find_nearest_line. */ + struct ecoff_find_line *find_line_info; + + /* Whether the .rdata section is in the text segment for this + particular ECOFF file. This is not valid until + ecoff_compute_section_file_positions is called. */ + bfd_boolean rdata_in_text; + } ecoff_data_type; /* Each canonical asymbol really looks like this. */ @@ -157,99 +160,189 @@ typedef struct ecoff_symbol_struct /* The fdr for this symbol. */ FDR *fdr; - /* true if this is a local symbol rather than an external one. */ - boolean local; + /* TRUE if this is a local symbol rather than an external one. */ + bfd_boolean local; /* A pointer to the unswapped hidden information for this symbol. This is either a struct sym_ext or a struct ext_ext, depending on the value of the local field above. */ - PTR native; + void * native; } ecoff_symbol_type; -/* We take the address of the first element of a asymbol to ensure that the +/* We take the address of the first element of an asymbol to ensure that the macro is only ever applied to an asymbol. */ #define ecoffsymbol(asymbol) ((ecoff_symbol_type *) (&((asymbol)->the_bfd))) -/* This is a hack borrowed from coffcode.h; we need to save the index - of an external symbol when we write it out so that can set the - symbol index correctly when we write out the relocs. */ -#define ecoff_get_sym_index(symbol) ((unsigned long) (symbol)->udata) -#define ecoff_set_sym_index(symbol, idx) ((symbol)->udata = (PTR) (idx)) +/* We need to save the index of an external symbol when we write it + out so that can set the symbol index correctly when we write out + the relocs. */ +#define ecoff_get_sym_index(symbol) ((symbol)->udata.i) +#define ecoff_set_sym_index(symbol, idx) ((symbol)->udata.i = (idx)) + +/* A pointer to this structure is put in the used_by_bfd pointer of + a section to keep track of any per-section data. + The user_by_bfd pointer will be NULL if the information was not + needed. */ + +struct ecoff_section_tdata +{ + /* When producing an executable (i.e., final, non-relocatable link) + on the Alpha, we may need to use multiple global pointer values + to span the entire .lita section. In essence, we allow each + input .lita section to have its own gp value. To support this, + we need to keep track of the gp values that we picked for each + input .lita section . */ + bfd_vma gp; +}; + +/* An accessor macro for the ecoff_section_tdata structure. */ +#define ecoff_section_data(abfd, sec) \ + ((struct ecoff_section_tdata *) (sec)->used_by_bfd) + +/* ECOFF linker hash table entries. */ + +struct ecoff_link_hash_entry +{ + struct bfd_link_hash_entry root; + /* Symbol index in output file. */ + long indx; + /* BFD that ext field value came from. */ + bfd *abfd; + /* ECOFF external symbol information. */ + EXTR esym; + /* Nonzero if this symbol has been written out. */ + char written; + /* Nonzero if this symbol was referred to as small undefined. */ + char small; +}; + +/* ECOFF linker hash table. */ -/* Make an empty ECOFF symbol. */ -extern asymbol *ecoff_make_empty_symbol PARAMS ((bfd *abfd)); +struct ecoff_link_hash_table +{ + struct bfd_link_hash_table root; +}; + +/* Make an ECOFF object. */ +extern bfd_boolean _bfd_ecoff_mkobject (bfd *); /* Read in the ECOFF symbolic debugging information. */ -extern boolean ecoff_slurp_symbolic_info PARAMS ((bfd *)); +extern bfd_boolean _bfd_ecoff_slurp_symbolic_info + (bfd *, asection *, struct ecoff_debug_info *); /* Generic ECOFF BFD backend vectors. */ -extern unsigned int ecoff_get_symtab_upper_bound PARAMS ((bfd *abfd)); -extern unsigned int ecoff_get_symtab PARAMS ((bfd *abfd, - asymbol **alocation)); -extern void ecoff_get_symbol_info PARAMS ((bfd *abfd, - asymbol *symbol, - symbol_info *ret)); -extern void ecoff_print_symbol PARAMS ((bfd *abfd, PTR filep, - asymbol *symbol, - bfd_print_symbol_type how)); -extern unsigned int ecoff_canonicalize_reloc PARAMS ((bfd *abfd, - asection *section, - arelent **relptr, - asymbol **symbols)); -extern CONST struct reloc_howto_struct *ecoff_bfd_reloc_type_lookup - PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); -extern boolean ecoff_find_nearest_line PARAMS ((bfd *abfd, - asection *section, - asymbol **symbols, - bfd_vma offset, - CONST char **filename_ptr, - CONST char **fnname_ptr, - unsigned int *retline_ptr)); -extern boolean ecoff_bfd_seclet_link PARAMS ((bfd *abfd, PTR data, - boolean relocateable)); -extern boolean ecoff_set_arch_mach PARAMS ((bfd *abfd, - enum bfd_architecture arch, - unsigned long machine)); -extern int ecoff_sizeof_headers PARAMS ((bfd *abfd, boolean reloc)); -extern boolean ecoff_set_section_contents PARAMS ((bfd *abfd, - asection *section, - PTR location, - file_ptr offset, - bfd_size_type count)); -extern boolean ecoff_write_object_contents PARAMS ((bfd *abfd)); -extern boolean ecoff_slurp_armap PARAMS ((bfd *abfd)); -extern boolean ecoff_write_armap PARAMS ((bfd *abfd, unsigned int elength, - struct orl *map, - unsigned int orl_count, - int stridx)); -#define ecoff_slurp_extended_name_table _bfd_slurp_extended_name_table -extern bfd_target *ecoff_archive_p PARAMS ((bfd *abfd)); -#define ecoff_get_lineno \ - ((alent *(*) PARAMS ((bfd *, asymbol *))) bfd_nullvoidptr) -#define ecoff_truncate_arname bfd_dont_truncate_arname -#define ecoff_openr_next_archived_file bfd_generic_openr_next_archived_file -#define ecoff_generic_stat_arch_elt bfd_generic_stat_arch_elt -#define ecoff_get_section_contents bfd_generic_get_section_contents -#define ecoff_get_reloc_upper_bound coff_get_reloc_upper_bound -#define ecoff_close_and_cleanup bfd_generic_close_and_cleanup -#define ecoff_bfd_debug_info_start bfd_void -#define ecoff_bfd_debug_info_end bfd_void -#define ecoff_bfd_debug_info_accumulate \ - ((void (*) PARAMS ((bfd *, struct sec *))) bfd_void) -#define ecoff_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define ecoff_bfd_relax_section bfd_generic_relax_section -#define ecoff_bfd_make_debug_symbol \ - ((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr) + +extern bfd_boolean _bfd_ecoff_write_object_contents (bfd *); + +#define _bfd_ecoff_close_and_cleanup _bfd_generic_close_and_cleanup +#define _bfd_ecoff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info +extern bfd_boolean _bfd_ecoff_new_section_hook + (bfd *, asection *); +extern bfd_boolean _bfd_ecoff_get_section_contents + (bfd *, asection *, void * location, file_ptr, bfd_size_type); + +#define _bfd_ecoff_bfd_link_split_section _bfd_generic_link_split_section +#define _bfd_ecoff_bfd_link_check_relocs _bfd_generic_link_check_relocs + +extern bfd_boolean _bfd_ecoff_bfd_copy_private_bfd_data + (bfd *, bfd *); +#define _bfd_ecoff_bfd_copy_private_section_data \ + _bfd_generic_bfd_copy_private_section_data + +#define _bfd_ecoff_bfd_copy_private_symbol_data \ + _bfd_generic_bfd_copy_private_symbol_data + +#define _bfd_ecoff_bfd_copy_private_header_data \ + _bfd_generic_bfd_copy_private_header_data + +#define _bfd_ecoff_bfd_print_private_bfd_data \ + _bfd_generic_bfd_print_private_bfd_data + +#define _bfd_ecoff_bfd_merge_private_bfd_data \ + _bfd_generic_bfd_merge_private_bfd_data + +#define _bfd_ecoff_bfd_set_private_flags _bfd_generic_bfd_set_private_flags +extern bfd_boolean _bfd_ecoff_slurp_armap (bfd *); +#define _bfd_ecoff_slurp_extended_name_table _bfd_slurp_extended_name_table +#define _bfd_ecoff_construct_extended_name_table \ + _bfd_archive_bsd_construct_extended_name_table +#define _bfd_ecoff_truncate_arname bfd_dont_truncate_arname +extern bfd_boolean _bfd_ecoff_write_armap + (bfd *, unsigned int, struct orl *, unsigned int, int); +#define _bfd_ecoff_read_ar_hdr _bfd_generic_read_ar_hdr +#define _bfd_ecoff_write_ar_hdr _bfd_generic_write_ar_hdr +#define _bfd_ecoff_openr_next_archived_file \ + bfd_generic_openr_next_archived_file +#define _bfd_ecoff_get_elt_at_index _bfd_generic_get_elt_at_index +#define _bfd_ecoff_generic_stat_arch_elt bfd_generic_stat_arch_elt +#define _bfd_ecoff_update_armap_timestamp _bfd_bool_bfd_true +#define _bfd_ecoff_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false + +extern long _bfd_ecoff_get_symtab_upper_bound (bfd *); +extern long _bfd_ecoff_canonicalize_symtab (bfd *, asymbol **); +extern asymbol *_bfd_ecoff_make_empty_symbol (bfd *); +extern void _bfd_ecoff_print_symbol + (bfd *, void *, asymbol *, bfd_print_symbol_type); +extern void _bfd_ecoff_get_symbol_info + (bfd *, asymbol *, symbol_info *); +#define _bfd_ecoff_get_symbol_version_string \ + _bfd_nosymbols_get_symbol_version_string +extern bfd_boolean _bfd_ecoff_bfd_is_local_label_name + (bfd *, const char *); +#define _bfd_ecoff_get_lineno _bfd_nosymbols_get_lineno +extern bfd_boolean _bfd_ecoff_find_nearest_line + (bfd *, asymbol **, asection *, bfd_vma, + const char **, const char **, unsigned int *, unsigned int *); +#define _bfd_ecoff_find_line _bfd_nosymbols_find_line +#define _bfd_ecoff_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol +#define _bfd_ecoff_read_minisymbols _bfd_generic_read_minisymbols +#define _bfd_ecoff_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol +#define _bfd_ecoff_find_inliner_info _bfd_nosymbols_find_inliner_info + +#define _bfd_ecoff_get_reloc_upper_bound coff_get_reloc_upper_bound +extern long _bfd_ecoff_canonicalize_reloc + (bfd *, asection *, arelent **, asymbol **); +/* ecoff_bfd_reloc_type_lookup defined by backend. */ + +extern bfd_boolean _bfd_ecoff_set_arch_mach + (bfd *, enum bfd_architecture, unsigned long); +extern bfd_boolean _bfd_ecoff_set_section_contents + (bfd *, asection *, const void * location, file_ptr, bfd_size_type); + +extern int _bfd_ecoff_sizeof_headers (bfd *, struct bfd_link_info *); +/* ecoff_bfd_get_relocated_section_contents defined by backend. */ +/* ecoff_bfd_relax_section defined by backend. */ +extern struct bfd_link_hash_table *_bfd_ecoff_bfd_link_hash_table_create + (bfd *); +extern bfd_boolean _bfd_ecoff_bfd_link_add_symbols + (bfd *, struct bfd_link_info *); +#define _bfd_ecoff_bfd_link_just_syms _bfd_generic_link_just_syms +#define _bfd_ecoff_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type +extern bfd_boolean _bfd_ecoff_bfd_final_link + (bfd *, struct bfd_link_info *); /* Hook functions for the generic COFF section reading code. */ -extern asection *ecoff_make_section_hook PARAMS ((bfd *abfd, char *name)); -extern boolean ecoff_new_section_hook PARAMS ((bfd *abfd, - asection *section)); -#define ecoff_set_alignment_hook \ - ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void) -extern boolean ecoff_set_arch_mach_hook PARAMS ((bfd *abfd, PTR filehdr)); -extern long ecoff_sec_to_styp_flags PARAMS ((CONST char *name, - flagword flags)); -extern flagword ecoff_styp_to_sec_flags PARAMS ((bfd *abfd, PTR hdr)); -extern boolean ecoff_slurp_symbol_table PARAMS ((bfd *abfd)); + +extern void * _bfd_ecoff_mkobject_hook (bfd *, void *, void *); +extern void _bfd_ecoff_set_alignment_hook + (bfd *, asection *, void *); +extern bfd_boolean _bfd_ecoff_set_arch_mach_hook + (bfd *, void *); +extern bfd_boolean _bfd_ecoff_no_long_sections + (bfd *abfd, int enable); +extern bfd_boolean _bfd_ecoff_styp_to_sec_flags + (bfd *, void *, const char *, asection *, flagword *); +extern bfd_boolean _bfd_ecoff_slurp_symbol_table (bfd *); + +/* ECOFF auxiliary information swapping routines. These are the same + for all ECOFF targets, so they are defined in ecofflink.c. */ + +extern void _bfd_ecoff_swap_tir_in + (int, const struct tir_ext *, TIR *); +extern void _bfd_ecoff_swap_tir_out + (int, const TIR *, struct tir_ext *); +extern void _bfd_ecoff_swap_rndx_in + (int, const struct rndx_ext *, RNDXR *); +extern void _bfd_ecoff_swap_rndx_out + (int, const RNDXR *, struct rndx_ext *);