2001-03-20 Michael Chastain <chastain@redhat.com>
[deliverable/binutils-gdb.git] / bfd / elf32-mcore.c
index 6a8b70a443a2f0b462ba42e7f76c1240e2fe20a0..e4b5cd917ac139ab1d8de31c14bfb3fc4025f6ea 100644 (file)
@@ -1,5 +1,5 @@
 /* Motorola MCore specific support for 32-bit ELF
-   Copyright 1994, 1995, 1999 Free Software Foundation, Inc.
+   Copyright 1994, 1995, 1999, 2000, 2001 Free Software Foundation, Inc.
 
 This file is part of BFD, the Binary File Descriptor library.
 
@@ -29,7 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include <assert.h>
 
 #define        USE_RELA        /* Only USE_REL is actually significant, but this is
-                          here are a reminder... */
+                          here are a reminder...  */
 
 static void mcore_elf_howto_init
   PARAMS ((void));
@@ -84,7 +84,7 @@ static reloc_howto_type mcore_elf_howto_raw[] =
         false),                /* pcrel_offset */
 
   /* 8 bits + 2 zero bits; jmpi/jsri/lrw instructions.
-     Should not appear in object files. */
+     Should not appear in object files.  */
   HOWTO (R_MCORE_PCRELIMM8BY4, /* type */
         2,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
@@ -99,7 +99,7 @@ static reloc_howto_type mcore_elf_howto_raw[] =
         0,                     /* dst_mask */
         true),                 /* pcrel_offset */
 
-  /* bsr/bt/bf/br instructions; 11 bits + 1 zero bit 
+  /* bsr/bt/bf/br instructions; 11 bits + 1 zero bit
      Span 2k instructions == 4k bytes.
      Only useful pieces at the relocated address are the opcode (5 bits) */
   HOWTO (R_MCORE_PCRELIMM11BY2,/* type */
@@ -116,7 +116,7 @@ static reloc_howto_type mcore_elf_howto_raw[] =
         0x7ff,                 /* dst_mask */
         true),                 /* pcrel_offset */
 
-  /* 4 bits + 1 zero bit; 'loopt' instruction only; unsupported. */
+  /* 4 bits + 1 zero bit; 'loopt' instruction only; unsupported.  */
   HOWTO (R_MCORE_PCRELIMM4BY2, /* type */
         1,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
@@ -131,7 +131,7 @@ static reloc_howto_type mcore_elf_howto_raw[] =
         0,                     /* dst_mask */
         true),                 /* pcrel_offset */
 
-  /* 32-bit pc-relative. Eventually this will help support PIC code. */
+  /* 32-bit pc-relative. Eventually this will help support PIC code.  */
   HOWTO (R_MCORE_PCREL32,      /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
@@ -148,11 +148,11 @@ static reloc_howto_type mcore_elf_howto_raw[] =
 
   /* Like PCRELIMM11BY2, this relocation indicates that there is a
      'jsri' at the specified address. There is a separate relocation
-     entry for the literal pool entry that it references, but we 
+     entry for the literal pool entry that it references, but we
      might be able to change the jsri to a bsr if the target turns out
      to be close enough [even though we won't reclaim the literal pool
      entry, we'll get some runtime efficiency back]. Note that this
-     is a relocation that we are allowed to safely ignore.  */ 
+     is a relocation that we are allowed to safely ignore.  */
   HOWTO (R_MCORE_PCRELJSR_IMM11BY2,/* type */
         1,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
@@ -166,7 +166,7 @@ static reloc_howto_type mcore_elf_howto_raw[] =
         0x0,                   /* src_mask */
         0x7ff,                 /* dst_mask */
         true),                 /* pcrel_offset */
-  
+
   /* GNU extension to record C++ vtable hierarchy */
   HOWTO (R_MCORE_GNU_VTINHERIT, /* type */
          0,                     /* rightshift */
@@ -196,7 +196,7 @@ static reloc_howto_type mcore_elf_howto_raw[] =
          0,                     /* src_mask */
          0,                     /* dst_mask */
          false),                /* pcrel_offset */
-  
+
   HOWTO (R_MCORE_RELATIVE,      /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
@@ -225,15 +225,14 @@ mcore_elf_howto_init ()
   for (i = NUM_ELEM (mcore_elf_howto_raw); i--;)
     {
       unsigned int type;
-      
+
       type = mcore_elf_howto_raw[i].type;
-      
+
       BFD_ASSERT (type < NUM_ELEM (mcore_elf_howto_table));
-      
+
       mcore_elf_howto_table [type] = & mcore_elf_howto_raw [i];
     }
 }
-
 \f
 static reloc_howto_type *
 mcore_elf_reloc_type_lookup (abfd, code)
@@ -275,11 +274,11 @@ mcore_elf_info_to_howto (abfd, cache_ptr, dst)
     mcore_elf_howto_init ();
 
   BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_MCORE_max);
-  
+
   cache_ptr->howto = mcore_elf_howto_table [ELF32_R_TYPE (dst->r_info)];
 }
 
-/* Function to set whether a module needs the -mrelocatable bit set. */
+/* Function to set whether a module needs the -mrelocatable bit set.  */
 static boolean
 mcore_elf_set_private_flags (abfd, flags)
      bfd * abfd;
@@ -322,18 +321,8 @@ mcore_elf_merge_private_bfd_data (ibfd, obfd)
   flagword new_flags;
 
   /* Check if we have the same endianess */
-  if (   ibfd->xvec->byteorder != obfd->xvec->byteorder
-      && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
-    {
-      (*_bfd_error_handler)
-       (_("%s: compiled for a %s endian system and target is %s endian.\n"),
-        bfd_get_filename (ibfd),
-         bfd_big_endian (ibfd) ? "big" : "little",
-         bfd_big_endian (obfd) ? "big" : "little");
-
-      bfd_set_error (bfd_error_wrong_format);
-      return false;
-    }
+  if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
+    return false;
 
   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
@@ -341,7 +330,7 @@ mcore_elf_merge_private_bfd_data (ibfd, obfd)
 
   new_flags = elf_elfheader (ibfd)->e_flags;
   old_flags = elf_elfheader (obfd)->e_flags;
-  
+
   if (! elf_flags_init (obfd)) /* First call, no flags set */
     {
       elf_flags_init (obfd) = true;
@@ -356,11 +345,9 @@ mcore_elf_merge_private_bfd_data (ibfd, obfd)
 
   return true;
 }
-
 \f
 /* Don't pretend we can deal with unsupported relocs.  */
 
-/*ARGSUSED*/
 static bfd_reloc_status_type
 mcore_elf_unsupported_reloc (abfd, reloc_entry, symbol, data, input_section,
                           output_bfd, error_message)
@@ -373,7 +360,7 @@ mcore_elf_unsupported_reloc (abfd, reloc_entry, symbol, data, input_section,
      char ** error_message ATTRIBUTE_UNUSED;
 {
   BFD_ASSERT (reloc_entry->howto != (reloc_howto_type *)0);
-  
+
   _bfd_error_handler (_("%s: Relocation %s (%d) is not currently supported.\n"),
                      bfd_get_filename (abfd),
                      reloc_entry->howto->name,
@@ -381,7 +368,6 @@ mcore_elf_unsupported_reloc (abfd, reloc_entry, symbol, data, input_section,
 
   return bfd_reloc_notsupported;
 }
-
 \f
 /* The RELOCATE_SECTION function is called by the ELF backend linker
    to handle the relocations for a section.
@@ -454,8 +440,8 @@ mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
       Elf_Internal_Sym *           sym = (Elf_Internal_Sym *) 0;
       unsigned long                r_symndx;
       struct elf_link_hash_entry * h = (struct elf_link_hash_entry *) 0;
-      unsigned short               oldinst;
-      
+      unsigned short               oldinst = 0;
+
       /* Unknown relocation handling */
       if ((unsigned) r_type >= (unsigned) R_MCORE_max
          || ! mcore_elf_howto_table [(int)r_type])
@@ -468,10 +454,10 @@ mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
          ret = false;
          continue;
        }
-      
+
       howto = mcore_elf_howto_table [(int) r_type];
       r_symndx = ELF32_R_SYM (rel->r_info);
-      
+
       if (info->relocateable)
        {
          /* This is a relocateable link.  We don't have to change
@@ -481,7 +467,7 @@ mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
          if (r_symndx < symtab_hdr->sh_info)
            {
              sym = local_syms + r_symndx;
-             
+
              if ((unsigned)ELF_ST_TYPE (sym->st_info) == STT_SECTION)
                {
                  sec = local_sections[r_symndx];
@@ -498,7 +484,7 @@ mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
 
       /* This is a final link.  */
 
-      /* Complain about known relocation that are not yet supported */
+      /* Complain about known relocation that are not yet supported */
       if (howto->special_function == mcore_elf_unsupported_reloc)
        {
          _bfd_error_handler (_("%s: Relocation %s (%d) is not currently supported.\n"),
@@ -532,13 +518,14 @@ mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
            }
          else if (h->root.type == bfd_link_hash_undefweak)
            relocation = 0;
-         else if (info->shared)
+         else if (info->shared
+                  && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
            relocation = 0;
          else
            {
              if (! ((*info->callbacks->undefined_symbol)
                        (info, h->root.root.string, input_bfd,
-                        input_section, rel->r_offset)))
+                        input_section, rel->r_offset, true)))
                return false;
 
              ret = false;
@@ -558,7 +545,6 @@ mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
          break;
        }
 
-
 #ifdef DEBUG
       fprintf (stderr, "\ttype = %s (%d), symbol index = %ld, offset = %ld, addend = %ld\n",
               howto->name, r_type, r_symndx, (long) offset, (long) addend);
@@ -573,11 +559,11 @@ mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
          bfd_put_16 (input_bfd, oldinst, contents + offset);
          r = bfd_reloc_ok;
        }
-      
+
       if (r != bfd_reloc_ok)
        {
          ret = false;
-         
+
          switch (r)
            {
            default:
@@ -593,7 +579,7 @@ mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                  {
                    name = bfd_elf_string_from_elf_section
                      (input_bfd, symtab_hdr->sh_link, sym->st_name);
-                   
+
                    if (name == NULL)
                      break;
 
@@ -642,7 +628,7 @@ mcore_elf_gc_mark_hook (abfd, info, rel, h, sym)
            case bfd_link_hash_defined:
            case bfd_link_hash_defweak:
              return h->root.u.def.section;
-             
+
            case bfd_link_hash_common:
              return h->root.u.c.p->section;
 
@@ -680,7 +666,7 @@ mcore_elf_gc_sweep_hook (abfd, info, sec, relocs)
 /* Look through the relocs for a section during the first phase.
    Since we don't do .gots or .plts, we just need to consider the
    virtual table relocs for gc.  */
+
 static boolean
 mcore_elf_check_relocs (abfd, info, sec, relocs)
      bfd * abfd;
@@ -693,30 +679,30 @@ mcore_elf_check_relocs (abfd, info, sec, relocs)
   struct elf_link_hash_entry ** sym_hashes_end;
   const Elf_Internal_Rela *     rel;
   const Elf_Internal_Rela *     rel_end;
+
   if (info->relocateable)
     return true;
+
   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
   sym_hashes = elf_sym_hashes (abfd);
   sym_hashes_end = sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
   if (!elf_bad_symtab (abfd))
     sym_hashes_end -= symtab_hdr->sh_info;
+
   rel_end = relocs + sec->reloc_count;
-  
+
   for (rel = relocs; rel < rel_end; rel++)
     {
       struct elf_link_hash_entry * h;
       unsigned long r_symndx;
+
       r_symndx = ELF32_R_SYM (rel->r_info);
-      
+
       if (r_symndx < symtab_hdr->sh_info)
         h = NULL;
       else
         h = sym_hashes [r_symndx - symtab_hdr->sh_info];
+
       switch (ELF32_R_TYPE (rel->r_info))
         {
         /* This relocation describes the C++ object vtable hierarchy.
@@ -725,7 +711,7 @@ mcore_elf_check_relocs (abfd, info, sec, relocs)
           if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
             return false;
           break;
-         
+
         /* This relocation describes which C++ vtable entries are actually
            used.  Record for later use during GC.  */
         case R_MCORE_GNU_VTENTRY:
@@ -734,7 +720,7 @@ mcore_elf_check_relocs (abfd, info, sec, relocs)
           break;
         }
     }
+
   return true;
 }
 
@@ -749,7 +735,6 @@ mcore_elf_check_relocs (abfd, info, sec, relocs)
 #define elf_info_to_howto      mcore_elf_info_to_howto
 #define elf_info_to_howto_rel  NULL
 
-
 #define bfd_elf32_bfd_copy_private_bfd_data    mcore_elf_copy_private_bfd_data
 #define bfd_elf32_bfd_merge_private_bfd_data   mcore_elf_merge_private_bfd_data
 #define bfd_elf32_bfd_set_private_flags                mcore_elf_set_private_flags
This page took 0.028131 seconds and 4 git commands to generate.