PowerPC64 --plt-align
authorAlan Modra <amodra@gmail.com>
Mon, 24 Nov 2014 02:11:33 +0000 (12:41 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 24 Nov 2014 02:38:10 +0000 (13:08 +1030)
Alignment of plt stubs was broken, firstly because the option was
being dropped due to the alignment value not being set in the "params"
struct used in elf64-ppc.c, and secondly due to not calculating the
number of alignment boundary crossings correctly.

bfd/
* elf64-ppc.c (plt_stub_pad): Correct.
ld/
* ld.texinfo: Correct --plt-align documentation.
* emultempl/ppc64elf.em (plt_stub_align): Delete.  Use and set
params.plt_stub_align instead.

bfd/ChangeLog
bfd/elf64-ppc.c
ld/ChangeLog
ld/emultempl/ppc64elf.em
ld/ld.texinfo

index d102405..02111e6 100644 (file)
@@ -1,3 +1,7 @@
+2014-11-24  Alan Modra  <amodra@gmail.com>
+
+       * elf64-ppc.c (plt_stub_pad): Correct.
+
 2014-11-20  Alan Modra  <amodra@gmail.com>
 
        * elf64-ppc.c (group_sections): Init stub14_group_size from
index 0245a2c..c1029df 100644 (file)
@@ -10209,7 +10209,7 @@ plt_stub_pad (struct ppc_link_hash_table *htab,
   bfd_vma stub_off = stub_entry->stub_sec->size;
 
   if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
-      > (stub_size & -stub_align))
+      > ((stub_size - 1) & -stub_align))
     return stub_align - (stub_off & (stub_align - 1));
   return 0;
 }
index 5aebb9c..5ca26c2 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-24  Alan Modra  <amodra@gmail.com>
+
+       * ld.texinfo: Correct --plt-align documentation.
+       * emultempl/ppc64elf.em (plt_stub_align): Delete.  Use and set
+       params.plt_stub_align instead.
+
 2014-11-18  Igor Zamyatin  <igor.zamyatin@intel.com>
 
        * emulparams/elf_x86_64.sh (BNDPLT): Set to yes for x86_64.
index 59ea786..9646903 100644 (file)
@@ -62,9 +62,6 @@ static int no_toc_opt = 0;
 /* Whether to sort input toc and got sections.  */
 static int no_toc_sort = 0;
 
-/* Set if individual PLT call stubs should be aligned.  */
-static int plt_stub_align = 0;
-
 static asection *toc_section = 0;
 
 /* This is called before the input files are opened.  We create a new
@@ -377,7 +374,9 @@ ppc_add_stub_section (const char *stub_sec_name, asection *input_section)
                                                 stub_sec_name, flags);
   if (stub_sec == NULL
       || !bfd_set_section_alignment (stub_file->the_bfd, stub_sec,
-                                    plt_stub_align > 5 ? plt_stub_align : 5))
+                                    (params.plt_stub_align > 5
+                                     ? params.plt_stub_align
+                                     : 5)))
     goto err_ret;
 
   output_section = input_section->output_section;
@@ -800,14 +799,14 @@ PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
          unsigned long val = strtoul (optarg, &end, 0);
          if (*end || val > 8)
            einfo (_("%P%F: invalid --plt-align `%s'\''\n"), optarg);
-         plt_stub_align = val;
+         params.plt_stub_align = val;
        }
       else
-       plt_stub_align = 5;
+       params.plt_stub_align = 5;
       break;
 
     case OPTION_NO_PLT_ALIGN:
-      plt_stub_align = 0;
+      params.plt_stub_align = 0;
       break;
 
     case OPTION_STUBSYMS:
index bb386e4..502582c 100644 (file)
@@ -7052,9 +7052,10 @@ off this feature.
 @item --plt-align
 @itemx --no-plt-align
 Use these options to control whether individual PLT call stubs are
-aligned to a 32-byte boundary, or to the specified power of two
-boundary when using @code{--plt-align=}.  By default PLT call stubs
-are packed tightly.
+padded so that they don't cross a 32-byte boundary, or to the
+specified power of two boundary when using @code{--plt-align=}.  Note
+that this isn't alignment in the usual sense.  By default PLT call
+stubs are packed tightly.
 
 @cindex PowerPC64 PLT call stub static chain
 @kindex --plt-static-chain