Add SH ELF support.
authorIan Lance Taylor <ian@airs.com>
Fri, 30 Aug 1996 22:09:51 +0000 (22:09 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 30 Aug 1996 22:09:51 +0000 (22:09 +0000)
* elf32-sh.c: New file.
* elf.c (prep_headers): Handle bfd_arch_sh.
* elfcode.h (write_relocs): Handle absolute symbol.
* elf-bfd.h (_bfd_elf32_link_read_relocs): Declare.
(_bfd_elf64_link_read_relocs): Declare.
* elflink.h (NAME(_bfd_elf,link_read_relocs)): Rename from
elf_link_read_relocs.  Make globally visible.  Change all
callers.
(elf_link_input_bfd): Get external symbols from cache in
symtab_hdr->contents.  Get contents from cache in
elf_section_data.
* elfxx-target.h (bfD_elfNN_bfd_relax_section): Only define if not
already defined.
* reloc.c: Define BFD_RELOC_SH_* relocs.
* libbfd-in.h (_bfd_sh_align_load_span): Declare.
* coff-sh.c (sh_insns_conflict): Fix a return value.
(_bfd_sh_align_load_span): New globally visible function, broken
out of sh_align_load.
(sh_align_load): Call _bfd_sh_align_load_span.
(sh_swap_insns): Change relocs parameter to PTR.
* bfd-in2.h, libbfd.h: Rebuild.
* targets.c (bfd_elf32_sh_vec): Declare.
(bfd_elf32_shl_vec): Declare.
* config.bfd (sh-*-elf*): New target.
* configure.in (bfd_elf32_sh_vec): New target vector.
(bfd_elf32_shl_vec): New target vector.
* configure: Rebuild.
* Makefile.in: Rebuild dependencies.
  (BFD32_BACKENDS): Add elf32-sh.o.
(BFD32_BACKENDS_CFILES): Add elf32-sh.c.

* elf.c (map_sections_to_segments): Check that LMA does not skip a
page before checking D_PAGED.

bfd/.Sanitize
bfd/ChangeLog
bfd/bfd-in2.h
bfd/elflink.h
bfd/libbfd.h
bfd/reloc.c

index a35622179d82bb01b77c172834ba50d0ecd7a9f9..2113c3876533b084d982ca33a1ed25bf825ba3ce 100644 (file)
@@ -153,6 +153,7 @@ elf32-m68k.c
 elf32-m88k.c
 elf32-mips.c
 elf32-ppc.c
 elf32-m88k.c
 elf32-mips.c
 elf32-ppc.c
+elf32-sh.c
 elf32-sparc.c
 elf32.c
 elf64-alpha.c
 elf32-sparc.c
 elf32.c
 elf64-alpha.c
index 7d810188bc6f2060c16af605a3177bf7ba4f7b0f..5f058e165f63330ba85228343c3ead55ceff3d77 100644 (file)
@@ -1,5 +1,40 @@
 Fri Aug 30 11:49:19 1996  Ian Lance Taylor  <ian@cygnus.com>
 
 Fri Aug 30 11:49:19 1996  Ian Lance Taylor  <ian@cygnus.com>
 
+       Add SH ELF support.
+       * elf32-sh.c: New file.
+       * elf.c (prep_headers): Handle bfd_arch_sh.
+       * elfcode.h (write_relocs): Handle absolute symbol.
+       * elf-bfd.h (_bfd_elf32_link_read_relocs): Declare.
+       (_bfd_elf64_link_read_relocs): Declare.
+       * elflink.h (NAME(_bfd_elf,link_read_relocs)): Rename from
+       elf_link_read_relocs.  Make globally visible.  Change all
+       callers.
+       (elf_link_input_bfd): Get external symbols from cache in
+       symtab_hdr->contents.  Get contents from cache in
+       elf_section_data.
+       * elfxx-target.h (bfD_elfNN_bfd_relax_section): Only define if not
+       already defined.
+       * reloc.c: Define BFD_RELOC_SH_* relocs.
+       * libbfd-in.h (_bfd_sh_align_load_span): Declare.
+       * coff-sh.c (sh_insns_conflict): Fix a return value.
+       (_bfd_sh_align_load_span): New globally visible function, broken
+       out of sh_align_load.
+       (sh_align_load): Call _bfd_sh_align_load_span.
+       (sh_swap_insns): Change relocs parameter to PTR.
+       * bfd-in2.h, libbfd.h: Rebuild.
+       * targets.c (bfd_elf32_sh_vec): Declare.
+       (bfd_elf32_shl_vec): Declare.
+       * config.bfd (sh-*-elf*): New target.
+       * configure.in (bfd_elf32_sh_vec): New target vector.
+       (bfd_elf32_shl_vec): New target vector.
+       * configure: Rebuild.
+       * Makefile.in: Rebuild dependencies.
+       (BFD32_BACKENDS): Add elf32-sh.o.
+       (BFD32_BACKENDS_CFILES): Add elf32-sh.c.
+
+       * elf.c (map_sections_to_segments): Check that LMA does not skip a
+       page before checking D_PAGED.
+
        * ihex.c (ihex_scan): Removed unnecessary extbase variable.
        (ihex_write_object_contents): Remove extbase; always use segbase
        instead.
        * ihex.c (ihex_scan): Removed unnecessary extbase variable.
        (ihex_write_object_contents): Remove extbase; always use segbase
        instead.
index f4c273f02ed8dd66d3557e5728935ff807eedd92..0ab5432f9b37600cdfd77ffdfb590c5ecff04838 100644 (file)
@@ -1216,6 +1216,9 @@ enum bfd_architecture
   bfd_arch_arm,        /* Advanced Risc Machines ARM */
   bfd_arch_ns32k,      /* National Semiconductors ns32000 */
   bfd_arch_w65,        /* WDC 65816 */
   bfd_arch_arm,        /* Advanced Risc Machines ARM */
   bfd_arch_ns32k,      /* National Semiconductors ns32000 */
   bfd_arch_w65,        /* WDC 65816 */
+  /* start-sanitize-v850 */
+  bfd_arch_v850,       /* NEC V850 */
+  /* end-sanitize-v850 */
   /* start-sanitize-arc */
   bfd_arch_arc,        /* Argonaut RISC Core */
 #define bfd_mach_arc_base 0
   /* start-sanitize-arc */
   bfd_arch_arc,        /* Argonaut RISC Core */
 #define bfd_mach_arc_base 0
@@ -1765,6 +1768,30 @@ not stored in the instruction. */
   BFD_RELOC_ARM_IN_POOL,
   BFD_RELOC_ARM_OFFSET_IMM8,
   BFD_RELOC_ARM_HWLITERAL,
   BFD_RELOC_ARM_IN_POOL,
   BFD_RELOC_ARM_OFFSET_IMM8,
   BFD_RELOC_ARM_HWLITERAL,
+  BFD_RELOC_ARM_THUMB_ADD,
+  BFD_RELOC_ARM_THUMB_IMM,
+  BFD_RELOC_ARM_THUMB_SHIFT,
+  BFD_RELOC_ARM_THUMB_OFFSET,
+
+/* Hitachi SH relocs.  Not all of these appear in object files. */
+  BFD_RELOC_SH_PCDISP8BY2,
+  BFD_RELOC_SH_PCDISP12BY2,
+  BFD_RELOC_SH_IMM4,
+  BFD_RELOC_SH_IMM4BY2,
+  BFD_RELOC_SH_IMM4BY4,
+  BFD_RELOC_SH_IMM8,
+  BFD_RELOC_SH_IMM8BY2,
+  BFD_RELOC_SH_IMM8BY4,
+  BFD_RELOC_SH_PCRELIMM8BY2,
+  BFD_RELOC_SH_PCRELIMM8BY4,
+  BFD_RELOC_SH_SWITCH16,
+  BFD_RELOC_SH_SWITCH32,
+  BFD_RELOC_SH_USES,
+  BFD_RELOC_SH_COUNT,
+  BFD_RELOC_SH_ALIGN,
+  BFD_RELOC_SH_CODE,
+  BFD_RELOC_SH_DATA,
+  BFD_RELOC_SH_LABEL,
 /* start-sanitize-arc */
 
 /* Argonaut RISC Core (ARC) relocs.
 /* start-sanitize-arc */
 
 /* Argonaut RISC Core (ARC) relocs.
@@ -1802,6 +1829,10 @@ assumed to be 0. */
   BFD_RELOC_D10V_18_PCREL,
 /* end-sanitize-d10v */
 
   BFD_RELOC_D10V_18_PCREL,
 /* end-sanitize-d10v */
 
+/* NEC V850 relocs. */
+  BFD_RELOC_V850_9_PCREL,
+  BFD_RELOC_V850_22_PCREL,
+
   BFD_RELOC_UNUSED };
 typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
 reloc_howto_type *
   BFD_RELOC_UNUSED };
 typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
 reloc_howto_type *
index 27398a4c6dc138f147ada727395dd8aac5a7cc82..6326121dcd7da50deb9aaf86422a46a39ccdc390 100644 (file)
@@ -23,8 +23,6 @@ static boolean elf_link_add_object_symbols
   PARAMS ((bfd *, struct bfd_link_info *));
 static boolean elf_link_add_archive_symbols
   PARAMS ((bfd *, struct bfd_link_info *));
   PARAMS ((bfd *, struct bfd_link_info *));
 static boolean elf_link_add_archive_symbols
   PARAMS ((bfd *, struct bfd_link_info *));
-static Elf_Internal_Rela *elf_link_read_relocs
-  PARAMS ((bfd *, asection *, PTR, Elf_Internal_Rela *, boolean));
 static boolean elf_export_symbol
   PARAMS ((struct elf_link_hash_entry *, PTR));
 static boolean elf_adjust_dynamic_symbol
 static boolean elf_export_symbol
   PARAMS ((struct elf_link_hash_entry *, PTR));
 static boolean elf_adjust_dynamic_symbol
@@ -961,9 +959,10 @@ elf_link_add_object_symbols (abfd, info)
          if ((o->flags & SEC_ALLOC) == 0)
            continue;
 
          if ((o->flags & SEC_ALLOC) == 0)
            continue;
 
-         internal_relocs = elf_link_read_relocs (abfd, o, (PTR) NULL,
-                                                 (Elf_Internal_Rela *) NULL,
-                                                 info->keep_memory);
+         internal_relocs = (NAME(_bfd_elf,link_read_relocs)
+                            (abfd, o, (PTR) NULL,
+                             (Elf_Internal_Rela *) NULL,
+                             info->keep_memory));
          if (internal_relocs == NULL)
            goto error_return;
 
          if (internal_relocs == NULL)
            goto error_return;
 
@@ -1163,8 +1162,9 @@ elf_add_dynamic_entry (info, tag, val)
    value is allocated using either malloc or bfd_alloc, according to
    the KEEP_MEMORY argument.  */
 
    value is allocated using either malloc or bfd_alloc, according to
    the KEEP_MEMORY argument.  */
 
-static Elf_Internal_Rela *
-elf_link_read_relocs (abfd, o, external_relocs, internal_relocs, keep_memory)
+Elf_Internal_Rela *
+NAME(_bfd_elf,link_read_relocs) (abfd, o, external_relocs, internal_relocs,
+                                keep_memory)
      bfd *abfd;
      asection *o;
      PTR external_relocs;
      bfd *abfd;
      asection *o;
      PTR external_relocs;
@@ -2728,6 +2728,7 @@ elf_link_input_bfd (finfo, input_bfd)
   Elf_Internal_Shdr *symtab_hdr;
   size_t locsymcount;
   size_t extsymoff;
   Elf_Internal_Shdr *symtab_hdr;
   size_t locsymcount;
   size_t extsymoff;
+  Elf_External_Sym *external_syms;
   Elf_External_Sym *esym;
   Elf_External_Sym *esymend;
   Elf_Internal_Sym *isym;
   Elf_External_Sym *esym;
   Elf_External_Sym *esymend;
   Elf_Internal_Sym *isym;
@@ -2758,16 +2759,23 @@ elf_link_input_bfd (finfo, input_bfd)
     }
 
   /* Read the local symbols.  */
     }
 
   /* Read the local symbols.  */
-  if (locsymcount > 0
-      && (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
-         || (bfd_read (finfo->external_syms, sizeof (Elf_External_Sym),
+  if (symtab_hdr->contents != NULL)
+    external_syms = (Elf_External_Sym *) symtab_hdr->contents;
+  else if (locsymcount == 0)
+    external_syms = NULL;
+  else
+    {
+      external_syms = finfo->external_syms;
+      if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
+         || (bfd_read (external_syms, sizeof (Elf_External_Sym),
                        locsymcount, input_bfd)
                        locsymcount, input_bfd)
-             != locsymcount * sizeof (Elf_External_Sym))))
-    return false;
+             != locsymcount * sizeof (Elf_External_Sym)))
+       return false;
+    }
 
   /* Swap in the local symbols and write out the ones which we know
      are going into the output file.  */
 
   /* Swap in the local symbols and write out the ones which we know
      are going into the output file.  */
-  esym = finfo->external_syms;
+  esym = external_syms;
   esymend = esym + locsymcount;
   isym = finfo->internal_syms;
   pindex = finfo->indices;
   esymend = esym + locsymcount;
   isym = finfo->internal_syms;
   pindex = finfo->indices;
@@ -2807,7 +2815,7 @@ elf_link_input_bfd (finfo, input_bfd)
       *ppsection = isec;
 
       /* Don't output the first, undefined, symbol.  */
       *ppsection = isec;
 
       /* Don't output the first, undefined, symbol.  */
-      if (esym == finfo->external_syms)
+      if (esym == external_syms)
        continue;
 
       /* If we are stripping all symbols, we don't want to output this
        continue;
 
       /* If we are stripping all symbols, we don't want to output this
@@ -2873,6 +2881,8 @@ elf_link_input_bfd (finfo, input_bfd)
   /* Relocate the contents of each section.  */
   for (o = input_bfd->sections; o != NULL; o = o->next)
     {
   /* Relocate the contents of each section.  */
   for (o = input_bfd->sections; o != NULL; o = o->next)
     {
+      bfd_byte *contents;
+
       if (! o->linker_mark)
        {
          /* This section was omitted from the link.  */
       if (! o->linker_mark)
        {
          /* This section was omitted from the link.  */
@@ -2891,20 +2901,28 @@ elf_link_input_bfd (finfo, input_bfd)
          continue;
        }
 
          continue;
        }
 
-      /* Read the contents of the section.  */
-      if (! bfd_get_section_contents (input_bfd, o, finfo->contents,
-                                     (file_ptr) 0, o->_raw_size))
-       return false;
+      /* Get the contents of the section.  They have been cached by a
+         relaxation routine.  Note that o is a section in an input
+         file, so the contents field will not have been set by any of
+         the routines which work on output files.  */
+      if (elf_section_data (o)->this_hdr.contents != NULL)
+       contents = elf_section_data (o)->this_hdr.contents;
+      else
+       {
+         contents = finfo->contents;
+         if (! bfd_get_section_contents (input_bfd, o, contents,
+                                         (file_ptr) 0, o->_raw_size))
+           return false;
+       }
 
       if ((o->flags & SEC_RELOC) != 0)
        {
          Elf_Internal_Rela *internal_relocs;
 
          /* Get the swapped relocs.  */
 
       if ((o->flags & SEC_RELOC) != 0)
        {
          Elf_Internal_Rela *internal_relocs;
 
          /* Get the swapped relocs.  */
-         internal_relocs = elf_link_read_relocs (input_bfd, o,
-                                                 finfo->external_relocs,
-                                                 finfo->internal_relocs,
-                                                 false);
+         internal_relocs = (NAME(_bfd_elf,link_read_relocs)
+                            (input_bfd, o, finfo->external_relocs,
+                             finfo->internal_relocs, false));
          if (internal_relocs == NULL
              && o->reloc_count > 0)
            return false;
          if (internal_relocs == NULL
              && o->reloc_count > 0)
            return false;
@@ -2930,8 +2948,7 @@ elf_link_input_bfd (finfo, input_bfd)
             the addend to be adjusted.  */
 
          if (! (*relocate_section) (output_bfd, finfo->info,
             the addend to be adjusted.  */
 
          if (! (*relocate_section) (output_bfd, finfo->info,
-                                    input_bfd, o,
-                                    finfo->contents,
+                                    input_bfd, o, contents,
                                     internal_relocs,
                                     finfo->internal_syms,
                                     finfo->sections))
                                     internal_relocs,
                                     finfo->internal_syms,
                                     finfo->sections))
@@ -3104,7 +3121,7 @@ elf_link_input_bfd (finfo, input_bfd)
       if (elf_section_data (o)->stab_info == NULL)
        {
          if (! bfd_set_section_contents (output_bfd, o->output_section,
       if (elf_section_data (o)->stab_info == NULL)
        {
          if (! bfd_set_section_contents (output_bfd, o->output_section,
-                                         finfo->contents, o->output_offset,
+                                         contents, o->output_offset,
                                          (o->_cooked_size != 0
                                           ? o->_cooked_size
                                           : o->_raw_size)))
                                          (o->_cooked_size != 0
                                           ? o->_cooked_size
                                           : o->_raw_size)))
@@ -3114,7 +3131,7 @@ elf_link_input_bfd (finfo, input_bfd)
        {
          if (! _bfd_write_section_stabs (output_bfd, o,
                                          &elf_section_data (o)->stab_info,
        {
          if (! _bfd_write_section_stabs (output_bfd, o,
                                          &elf_section_data (o)->stab_info,
-                                         finfo->contents))
+                                         contents))
            return false;
        }
     }
            return false;
        }
     }
index eb34a4392267d3034ff1f2d72e909cde04eaad39..28ce15bb4eeb151af14a58988111fe628d6c28c3 100644 (file)
@@ -506,6 +506,14 @@ extern boolean _bfd_ecoff_get_accumulated_ss PARAMS ((PTR, bfd_byte *));
 extern bfd_vma _bfd_get_gp_value PARAMS ((bfd *));
 extern void _bfd_set_gp_value PARAMS ((bfd *, bfd_vma));
 
 extern bfd_vma _bfd_get_gp_value PARAMS ((bfd *));
 extern void _bfd_set_gp_value PARAMS ((bfd *, bfd_vma));
 
+/* Function shared by the COFF and ELF SH backends, which have no
+   other common header files.  */
+
+extern boolean _bfd_sh_align_load_span
+  PARAMS ((bfd *, asection *, bfd_byte *,
+          boolean (*) (bfd *, asection *, PTR, bfd_byte *, bfd_vma),
+          PTR, bfd_vma **, bfd_vma *, bfd_vma, bfd_vma, boolean *));
+
 /* And more follows */
 
 void 
 /* And more follows */
 
 void 
@@ -703,6 +711,28 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_ARM_IN_POOL",
   "BFD_RELOC_ARM_OFFSET_IMM8",
   "BFD_RELOC_ARM_HWLITERAL",
   "BFD_RELOC_ARM_IN_POOL",
   "BFD_RELOC_ARM_OFFSET_IMM8",
   "BFD_RELOC_ARM_HWLITERAL",
+  "BFD_RELOC_ARM_THUMB_ADD",
+  "BFD_RELOC_ARM_THUMB_IMM",
+  "BFD_RELOC_ARM_THUMB_SHIFT",
+  "BFD_RELOC_ARM_THUMB_OFFSET",
+  "BFD_RELOC_SH_PCDISP8BY2",
+  "BFD_RELOC_SH_PCDISP12BY2",
+  "BFD_RELOC_SH_IMM4",
+  "BFD_RELOC_SH_IMM4BY2",
+  "BFD_RELOC_SH_IMM4BY4",
+  "BFD_RELOC_SH_IMM8",
+  "BFD_RELOC_SH_IMM8BY2",
+  "BFD_RELOC_SH_IMM8BY4",
+  "BFD_RELOC_SH_PCRELIMM8BY2",
+  "BFD_RELOC_SH_PCRELIMM8BY4",
+  "BFD_RELOC_SH_SWITCH16",
+  "BFD_RELOC_SH_SWITCH32",
+  "BFD_RELOC_SH_USES",
+  "BFD_RELOC_SH_COUNT",
+  "BFD_RELOC_SH_ALIGN",
+  "BFD_RELOC_SH_CODE",
+  "BFD_RELOC_SH_DATA",
+  "BFD_RELOC_SH_LABEL",
 /* start-sanitize-arc */
   "BFD_RELOC_ARC_B22_PCREL",
   "BFD_RELOC_ARC_B26",
 /* start-sanitize-arc */
   "BFD_RELOC_ARC_B22_PCREL",
   "BFD_RELOC_ARC_B26",
index d5575ce8c82920d269c472964c07febee0ba4c0f..4b3e0ee4b4aa3d3521504b46344ed5103f686c76 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD support for handling relocation entries.
 /* BFD support for handling relocation entries.
-   Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
+   Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
    Written by Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -2149,10 +2149,57 @@ ENUMX
   BFD_RELOC_ARM_OFFSET_IMM8
 ENUMX
   BFD_RELOC_ARM_HWLITERAL
   BFD_RELOC_ARM_OFFSET_IMM8
 ENUMX
   BFD_RELOC_ARM_HWLITERAL
+ENUMX
+  BFD_RELOC_ARM_THUMB_ADD
+ENUMX
+  BFD_RELOC_ARM_THUMB_IMM
+ENUMX
+  BFD_RELOC_ARM_THUMB_SHIFT
+ENUMX
+  BFD_RELOC_ARM_THUMB_OFFSET
 ENUMDOC
   These relocs are only used within the ARM assembler.  They are not
   (at present) written to any object files.
 
 ENUMDOC
   These relocs are only used within the ARM assembler.  They are not
   (at present) written to any object files.
 
+ENUM
+  BFD_RELOC_SH_PCDISP8BY2
+ENUMX
+  BFD_RELOC_SH_PCDISP12BY2
+ENUMX
+  BFD_RELOC_SH_IMM4
+ENUMX
+  BFD_RELOC_SH_IMM4BY2
+ENUMX
+  BFD_RELOC_SH_IMM4BY4
+ENUMX
+  BFD_RELOC_SH_IMM8
+ENUMX
+  BFD_RELOC_SH_IMM8BY2
+ENUMX
+  BFD_RELOC_SH_IMM8BY4
+ENUMX
+  BFD_RELOC_SH_PCRELIMM8BY2
+ENUMX
+  BFD_RELOC_SH_PCRELIMM8BY4
+ENUMX
+  BFD_RELOC_SH_SWITCH16
+ENUMX
+  BFD_RELOC_SH_SWITCH32
+ENUMX
+  BFD_RELOC_SH_USES
+ENUMX
+  BFD_RELOC_SH_COUNT
+ENUMX
+  BFD_RELOC_SH_ALIGN
+ENUMX
+  BFD_RELOC_SH_CODE
+ENUMX
+  BFD_RELOC_SH_DATA
+ENUMX
+  BFD_RELOC_SH_LABEL
+ENUMDOC
+  Hitachi SH relocs.  Not all of these appear in object files.
+
 COMMENT
 {* start-sanitize-arc *}
 ENUM
 COMMENT
 {* start-sanitize-arc *}
 ENUM