[GOLD] Add --secure-plt option for ppc32
authorAlan Modra <amodra@gmail.com>
Mon, 9 Jan 2017 23:54:09 +0000 (10:24 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 10 Jan 2017 01:20:07 +0000 (11:50 +1030)
Added just to accept, and ignore.  gcc since 2015-10-21, when
configured with --enable-secureplt passes this option to the linker.
As powerpc gold cannot link --bss-plt code successfully, gold needs to
accept the option or the gcc specs file needs to be changed.

The patch also make gold detect --bss-plt code and error out rather
than producing a binary that crashes.

* 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.

gold/ChangeLog
gold/options.h
gold/powerpc.cc

index 1159f9c6aa34b6270ab7bf1d2ca9eb3c63a047c9..bf834f8da4e511cce2dde96ea038db4f244d1a1e 100644 (file)
@@ -1,3 +1,10 @@
+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
index d7ac6cdfaa98ec4b59fdda07aaf2ec0c39391244..a8b1d46aa1093e742f385eb62ce76d9666bc1024 100644 (file)
@@ -1203,6 +1203,9 @@ class General_options
   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}]"));
index 6d6d0ddee0090481482a509d3e439be0ba46ef0d..b91fb4b585138249bbb6a8ff97236bc4058de733 100644 (file)
@@ -5972,6 +5972,30 @@ Target_powerpc<size, big_endian>::Scan::local(
       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:
@@ -6473,6 +6497,20 @@ Target_powerpc<size, big_endian>::Scan::global(
       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: