* coffcode.h (bfd_coff_backend_data): Add new field
authorIan Lance Taylor <ian@airs.com>
Tue, 7 Mar 1995 19:56:31 +0000 (19:56 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 7 Mar 1995 19:56:31 +0000 (19:56 +0000)
_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
bfd/coff-a29k.c
bfd/coffcode.h

index 67e6087ab1a8a29858848ca513f553e7634e6c0d..0c6df02df4666100170fd59281eafd9377db3bd2 100644 (file)
@@ -1,5 +1,17 @@
 Tue Mar  7 12:23:47 1995  Ian Lance Taylor  <ian@cygnus.com>
 
+       * 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.
 
index 35c748a9564f5a06ef94823c7e3acbd45e619588..db294991c50f1a5081c1946c69ff032eeb89f7ac 100644 (file)
@@ -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 =
index 4c3850d7134eba59c6518055570fa4c84620ed81..feca75850f3c8fe1cd4b9024908504c151d7dd49 100644 (file)
@@ -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