+2018-07-06  Max Filippov  <jcmvbkbc@gmail.com>
+
+       * elf32-xtensa.c (elf_xtensa_allocate_dynrelocs): Don't allocate
+       space for dynamic relocation for undefined weak symbol.
+       (elf_xtensa_relocate_section): Don't emit R_XTENSA_RELATIVE
+       relocation for undefined weak symbols.
+       (shrink_dynamic_reloc_sections): Don't shrink dynamic relocation
+       section for relocations against undefined weak symbols.
+
 2018-07-06  Alan Hayward  <alan.hayward@arm.com>
 
        * elf.c (elfcore_grok_aarch_sve): New function.
 
   if (! elf_xtensa_dynamic_symbol_p (h, info))
     elf_xtensa_make_sym_local (info, h);
 
+  if (! elf_xtensa_dynamic_symbol_p (h, info)
+      && h->root.type == bfd_link_hash_undefweak)
+    return TRUE;
+
   if (h->plt.refcount > 0)
     htab->elf.srelplt->size += (h->plt.refcount * sizeof (Elf32_External_Rela));
 
                        }
                      unresolved_reloc = FALSE;
                    }
-                 else
+                 else if (!is_weak_undef)
                    {
                      /* Generate a RELATIVE relocation.  */
                      outrel.r_info = ELF32_R_INFO (0, R_XTENSA_RELATIVE);
                      outrel.r_addend = 0;
                    }
+                 else
+                   {
+                     continue;
+                   }
                }
 
              loc = (srel->contents
 
   if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
       && (input_section->flags & SEC_ALLOC) != 0
-      && (dynamic_symbol || bfd_link_pic (info)))
+      && (dynamic_symbol || bfd_link_pic (info))
+      && (!h || h->root.type != bfd_link_hash_undefweak))
     {
       asection *srel;
       bfd_boolean is_plt = FALSE;