Don't add DT_NEEDED for unmatched symbol
[deliverable/binutils-gdb.git] / bfd / versados.c
index 1dfe7483778eed702507633e9a9b85ef8d2d64d7..c8b3c48f389aa5b7eba64a73a3e4bf4e4c8be37d 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for VERSAdos-E objects.
-   Copyright (C) 1995-2014 Free Software Foundation, Inc.
+   Copyright (C) 1995-2016 Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
 
    Versados is a Motorola trademark.
@@ -57,6 +57,7 @@ struct esdid
 {
   asection *section;           /* Ptr to bfd version.  */
   unsigned char *contents;     /* Used to build image.  */
+  bfd_size_type content_size;  /* The size of the contents buffer.  */
   int pc;
   int relocs;                  /* Reloc count, valid end of pass 1.  */
   int donerel;                 /* Have relocs been translated.  */
@@ -372,10 +373,18 @@ process_otr (bfd *abfd, struct ext_otr *otr, int pass)
   | (otr->map[2] << 8)
   | (otr->map[3] << 0);
 
-  struct esdid *esdid = &EDATA (abfd, otr->esdid - 1);
-  unsigned char *contents = esdid->contents;
+  struct esdid *esdid;
+  unsigned char *contents;
   bfd_boolean need_contents = FALSE;
-  unsigned int dst_idx = esdid->pc;
+  unsigned int dst_idx;
+
+  /* PR 17512: file: ac7da425.  */
+  if (otr->esdid == 0)
+    return;
+
+  esdid = &EDATA (abfd, otr->esdid - 1);
+  contents = esdid->contents;
+  dst_idx = esdid->pc;
 
   for (shift = ((unsigned long) 1 << 31); shift && srcp < endp; shift >>= 1)
     {
@@ -399,7 +408,7 @@ process_otr (bfd *abfd, struct ext_otr *otr, int pass)
 
              if (pass == 1)
                need_contents = TRUE;
-             else if (contents)
+             else if (contents && dst_idx < esdid->content_size - sizeinwords * 2)
                for (j = 0; j < sizeinwords * 2; j++)
                  {
                    contents[dst_idx + (sizeinwords * 2) - j - 1] = val;
@@ -421,10 +430,13 @@ process_otr (bfd *abfd, struct ext_otr *otr, int pass)
                        }
                      else
                        {
-                         arelent *n =
-                         EDATA (abfd, otr->esdid - 1).section->relocation + rn;
-                         n->address = dst_idx;
+                         arelent *n;
 
+                         /* PR 17512: file: 54f733e0.  */
+                         if (EDATA (abfd, otr->esdid - 1).section == NULL)
+                           continue;
+                         n = EDATA (abfd, otr->esdid - 1).section->relocation + rn;
+                         n->address = dst_idx;
                          n->sym_ptr_ptr = (asymbol **) (size_t) id;
                          n->addend = 0;
                          n->howto = versados_howto_table + ((j & 1) * 2) + (sizeinwords - 1);
@@ -439,7 +451,7 @@ process_otr (bfd *abfd, struct ext_otr *otr, int pass)
        {
          need_contents = TRUE;
 
-         if (esdid->section && contents && dst_idx < esdid->section->size)
+         if (esdid->section && contents && dst_idx < esdid->content_size - 1)
            if (pass == 2)
              {
                /* Absolute code, comes in 16 bit lumps.  */
@@ -462,6 +474,7 @@ process_otr (bfd *abfd, struct ext_otr *otr, int pass)
 
          size = esdid->section->size;
          esdid->contents = bfd_alloc (abfd, size);
+         esdid->content_size = size;
        }
       else
        esdid->contents = NULL;
@@ -676,12 +689,20 @@ versados_get_section_contents (bfd *abfd,
                               file_ptr offset,
                               bfd_size_type count)
 {
+  struct esdid *esdid;
+
   if (!versados_pass_2 (abfd))
     return FALSE;
 
-  memcpy (location,
-         EDATA (abfd, section->target_index).contents + offset,
-         (size_t) count);
+  esdid = &EDATA (abfd, section->target_index);
+
+  if (esdid->contents == NULL
+      || offset < 0
+      || (bfd_size_type) offset > esdid->content_size
+      || offset + count > esdid->content_size)
+    return FALSE;
+
+  memcpy (location, esdid->contents + offset, (size_t) count);
 
   return TRUE;
 }
@@ -798,7 +819,11 @@ versados_canonicalize_reloc (bfd *abfd,
              /* Section relative thing.  */
              struct esdid *e = &EDATA (abfd, esdid - 1);
 
-             src[count].sym_ptr_ptr = e->section->symbol_ptr_ptr;
+             /* PR 17512: file:cd92277c.  */
+             if (e->section)
+               src[count].sym_ptr_ptr = e->section->symbol_ptr_ptr;
+             else
+               src[count].sym_ptr_ptr = bfd_und_section_ptr->symbol_ptr_ptr;
            }
          /* PR 17512: file:3757-2936-0.004.  */
          else if ((unsigned) (esdid - ES_BASE) >= bfd_get_symcount (abfd))
This page took 0.02715 seconds and 4 git commands to generate.