PR22769, crash when running 32-bit objdump on corrupted file
[deliverable/binutils-gdb.git] / bfd / coff-i860.c
index e5ca0c17bc5a259aa39c5f2f63f9a37d39b788d2..13c84af315624345230ddbe357c29ce2665b4621 100644 (file)
@@ -1,6 +1,5 @@
 /* BFD back-end for Intel i860 COFF files.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2002,
-   2003, 2004, 2005, 2007, 2008  Free Software Foundation, Inc.
+   Copyright (C) 1990-2018 Free Software Foundation, Inc.
    Created mostly by substituting "860" for "386" in coff-i386.c
    Harry Dolan <dolan@ssd.intel.com>, October 1995
 
@@ -96,6 +95,11 @@ coff_i860_reloc (bfd *abfd,
        reloc_howto_type *howto = reloc_entry->howto;
        unsigned char *addr = (unsigned char *) data + reloc_entry->address;
 
+       if (! bfd_reloc_offset_in_range (howto, abfd, input_section,
+                                        reloc_entry->address
+                                        * bfd_octets_per_byte (abfd)))
+         return bfd_reloc_outofrange;
+
        switch (howto->size)
          {
          case 0:
@@ -131,7 +135,7 @@ coff_i860_reloc (bfd *abfd,
   return bfd_reloc_continue;
 }
 
-/* This is just a temporary measure until we teach bfd to generate 
+/* This is just a temporary measure until we teach bfd to generate
    these relocations.  */
 
 static bfd_reloc_status_type
@@ -144,7 +148,7 @@ coff_i860_reloc_nyi (bfd *abfd ATTRIBUTE_UNUSED,
                     char **error_message ATTRIBUTE_UNUSED)
 {
   reloc_howto_type *howto = reloc_entry->howto;
-  fprintf (stderr, _("Relocation `%s' not yet implemented\n"), howto->name);
+  _bfd_error_handler (_("relocation `%s' not yet implemented"), howto->name);
   return bfd_reloc_notsupported;
 }
 
@@ -160,33 +164,33 @@ static reloc_howto_type howto_table[] =
   EMPTY_HOWTO (3),
   EMPTY_HOWTO (4),
   EMPTY_HOWTO (5),
-  HOWTO (R_DIR32,               /* type */
-        0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
+  HOWTO (R_DIR32,              /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
-        coff_i860_reloc,       /* special_function */
-        "dir32",               /* name */
-        TRUE,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
-        0xffffffff,            /* dst_mask */
-        TRUE),                /* pcrel_offset */
+        coff_i860_reloc,       /* special_function */
+        "dir32",               /* name */
+        TRUE,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
+        TRUE),                /* pcrel_offset */
   /* {7}, */
-  HOWTO (R_IMAGEBASE,            /* type */
-        0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
-        0,                     /* bitpos */
+  HOWTO (R_IMAGEBASE,           /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
-        coff_i860_reloc,       /* special_function */
-        "rva32",                  /* name */
-        TRUE,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
-        0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        coff_i860_reloc,       /* special_function */
+        "rva32",                  /* name */
+        TRUE,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
   EMPTY_HOWTO (010),
   EMPTY_HOWTO (011),
   EMPTY_HOWTO (012),
@@ -291,7 +295,7 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
   EMPTY_HOWTO (0x1d),
   HOWTO (COFF860_R_HIGH,       /* type */
         16,                    /* rightshift */
@@ -305,8 +309,8 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-  HOWTO (COFF860_R_LOW0,        /* type */
+        FALSE),                /* pcrel_offset */
+  HOWTO (COFF860_R_LOW0,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -318,8 +322,8 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-  HOWTO (COFF860_R_LOW1,        /* type */
+        FALSE),                /* pcrel_offset */
+  HOWTO (COFF860_R_LOW1,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -331,8 +335,8 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0xfffe,                /* src_mask */
         0xfffe,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-  HOWTO (COFF860_R_LOW2,        /* type */
+        FALSE),                /* pcrel_offset */
+  HOWTO (COFF860_R_LOW2,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -344,8 +348,8 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0xfffc,                /* src_mask */
         0xfffc,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-  HOWTO (COFF860_R_LOW3,        /* type */
+        FALSE),                /* pcrel_offset */
+  HOWTO (COFF860_R_LOW3,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -357,8 +361,8 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0xfff8,                /* src_mask */
         0xfff8,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-  HOWTO (COFF860_R_LOW4,        /* type */
+        FALSE),                /* pcrel_offset */
+  HOWTO (COFF860_R_LOW4,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -370,8 +374,8 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0xfff0,                /* src_mask */
         0xfff0,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-  HOWTO (COFF860_R_SPLIT0,      /* type */
+        FALSE),                /* pcrel_offset */
+  HOWTO (COFF860_R_SPLIT0,     /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -383,8 +387,8 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0x1f07ff,              /* src_mask */
         0x1f07ff,              /* dst_mask */
-        FALSE),                /* pcrel_offset */
-  HOWTO (COFF860_R_SPLIT1,      /* type */
+        FALSE),                /* pcrel_offset */
+  HOWTO (COFF860_R_SPLIT1,     /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -396,8 +400,8 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0x1f07fe,              /* src_mask */
         0x1f07fe,              /* dst_mask */
-        FALSE),                /* pcrel_offset */
-  HOWTO (COFF860_R_SPLIT2,      /* type */
+        FALSE),                /* pcrel_offset */
+  HOWTO (COFF860_R_SPLIT2,     /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -409,8 +413,8 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0x1f07fc,              /* src_mask */
         0x1f07fc,              /* dst_mask */
-        FALSE),                /* pcrel_offset */
-  HOWTO (COFF860_R_HIGHADJ,     /* type */
+        FALSE),                /* pcrel_offset */
+  HOWTO (COFF860_R_HIGHADJ,    /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
@@ -422,8 +426,8 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
-  HOWTO (COFF860_R_BRADDR,      /* type */
+        FALSE),                /* pcrel_offset */
+  HOWTO (COFF860_R_BRADDR,     /* type */
         2,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         26,                    /* bitsize */
@@ -435,7 +439,7 @@ static reloc_howto_type howto_table[] =
         FALSE,                 /* partial_inplace */
         0x3ffffff,             /* src_mask */
         0x3ffffff,             /* dst_mask */
-        TRUE)                  /* pcrel_offset */
+        TRUE)                  /* pcrel_offset */
 };
 
 /* Turn a howto into a reloc number.  */
@@ -468,7 +472,10 @@ static reloc_howto_type howto_table[] =
    FIXME: This macro refers to symbols and asect; these are from the
    calling function, not the macro arguments.  */
 
-#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)
+/* PR 17512: file: 0a38fb7c
+   Set an addend value, even if it is not going to be used.  A tool
+   like coffdump might be used to print out the contents of the reloc.  */
+#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) (cache_ptr)->addend = 0
 
 /* We use the special COFF backend linker.  */
 #define coff_relocate_section _bfd_coff_generic_relocate_section
@@ -593,7 +600,7 @@ i860_reloc_processing (arelent *cache_ptr, struct internal_reloc *dst,
   else
     {
       /* For every other relocation, do exactly what coff_slurp_reloc_table
-         would do (which this code is taken directly from).  */
+        would do (which this code is taken directly from).  */
       asymbol *ptr = NULL;
       cache_ptr->address = dst->r_vaddr;
 
@@ -601,7 +608,8 @@ i860_reloc_processing (arelent *cache_ptr, struct internal_reloc *dst,
        {
          if (dst->r_symndx < 0 || dst->r_symndx >= obj_conv_table_size (abfd))
            {
-             (*_bfd_error_handler)
+             _bfd_error_handler
+               /* xgettext: c-format */
                (_("%B: warning: illegal symbol index %ld in relocs"),
                 abfd, dst->r_symndx);
              cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
@@ -629,6 +637,7 @@ i860_reloc_processing (arelent *cache_ptr, struct internal_reloc *dst,
 
       /* Calculate any reloc addend by looking at the symbol.  */
       CALC_ADDEND (abfd, ptr, (*dst), cache_ptr);
+      (void) ptr;
 
       cache_ptr->address -= asect->vma;
 
@@ -656,7 +665,7 @@ const bfd_target
 #ifdef TARGET_SYM
   TARGET_SYM =
 #else
-  i860coff_vec =
+  i860_coff_vec =
 #endif
 {
 #ifdef TARGET_NAME
@@ -676,6 +685,7 @@ const bfd_target
   '_',                         /* leading underscore */
   '/',                         /* ar_pad_char */
   15,                          /* ar_max_namelen */
+  0,                           /* match priority.  */
 
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
This page took 0.029038 seconds and 4 git commands to generate.