+2017-01-10  Alan Modra  <amodra@gmail.com>
+
+       * options.h: Add --secure-plt option.
+       * powerpc.cc (Target_powerpc::Scan::local): Detect and error
+       on -fPIC -mbss-plt code.
+       (Target_powerpc::Scan::global): Likewise.
+
 2017-01-09  Alan Modra  <amodra@gmail.com>
 
        * powerpc.cc (Target_powerpc::make_plt_section): Point sh_info of
 
   DEFINE_special(section_start, options::TWO_DASHES, '\0',
                 N_("Set address of section"), N_("SECTION=ADDRESS"));
 
+  DEFINE_bool(secure_plt, options::TWO_DASHES , '\0', true,
+             N_("(PowerPC only) Use new-style PLT"), NULL);
+
   DEFINE_optional_string(sort_common, options::TWO_DASHES, '\0', NULL,
                         N_("Sort common symbols by alignment"),
                         N_("[={ascending,descending}]"));
 
       break;
     }
 
+  if (size == 32)
+    {
+      switch (r_type)
+       {
+       case elfcpp::R_POWERPC_REL32:
+         if (ppc_object->got2_shndx() != 0
+             && parameters->options().output_is_position_independent())
+           {
+             unsigned int shndx = lsym.get_st_shndx();
+             unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
+             bool is_ordinary;
+             shndx = ppc_object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
+             if (is_ordinary && shndx == ppc_object->got2_shndx()
+                 && (ppc_object->section_flags(data_shndx)
+                     & elfcpp::SHF_EXECINSTR) != 0)
+               gold_error(_("%s: unsupported -mbss-plt code"),
+                          ppc_object->name().c_str());
+           }
+         break;
+       default:
+         break;
+       }
+    }
+
   switch (r_type)
     {
     case elfcpp::R_POWERPC_GOT_TLSLD16:
       break;
     }
 
+  if (size == 32)
+    {
+      switch (r_type)
+       {
+       case elfcpp::R_PPC_LOCAL24PC:
+         if (strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
+           gold_error(_("%s: unsupported -mbss-plt code"),
+                      ppc_object->name().c_str());
+         break;
+       default:
+         break;
+       }
+    }
+
   switch (r_type)
     {
     case elfcpp::R_POWERPC_GOT_TLSLD16: