]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[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, 21 Feb 2017 23:10:23 +0000 (09:40 +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 b15e358975635e203449ad1a96815cc4420d87af..879081115656e0a7c0b272f56f1dfdd81ffb9870 100644 (file)
@@ -1,6 +1,12 @@
 2017-02-22  Alan Modra  <amodra@gmail.com>
 
        Apply from master
+       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
        ".rela.plt" at ".plt".
index a652a86d3b676b7b3e96d2887a8430d3c97220da..6786e9378e9e96ace63f21687ec669fe2f91eba2 100644 (file)
@@ -1069,6 +1069,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 8c3e5bbf559f6d9e5611b1ef892e4a2f70aac45c..5a5c7f4438831a2476d4fab2e9527d695acfb677 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: