PowerPC64 --plt-align

Alan Modra amodra@gmail.com
Mon Nov 24 02:36:00 GMT 2014


I noticed today that 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.

PowerPC64 gold doesn't have the same problem, because the fancy "don't
cross a boundary" style of padding isn't implemented there.

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.

diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 0245a2c..c1029df 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -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;
 }
diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em
index 59ea786..9646903 100644
--- a/ld/emultempl/ppc64elf.em
+++ b/ld/emultempl/ppc64elf.em
@@ -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:
diff --git a/ld/ld.texinfo b/ld/ld.texinfo
index bb386e4..502582c 100644
--- a/ld/ld.texinfo
+++ b/ld/ld.texinfo
@@ -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

-- 
Alan Modra
Australia Development Lab, IBM



More information about the Binutils mailing list