From f135c692723ff3b1513345b1379fcfa0b7e40239 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 7 Mar 1995 19:56:31 +0000 Subject: [PATCH] * coffcode.h (bfd_coff_backend_data): Add new field _bfd_coff_adjust_symndx. (bfd_coff_adjust_symndx): Define. (coff_adjust_symndx): Define as NULL if not already defined. (bfd_coff_std_swap_table): Initialize new field to coff_adjust_symndx. * cofflink.c (coff_link_input_bfd): Call coff_adjust_symndx if it is defined. * coff-a29k.c (coff_a29k_adjust_symndx): New static function. (coff_adjust_symndx): Define before including coffcode.h. * libcoff.h: Rebuild. --- bfd/ChangeLog | 12 ++++++ bfd/coff-a29k.c | 25 ++++++++++++ bfd/coffcode.h | 106 ++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 127 insertions(+), 16 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 67e6087ab1a..0c6df02df46 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,17 @@ Tue Mar 7 12:23:47 1995 Ian Lance Taylor + * coffcode.h (bfd_coff_backend_data): Add new field + _bfd_coff_adjust_symndx. + (bfd_coff_adjust_symndx): Define. + (coff_adjust_symndx): Define as NULL if not already defined. + (bfd_coff_std_swap_table): Initialize new field to + coff_adjust_symndx. + * cofflink.c (coff_link_input_bfd): Call coff_adjust_symndx if it + is defined. + * coff-a29k.c (coff_a29k_adjust_symndx): New static function. + (coff_adjust_symndx): Define before including coffcode.h. + * libcoff.h: Rebuild. + * format.c (bfd_check_format_matches): Skip binary_vec when searching through bfd_target_vector. diff --git a/bfd/coff-a29k.c b/bfd/coff-a29k.c index 35c748a9564..db294991c50 100644 --- a/bfd/coff-a29k.c +++ b/bfd/coff-a29k.c @@ -34,6 +34,9 @@ static bfd_reloc_status_type a29k_reloc static boolean coff_a29k_relocate_section PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, struct internal_reloc *, struct internal_syment *, asection **)); +static boolean coff_a29k_adjust_symndx + PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, + struct internal_reloc *, boolean *)); #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2) @@ -537,6 +540,28 @@ coff_a29k_relocate_section (output_bfd, info, input_bfd, input_section, #define coff_relocate_section coff_a29k_relocate_section +/* We don't want to change the symndx of a R_IHCONST reloc, since it + is actually an addend, not a symbol index at all. */ + +/*ARGSUSED*/ +static boolean +coff_a29k_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp) + bfd *obfd; + struct bfd_link_info *info; + bfd *ibfd; + asection *sec; + struct internal_reloc *irel; + boolean *adjustedp; +{ + if (irel->r_type == R_IHCONST) + *adjustedp = true; + else + *adjustedp = false; + return true; +} + +#define coff_adjust_symndx coff_a29k_adjust_symndx + #include "coffcode.h" const bfd_target a29kcoff_big_vec = diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 4c3850d7134..feca75850f3 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -1,5 +1,5 @@ /* Support for the generic parts of most COFF variants, for BFD. - Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. + Copyright 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -527,7 +527,7 @@ styp_to_sec_flags (abfd, hdr, name) return (sec_flags); } -#define get_index(symbol) ((long) (symbol)->udata) +#define get_index(symbol) ((symbol)->udata.i) /* INTERNAL_DEFINITION @@ -681,6 +681,20 @@ dependent COFF routines: . struct internal_reloc *relocs, . struct internal_syment *syms, . asection **sections)); +. reloc_howto_type *(*_bfd_coff_rtype_to_howto) PARAMS (( +. bfd *abfd, +. asection *sec, +. struct internal_reloc *rel, +. struct coff_link_hash_entry *h, +. struct internal_syment *sym, +. bfd_vma *addendp)); +. boolean (*_bfd_coff_adjust_symndx) PARAMS (( +. bfd *obfd, +. struct bfd_link_info *info, +. bfd *ibfd, +. asection *sec, +. struct internal_reloc *reloc, +. boolean *adjustedp)); . .} bfd_coff_backend_data; . @@ -778,6 +792,12 @@ dependent COFF routines: .#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\ . ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\ . (obfd, info, ibfd, o, con, rel, isyms, secs)) +.#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\ +. ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\ +. (abfd, sec, rel, h, sym, addendp)) +.#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\ +. ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\ +. (obfd, info, ibfd, sec, rel, adjustedp)) . */ @@ -836,7 +856,8 @@ coff_new_section_hook (abfd, section) bfd * abfd; asection * section; { - section->alignment_power = abfd->xvec->align_power_min; + section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER; + /* Allocate aux records for section symbols, to store size and related info. @@ -845,17 +866,20 @@ coff_new_section_hook (abfd, section) (combined_entry_type *) bfd_zalloc (abfd, sizeof (combined_entry_type) * 10); -#ifdef COFF_SPARC - /* This is to allow double-word operations on addresses in data or bss. */ - if (strcmp (section->name, ".data") == 0 - || strcmp (section->name, ".bss") == 0) - section->alignment_power = 3; -#endif /* COFF_SPARC */ + /* The .stab section must be aligned to 2**2 at most, because + otherwise there may be gaps in the section which gdb will not + know how to interpret. Examining the section name is a hack, but + that is also how gdb locates the section. We also align the + .stabstr section this way for backward compatibility, although I + believe it would work anyhow. */ + if (COFF_DEFAULT_SECTION_ALIGNMENT_POWER > 2 + && (strcmp (section->name, ".stab") == 0 + || strcmp (section->name, ".stabstr") == 0)) + section->alignment_power = 2; return true; } - #ifdef I960 /* Set the alignment of a BFD section. */ @@ -1086,8 +1110,9 @@ coff_set_arch_mach_hook (abfd, filehdr) break; #endif -#ifdef SH_ARCH_MAGIC - case SH_ARCH_MAGIC: +#ifdef SH_ARCH_MAGIC_BIG + case SH_ARCH_MAGIC_BIG: + case SH_ARCH_MAGIC_LITTLE: arch = bfd_arch_sh; machine = 0; break; @@ -1332,9 +1357,12 @@ coff_set_flags (abfd, magicp, flagsp) break; #endif -#ifdef SH_ARCH_MAGIC +#ifdef SH_ARCH_MAGIC_BIG case bfd_arch_sh: - *magicp = SH_ARCH_MAGIC; + if (abfd->xvec->byteorder_big_p) + *magicp = SH_ARCH_MAGIC_BIG; + else + *magicp = SH_ARCH_MAGIC_LITTLE; return true; break; #endif @@ -2309,7 +2337,7 @@ coff_slurp_symbol_table (abfd) dst->native = src; - dst->symbol.udata = 0; + dst->symbol.udata.i = 0; dst->lineno = (alent *) NULL; this_index += (src->u.syment.n_numaux) + 1; dst++; @@ -2518,6 +2546,42 @@ coff_slurp_reloc_table (abfd, asect, symbols) return true; } +#ifndef coff_rtype_to_howto +#ifdef RTYPE2HOWTO + +/* Get the howto structure for a reloc. This is only used if the file + including this one defines coff_relocate_section to be + _bfd_coff_generic_relocate_section, so it is OK if it does not + always work. It is the responsibility of the including file to + make sure it is reasonable if it is needed. */ + +static reloc_howto_type *coff_rtype_to_howto + PARAMS ((bfd *, asection *, struct internal_reloc *, + struct coff_link_hash_entry *, struct internal_syment *, + bfd_vma *)); + +/*ARGSUSED*/ +static reloc_howto_type * +coff_rtype_to_howto (abfd, sec, rel, h, sym, addendp) + bfd *abfd; + asection *sec; + struct internal_reloc *rel; + struct coff_link_hash_entry *h; + struct internal_syment *sym; + bfd_vma *addendp; +{ + arelent genrel; + + RTYPE2HOWTO (&genrel, rel); + return genrel.howto; +} + +#else /* ! defined (RTYPE2HOWTO) */ + +#define coff_rtype_to_howto NULL + +#endif /* ! defined (RTYPE2HOWTO) */ +#endif /* ! defined (coff_rtype_to_howto) */ /* This is stupid. This function should be a boolean predicate. */ static long @@ -2607,9 +2671,15 @@ dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr, /* If coff_relocate_section is defined, we can use the optimized COFF backend linker. Otherwise we must continue to use the old linker. */ #ifdef coff_relocate_section +#ifndef coff_bfd_link_hash_table_create #define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create +#endif +#ifndef coff_bfd_link_add_symbols #define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols +#endif +#ifndef coff_bfd_final_link #define coff_bfd_final_link _bfd_coff_final_link +#endif #else /* ! defined (coff_relocate_section) */ #define coff_relocate_section NULL #define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create @@ -2617,6 +2687,10 @@ dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr, #define coff_bfd_final_link _bfd_generic_final_link #endif /* ! defined (coff_relocate_section) */ +#ifndef coff_adjust_symndx +#define coff_adjust_symndx NULL +#endif + static CONST bfd_coff_backend_data bfd_coff_std_swap_table = { coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in, @@ -2636,7 +2710,7 @@ static CONST bfd_coff_backend_data bfd_coff_std_swap_table = coff_set_alignment_hook, coff_slurp_symbol_table, symname_in_debug_hook, coff_reloc16_extra_cases, coff_reloc16_estimate, coff_sym_is_global, coff_compute_section_file_positions, - coff_relocate_section + coff_relocate_section, coff_rtype_to_howto, coff_adjust_symndx }; #define coff_close_and_cleanup _bfd_generic_close_and_cleanup -- 2.30.2