+2018-01-18 Alan Modra <amodra@gmail.com>
+
+ * elf32-ppc.c (ppc_elf_create_glink): Correct alignment of .glink.
+ * elf64-ppc.c (ppc64_elf_size_stubs): Handle negative plt_stub_align.
+ (ppc64_elf_build_stubs): Likewise.
+
2018-01-17 Nick Clifton <nickc@redhat.com>
* po/ru.po: Updated Russian translation.
struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
asection *s;
flagword flags;
+ int p2align;
flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY | SEC_HAS_CONTENTS
| SEC_IN_MEMORY | SEC_LINKER_CREATED);
s = bfd_make_section_anyway_with_flags (abfd, ".glink", flags);
htab->glink = s;
+ p2align = htab->params->ppc476_workaround ? 6 : 4;
+ if (p2align < htab->params->plt_stub_align)
+ p2align = htab->params->plt_stub_align;
if (s == NULL
- || !bfd_set_section_alignment (abfd, s,
- htab->params->ppc476_workaround ? 6 : 4))
+ || !bfd_set_section_alignment (abfd, s, p2align))
return FALSE;
if (!info->no_ld_generated_unwind_info)
if (htab->params->plt_stub_align != 0)
for (group = htab->group; group != NULL; group = group->next)
if (group->stub_sec != NULL)
- group->stub_sec->size = ((group->stub_sec->size
- + (1 << htab->params->plt_stub_align) - 1)
- & -(1 << htab->params->plt_stub_align));
+ {
+ int align = abs (htab->params->plt_stub_align);
+ group->stub_sec->size
+ = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
+ }
for (group = htab->group; group != NULL; group = group->next)
if (group->stub_sec != NULL
if (htab->params->plt_stub_align != 0)
for (group = htab->group; group != NULL; group = group->next)
if ((stub_sec = group->stub_sec) != NULL)
- stub_sec->size = ((stub_sec->size
- + (1 << htab->params->plt_stub_align) - 1)
- & -(1 << htab->params->plt_stub_align));
+ {
+ int align = abs (htab->params->plt_stub_align);
+ stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
+ }
for (group = htab->group; group != NULL; group = group->next)
if ((stub_sec = group->stub_sec) != NULL)
+2018-01-18 Alan Modra <amodra@gmail.com>
+
+ * powerpc.cc (param_plt_align): New function supplying default
+ --plt-align values. Use it..
+ (Stub_table::plt_call_align): ..here, and..
+ (Output_data_glink::global_entry_align): ..here.
+ (Stub_table::stub_align): Correct 32-bit minimum alignment.
+
2018-01-17 Alan Modra <amodra@gmail.com>
* options.h (speculate_indirect_jumps): New option.
return p;
}
+template<int size>
+static inline unsigned int
+param_plt_align()
+{
+ if (!parameters->options().user_set_plt_align())
+ return size == 64 ? 32 : 8;
+ return 1 << parameters->options().plt_align();
+}
+
// Stub_table holds information about plt and long branch stubs.
// Stubs are built in an area following some input section determined
// by group_sections(). This input section is converted to a relaxed
unsigned int
stub_align() const
{
- unsigned int min_align = 4;
- if (!parameters->options().user_set_plt_align())
- return size == 64 ? 32 : min_align;
+ unsigned int min_align = size == 64 ? 32 : 16;
unsigned int user_align = 1 << parameters->options().plt_align();
return std::max(user_align, min_align);
}
unsigned int
plt_call_align(unsigned int bytes) const
{
- unsigned int align = this->stub_align();
+ unsigned int align = param_plt_align<size>();
return (bytes + align - 1) & -align;
}
unsigned int
global_entry_align(unsigned int off) const
{
- unsigned int align = 1 << parameters->options().plt_align();
- if (!parameters->options().user_set_plt_align())
- align = size == 64 ? 32 : 4;
+ unsigned int align = param_plt_align<size>();
return (off + align - 1) & -align;
}
+2018-01-18 Alan Modra <amodra@gmail.com>
+
+ * emultempl/ppc32elf.em: Support optional --plt-align arg.
+ * emultempl/ppc64elf.em: Support negative --plt-align arg.
+
2018-01-17 Alan Modra <amodra@gmail.com>
* emultempl/ppc32elf.em (params): Init new field.
{ "bss-plt", no_argument, NULL, OPTION_OLD_PLT },
{ "speculate-indirect-jumps", no_argument, NULL, OPTION_SPECULATE_INDIRECT_JUMPS },
{ "no-speculate-indirect-jumps", no_argument, NULL, OPTION_NO_SPECULATE_INDIRECT_JUMPS },
- { "plt-align", no_argument, NULL, OPTION_PLT_ALIGN },
+ { "plt-align", optional_argument, NULL, OPTION_PLT_ALIGN },
{ "no-plt-align", no_argument, NULL, OPTION_NO_PLT_ALIGN },
{ "sdata-got", no_argument, NULL, OPTION_OLD_GOT },'
fi
break;
case OPTION_PLT_ALIGN:
- params.plt_stub_align = 5;
+ if (optarg != NULL)
+ {
+ char *end;
+ unsigned long val = strtoul (optarg, &end, 0);
+ if (*end || val > 5)
+ einfo (_("%P%F: invalid --plt-align `%s'\''\n"), optarg);
+ params.plt_stub_align = val;
+ }
+ else
+ params.plt_stub_align = 5;
break;
case OPTION_NO_PLT_ALIGN:
if (optarg != NULL)
{
char *end;
- unsigned long val = strtoul (optarg, &end, 0);
- if (*end || val > 8)
+ long val = strtol (optarg, &end, 0);
+ if (*end || (unsigned long) val + 8 > 16)
einfo (_("%P%F: invalid --plt-align `%s'\''\n"), optarg);
params.plt_stub_align = val;
}