Symbol*);
 
     void
-    check_non_pic(Relobj*, unsigned int r_type);
+    check_non_pic(Relobj*, unsigned int r_type, Symbol*);
 
     inline bool
     possible_function_pointer_reloc(unsigned int r_type);
 // Here we know the section is allocated, but we don't know that it is
 // read-only.  But we check for all the relocation types which the
 // glibc dynamic linker supports, so it seems appropriate to issue an
-// error even if the section is not read-only.
+// error even if the section is not read-only.  If GSYM is not NULL,
+// it is the symbol the relocation is against; if it is NULL, the
+// relocation is against a local symbol.
 
 void
-Target_x86_64::Scan::check_non_pic(Relobj* object, unsigned int r_type)
+Target_x86_64::Scan::check_non_pic(Relobj* object, unsigned int r_type,
+                                  Symbol* gsym)
 {
   switch (r_type)
     {
       return;
 
       // glibc supports these reloc types, but they can overflow.
-    case elfcpp::R_X86_64_32:
     case elfcpp::R_X86_64_PC32:
+      // A PC relative reference is OK against a local symbol or if
+      // the symbol is defined locally.
+      if (gsym == NULL
+         || (!gsym->is_from_dynobj()
+             && !gsym->is_undefined()
+             && !gsym->is_preemptible()))
+       return;
+      /* Fall through.  */
+    case elfcpp::R_X86_64_32:
       if (this->issued_non_pic_error_)
        return;
       gold_assert(parameters->options().output_is_position_independent());
-      object->error(_("requires dynamic reloc which may overflow at runtime; "
-                     "recompile with -fPIC"));
+      if (gsym == NULL)
+       object->error(_("requires dynamic R_X86_64_32 reloc which may "
+                       "overflow at runtime; recompile with -fPIC"));
+      else
+       object->error(_("requires dynamic %s reloc against '%s' which may "
+                       "overflow at runtime; recompile with -fPIC"),
+                     (r_type == elfcpp::R_X86_64_32
+                      ? "R_X86_64_32"
+                      : "R_X86_64_PC32"),
+                     gsym->name());
       this->issued_non_pic_error_ = true;
       return;
 
       if (this->issued_non_pic_error_)
         return;
       gold_assert(parameters->options().output_is_position_independent());
-      object->error(_("requires unsupported dynamic reloc; "
-                      "recompile with -fPIC"));
+      object->error(_("requires unsupported dynamic reloc %u; "
+                      "recompile with -fPIC"),
+                   r_type);
       this->issued_non_pic_error_ = true;
       return;
 
       // because that is always a 64-bit relocation.
       if (parameters->options().output_is_position_independent())
         {
-          this->check_non_pic(object, r_type);
+          this->check_non_pic(object, r_type, NULL);
 
           Reloc_section* rela_dyn = target->rela_dyn_section(layout);
          unsigned int r_sym = elfcpp::elf_r_sym<64>(reloc.get_r_info());
                  }
                 else
                   {
-                    this->check_non_pic(object, r_type);
+                    this->check_non_pic(object, r_type, NULL);
 
                     gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
                     rela_dyn->add_local(
               }
             else
               {
-                this->check_non_pic(object, r_type);
+                this->check_non_pic(object, r_type, gsym);
                 Reloc_section* rela_dyn = target->rela_dyn_section(layout);
                 rela_dyn->add_global(gsym, r_type, output_section, object,
                                      data_shndx, reloc.get_r_offset(),
               }
             else
               {
-                this->check_non_pic(object, r_type);
+                this->check_non_pic(object, r_type, gsym);
                 Reloc_section* rela_dyn = target->rela_dyn_section(layout);
                 rela_dyn->add_global(gsym, r_type, output_section, object,
                                      data_shndx, reloc.get_r_offset(),