* elf32-m68k.c (elf_m68k_adjust_dynamic_symbol): Use
[deliverable/binutils-gdb.git] / bfd / coff-arm.c
index 1d605678c143edbaf84a8a5abaf4bee6b295fb7f..05229caeabc23eec4faa95fa61f1a14a0c52c84b 100644 (file)
@@ -1,24 +1,24 @@
 /* BFD back-end for ARM COFF files.
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003
+   2000, 2001, 2002, 2003, 2004
    Free Software Foundation, Inc.
    Written by 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "bfd.h"
 #include "sysdep.h"
@@ -252,11 +252,11 @@ coff_arm_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
 #undef  ARM_THUMB12
 #undef  ARM_26D
 
+#define ARM_26D      0
 #define ARM_32       1
 #define ARM_RVA32    2
 #define ARM_26      3
 #define ARM_THUMB12  4
-#define ARM_26D      5
 #define ARM_SECTION  14
 #define ARM_SECREL   15
 #endif
@@ -264,7 +264,19 @@ coff_arm_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
 static reloc_howto_type aoutarm_std_reloc_howto[] =
   {
 #ifdef ARM_WINCE
-    EMPTY_HOWTO (-1),
+    HOWTO (ARM_26D,
+          2,
+          2,
+          24,
+          TRUE,
+          0,
+          complain_overflow_dont,
+          aoutarm_fix_pcrel_26_done,
+          "ARM_26D",
+          FALSE,
+          0x00ffffff,
+          0x0,
+          PCRELOFFSET),
     HOWTO (ARM_32,
           0,
           2,
@@ -274,7 +286,7 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           complain_overflow_bitfield,
           coff_arm_reloc,
           "ARM_32",
-          TRUE,
+          FALSE,
           0xffffffff,
           0xffffffff,
           PCRELOFFSET),
@@ -287,7 +299,7 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           complain_overflow_bitfield,
           coff_arm_reloc,
           "ARM_RVA32",
-          TRUE,
+          FALSE,
           0xffffffff,
           0xffffffff,
           PCRELOFFSET),
@@ -317,19 +329,7 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           0x000007ff,
           0x000007ff,
           PCRELOFFSET),
-    HOWTO (ARM_26D,
-          2,
-          2,
-          24,
-          FALSE,
-          0,
-          complain_overflow_dont,
-          aoutarm_fix_pcrel_26_done,
-          "ARM_26D",
-          TRUE,
-          0x00ffffff,
-          0x0,
-          FALSE),
+    EMPTY_HOWTO (-1),
     EMPTY_HOWTO (-1),
     EMPTY_HOWTO (-1),
     EMPTY_HOWTO (-1),
@@ -346,8 +346,8 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           0,
           complain_overflow_bitfield,
           coff_arm_reloc,
-          "ARM_16",
-          TRUE,
+          "ARM_SECTION",
+          FALSE,
           0x0000ffff,
           0x0000ffff,
           PCRELOFFSET),
@@ -359,8 +359,8 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           0,
           complain_overflow_bitfield,
           coff_arm_reloc,
-          "ARM_32",
-          TRUE,
+          "ARM_SECREL",
+          FALSE,
           0xffffffff,
           0xffffffff,
           PCRELOFFSET),
@@ -1063,8 +1063,8 @@ find_thumb_glue (info, name, input_bfd)
 
   if (myh == NULL)
     /* xgettext:c-format */
-    _bfd_error_handler (_("%s: unable to find THUMB glue '%s' for `%s'"),
-                       bfd_archive_filename (input_bfd), tmp_name, name);
+    _bfd_error_handler (_("%B: unable to find THUMB glue '%s' for `%s'"),
+                       input_bfd, tmp_name, name);
 
   free (tmp_name);
 
@@ -1093,8 +1093,8 @@ find_arm_glue (info, name, input_bfd)
 
   if (myh == NULL)
     /* xgettext:c-format */
-    _bfd_error_handler (_("%s: unable to find ARM glue '%s' for `%s'"),
-                       bfd_archive_filename (input_bfd), tmp_name, name);
+    _bfd_error_handler (_("%B: unable to find ARM glue '%s' for `%s'"),
+                       input_bfd, tmp_name, name);
 
   free (tmp_name);
 
@@ -1202,6 +1202,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
 {
   struct internal_reloc * rel;
   struct internal_reloc * relend;
+  bfd_vma high_address = bfd_get_section_limit (input_bfd, input_section);
 
   rel = relocs;
   relend = rel + input_section->reloc_count;
@@ -1248,9 +1249,10 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
 
       /* The relocation_section function will skip pcrel_offset relocs
          when doing a relocatable link.  However, we want to convert
-         ARM26 to ARM26D relocs if possible.  We return a fake howto in
+         ARM_26 to ARM_26D relocs if possible.  We return a fake howto in
          this case without pcrel_offset set, and adjust the addend to
-         compensate.  */
+         compensate.  'partial_inplace' is also set, since we want 'done'
+         relocations to be reflected in section's data.  */
       if (rel->r_type == ARM_26
           && h != NULL
           && info->relocatable
@@ -1269,12 +1271,17 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
               complain_overflow_signed,
               aoutarm_fix_pcrel_26 ,
               "ARM_26",
-              FALSE,
+              TRUE,
               0x00ffffff,
               0x00ffffff,
               FALSE);
 
           addend -= rel->r_vaddr - input_section->vma;
+#ifdef ARM_WINCE
+          /* FIXME: I don't know why, but the hack is necessary for correct
+                    generation of bl's instruction offset. */
+          addend -= 8;
+#endif
           howto = &fake_arm26_reloc;
         }
 
@@ -1388,16 +1395,11 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
                          if (h_sec->owner != NULL
                              && INTERWORK_SET (h_sec->owner)
                              && ! INTERWORK_FLAG (h_sec->owner))
-                           {
-                             _bfd_error_handler
-                               /* xgettext:c-format */
-                               (_("%s(%s): warning: interworking not enabled."),
-                                bfd_archive_filename (h_sec->owner), name);
-                             _bfd_error_handler
-                               /* xgettext:c-format */
-                               (_("  first occurrence: %s: arm call to thumb"),
-                                bfd_archive_filename (input_bfd));
-                           }
+                           _bfd_error_handler
+                             /* xgettext:c-format */
+                             (_("%B(%s): warning: interworking not enabled.\n"
+                                "  first occurrence: %B: arm call to thumb"),
+                              h_sec->owner, input_bfd, name);
 
                          --my_offset;
                          myh->root.u.def.value = my_offset;
@@ -1483,18 +1485,12 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
                              && INTERWORK_SET (h_sec->owner)
                              && ! INTERWORK_FLAG (h_sec->owner)
                              && ! globals->support_old_code)
-                           {
-                             _bfd_error_handler
-                               /* xgettext:c-format */
-                               (_("%s(%s): warning: interworking not enabled."),
-                                bfd_archive_filename (h_sec->owner), name);
-                             _bfd_error_handler
-                               /* xgettext:c-format */
-                               (_("  first occurrence: %s: thumb call to arm"),
-                                bfd_archive_filename (input_bfd));
-                             _bfd_error_handler
-                               (_("  consider relinking with --support-old-code enabled"));
-                           }
+                           _bfd_error_handler
+                             /* xgettext:c-format */
+                             (_("%B(%s): warning: interworking not enabled.\n"
+                                "  first occurrence: %B: thumb call to arm\n"
+                                "  consider relinking with --support-old-code enabled"),
+                              h_sec->owner, input_bfd, name);
 
                          -- my_offset;
                          myh->root.u.def.value = my_offset;
@@ -1630,7 +1626,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
 
           bfd_vma address = rel->r_vaddr - input_section->vma;
 
-          if (address > input_section->_raw_size)
+         if (address > high_address)
            rstat = bfd_reloc_outofrange;
           else
             {
@@ -1734,10 +1730,13 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
 #endif
       else
 #endif /* THUMBEXTENSION */
-        rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
-                                          contents,
-                                          rel->r_vaddr - input_section->vma,
-                                          val, addend);
+        if (info->relocatable && ! howto->partial_inplace)
+            rstat = bfd_reloc_ok;
+        else
+         rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
+                                           contents,
+                                           rel->r_vaddr - input_section->vma,
+                                           val, addend);
 #if 1 /* THUMBEXTENSION */
       /* FIXME:
         Is this the best way to fix up thumb addresses? krk@cygnus.com
@@ -1785,10 +1784,8 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
          break;
        case bfd_reloc_outofrange:
          (*_bfd_error_handler)
-           (_("%s: bad reloc address 0x%lx in section `%s'"),
-            bfd_archive_filename (input_bfd),
-            (unsigned long) rel->r_vaddr,
-            bfd_get_section_name (input_bfd, input_section));
+           (_("%B: bad reloc address 0x%lx in section `%A'"),
+            input_bfd, input_section, (unsigned long) rel->r_vaddr);
          return FALSE;
        case bfd_reloc_overflow:
          {
@@ -1798,7 +1795,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
            if (symndx == -1)
              name = "*ABS*";
            else if (h != NULL)
-             name = h->root.root.string;
+             name = NULL;
            else
              {
                name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
@@ -1807,8 +1804,9 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
              }
 
            if (! ((*info->callbacks->reloc_overflow)
-                  (info, name, howto->name, (bfd_vma) 0, input_bfd,
-                   input_section, rel->r_vaddr - input_section->vma)))
+                  (info, (h ? &h->root : NULL), name, howto->name,
+                   (bfd_vma) 0, input_bfd, input_section,
+                   rel->r_vaddr - input_section->vma)))
              return FALSE;
          }
        }
@@ -1849,7 +1847,7 @@ bfd_arm_allocate_interworking_sections (info)
       memset (foo, test_char, (size_t) globals->arm_glue_size);
 #endif
 
-      s->_raw_size = s->_cooked_size = globals->arm_glue_size;
+      s->size = globals->arm_glue_size;
       s->contents = foo;
     }
 
@@ -1868,7 +1866,7 @@ bfd_arm_allocate_interworking_sections (info)
       memset (foo, test_char, (size_t) globals->thumb_glue_size);
 #endif
 
-      s->_raw_size = s->_cooked_size = globals->thumb_glue_size;
+      s->size = globals->thumb_glue_size;
       s->contents = foo;
     }
 
@@ -2129,8 +2127,8 @@ bfd_arm_process_before_allocation (abfd, info, support_old_code)
          /* If the index is outside of the range of our table, something has gone wrong.  */
          if (symndx >= obj_conv_table_size (abfd))
            {
-             _bfd_error_handler (_("%s: illegal symbol index in reloc: %d"),
-                                 bfd_archive_filename (abfd), symndx);
+             _bfd_error_handler (_("%B: illegal symbol index in reloc: %d"),
+                                 abfd, symndx);
              continue;
            }
 
@@ -2198,8 +2196,8 @@ bfd_arm_process_before_allocation (abfd, info, support_old_code)
 #define coff_bfd_copy_private_bfd_data          coff_arm_copy_private_bfd_data
 #define coff_bfd_link_hash_table_create                coff_arm_link_hash_table_create
 
-/* When doing a relocatable link, we want to convert ARM26 relocs
-   into ARM26D relocs.  */
+/* When doing a relocatable link, we want to convert ARM_26 relocs
+   into ARM_26D relocs.  */
 
 static bfd_boolean
 coff_arm_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp)
@@ -2210,7 +2208,7 @@ coff_arm_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp)
      struct internal_reloc *irel;
      bfd_boolean *adjustedp;
 {
-  if (irel->r_type == 3)
+  if (irel->r_type == ARM_26)
     {
       struct coff_link_hash_entry *h;
 
@@ -2219,7 +2217,7 @@ coff_arm_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp)
          && (h->root.type == bfd_link_hash_defined
              || h->root.type == bfd_link_hash_defweak)
          && h->root.u.def.section->output_section == sec->output_section)
-       irel->r_type = 7;
+       irel->r_type = ARM_26D;
     }
   *adjustedp = FALSE;
   return TRUE;
@@ -2262,9 +2260,10 @@ coff_arm_merge_private_bfd_data (ibfd, obfd)
            {
              _bfd_error_handler
                /* xgettext: c-format */
-               (_("ERROR: %s is compiled for APCS-%d, whereas %s is compiled for APCS-%d"),
-                bfd_archive_filename (ibfd), APCS_26_FLAG (ibfd) ? 26 : 32,
-                bfd_get_filename (obfd), APCS_26_FLAG (obfd) ? 26 : 32
+               (_("ERROR: %B is compiled for APCS-%d, whereas %B is compiled for APCS-%d"),
+                ibfd, obfd,
+                APCS_26_FLAG (ibfd) ? 26 : 32,
+                APCS_26_FLAG (obfd) ? 26 : 32
                 );
 
              bfd_set_error (bfd_error_wrong_format);
@@ -2277,13 +2276,12 @@ coff_arm_merge_private_bfd_data (ibfd, obfd)
 
              if (APCS_FLOAT_FLAG (ibfd))
                /* xgettext: c-format */
-               msg = _("ERROR: %s passes floats in float registers, whereas %s passes them in integer registers");
+               msg = _("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers");
              else
                /* xgettext: c-format */
-               msg = _("ERROR: %s passes floats in integer registers, whereas %s passes them in float registers");
+               msg = _("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers");
 
-             _bfd_error_handler (msg, bfd_archive_filename (ibfd),
-                                 bfd_get_filename (obfd));
+             _bfd_error_handler (msg, ibfd, obfd);
 
              bfd_set_error (bfd_error_wrong_format);
              return FALSE;
@@ -2295,12 +2293,11 @@ coff_arm_merge_private_bfd_data (ibfd, obfd)
 
              if (PIC_FLAG (ibfd))
                /* xgettext: c-format */
-               msg = _("ERROR: %s is compiled as position independent code, whereas target %s is absolute position");
+               msg = _("ERROR: %B is compiled as position independent code, whereas target %B is absolute position");
              else
                /* xgettext: c-format */
-               msg = _("ERROR: %s is compiled as absolute position code, whereas target %s is position independent");
-             _bfd_error_handler (msg, bfd_archive_filename (ibfd),
-                                 bfd_get_filename (obfd));
+               msg = _("ERROR: %B is compiled as absolute position code, whereas target %B is position independent");
+             _bfd_error_handler (msg, ibfd, obfd);
 
              bfd_set_error (bfd_error_wrong_format);
              return FALSE;
@@ -2327,13 +2324,12 @@ coff_arm_merge_private_bfd_data (ibfd, obfd)
 
              if (INTERWORK_FLAG (ibfd))
                /* xgettext: c-format */
-               msg = _("Warning: %s supports interworking, whereas %s does not");
+               msg = _("Warning: %B supports interworking, whereas %B does not");
              else
                /* xgettext: c-format */
-               msg = _("Warning: %s does not support interworking, whereas %s does");
+               msg = _("Warning: %B does not support interworking, whereas %B does");
 
-             _bfd_error_handler (msg, bfd_archive_filename (ibfd),
-                                 bfd_get_filename (obfd));
+             _bfd_error_handler (msg, ibfd, obfd);
            }
        }
       else
@@ -2428,12 +2424,12 @@ _bfd_coff_arm_set_private_flags (abfd, flags)
     {
       if (flag)
        /* xgettext: c-format */
-       _bfd_error_handler (_("Warning: Not setting interworking flag of %s since it has already been specified as non-interworking"),
-                           bfd_archive_filename (abfd));
+       _bfd_error_handler (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
+                           abfd);
       else
        /* xgettext: c-format */
-       _bfd_error_handler (_("Warning: Clearing the interworking flag of %s due to outside request"),
-                           bfd_archive_filename (abfd));
+       _bfd_error_handler (_("Warning: Clearing the interworking flag of %B due to outside request"),
+                           abfd);
       flag = 0;
     }
 
@@ -2492,9 +2488,8 @@ coff_arm_copy_private_bfd_data (src, dest)
                {
                  /* xgettext:c-format */
                  _bfd_error_handler (("\
-Warning: Clearing the interworking flag of %s because non-interworking code in %s has been linked with it"),
-                                     bfd_get_filename (dest),
-                                     bfd_archive_filename (src));
+Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
+                                     dest, src);
                }
 
              SET_INTERWORK_FLAG (dest, 0);
This page took 0.030922 seconds and 4 git commands to generate.