bfd/
[deliverable/binutils-gdb.git] / bfd / coff-arm.c
index 9b2612327f886f9c3cb80e194948c4344074db46..1c3a7e3c39521e898c5d5c804cc9b771e6972a9a 100644 (file)
@@ -1,6 +1,6 @@
 /* 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.
 
@@ -268,7 +268,7 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           2,
           2,
           24,
-          FALSE,
+          TRUE,
           0,
           complain_overflow_dont,
           aoutarm_fix_pcrel_26_done,
@@ -276,7 +276,7 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
           FALSE,
           0x00ffffff,
           0x0,
-          FALSE),
+          PCRELOFFSET),
     HOWTO (ARM_32,
           0,
           2,
@@ -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;
@@ -1250,7 +1251,8 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
          when doing a relocatable link.  However, we want to convert
          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:
          {
@@ -1849,7 +1846,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 +1865,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 +2126,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;
            }
 
@@ -2262,9 +2259,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 +2275,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 +2292,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 +2323,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 +2423,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 +2487,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.028589 seconds and 4 git commands to generate.