Add padding to the plt section so that its size is a multiple of its
entry size. * elf32-tilepro.c (allocate_dynrelocs): Use PLT_ENTRY_SIZE as size of header. (tilepro_plt_entry_build): Account for new header size. (tilepro_elf_finish_dynamic_sections): Ditto. (tilepro_elf_plt_sym_val): Ditto. * elfxx-tilegx.c (allocate_dynrelocs): Use PLT_ENTRY_SIZE as size of header + tail. (tilegx_elf_finish_dynamic_sections): Account for new padding.
This commit is contained in:
parent
e5b95258d9
commit
663b585012
|
@ -1,3 +1,14 @@
|
||||||
|
2012-08-28 Walter Lee <walt@tilera.com>
|
||||||
|
|
||||||
|
* elf32-tilepro.c (allocate_dynrelocs): Use PLT_ENTRY_SIZE as size
|
||||||
|
of header.
|
||||||
|
(tilepro_plt_entry_build): Account for new header size.
|
||||||
|
(tilepro_elf_finish_dynamic_sections): Ditto.
|
||||||
|
(tilepro_elf_plt_sym_val): Ditto.
|
||||||
|
* elfxx-tilegx.c (allocate_dynrelocs): Use PLT_ENTRY_SIZE as size
|
||||||
|
of header + tail.
|
||||||
|
(tilegx_elf_finish_dynamic_sections): Account for new padding.
|
||||||
|
|
||||||
2012-08-27 Walter Lee <walt@tilera.com>
|
2012-08-27 Walter Lee <walt@tilera.com>
|
||||||
|
|
||||||
* reloc.c (Add BFD_RELOC_TILEGX_IMM16_X0_HW0_PLT_PCREL,
|
* reloc.c (Add BFD_RELOC_TILEGX_IMM16_X0_HW0_PLT_PCREL,
|
||||||
|
|
|
@ -1105,7 +1105,7 @@ static int
|
||||||
tilepro_plt_entry_build (asection *splt, asection *sgotplt, bfd_vma offset,
|
tilepro_plt_entry_build (asection *splt, asection *sgotplt, bfd_vma offset,
|
||||||
bfd_vma *r_offset)
|
bfd_vma *r_offset)
|
||||||
{
|
{
|
||||||
int plt_index = (offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
|
int plt_index = (offset - PLT_ENTRY_SIZE) / PLT_ENTRY_SIZE;
|
||||||
int got_offset = plt_index * GOT_ENTRY_SIZE + GOTPLT_HEADER_SIZE;
|
int got_offset = plt_index * GOT_ENTRY_SIZE + GOTPLT_HEADER_SIZE;
|
||||||
tilepro_bundle_bits *pc;
|
tilepro_bundle_bits *pc;
|
||||||
|
|
||||||
|
@ -2193,7 +2193,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||||
/* Allocate room for the header. */
|
/* Allocate room for the header. */
|
||||||
if (s->size == 0)
|
if (s->size == 0)
|
||||||
{
|
{
|
||||||
s->size = PLT_HEADER_SIZE;
|
s->size = PLT_ENTRY_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
h->plt.offset = s->size;
|
h->plt.offset = s->size;
|
||||||
|
@ -3867,7 +3867,11 @@ tilepro_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||||
|
|
||||||
/* Fill in the first entry in the procedure linkage table. */
|
/* Fill in the first entry in the procedure linkage table. */
|
||||||
if (splt->size > 0)
|
if (splt->size > 0)
|
||||||
|
{
|
||||||
memcpy (splt->contents, tilepro_plt0_entry, PLT_HEADER_SIZE);
|
memcpy (splt->contents, tilepro_plt0_entry, PLT_HEADER_SIZE);
|
||||||
|
memset (splt->contents + PLT_HEADER_SIZE, 0,
|
||||||
|
PLT_ENTRY_SIZE - PLT_HEADER_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
elf_section_data (splt->output_section)->this_hdr.sh_entsize
|
elf_section_data (splt->output_section)->this_hdr.sh_entsize
|
||||||
= PLT_ENTRY_SIZE;
|
= PLT_ENTRY_SIZE;
|
||||||
|
@ -3924,7 +3928,7 @@ static bfd_vma
|
||||||
tilepro_elf_plt_sym_val (bfd_vma i, const asection *plt,
|
tilepro_elf_plt_sym_val (bfd_vma i, const asection *plt,
|
||||||
const arelent *rel ATTRIBUTE_UNUSED)
|
const arelent *rel ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
|
return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum elf_reloc_type_class
|
static enum elf_reloc_type_class
|
||||||
|
|
|
@ -2470,10 +2470,10 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||||
/* Allocate room for the header and tail. */
|
/* Allocate room for the header and tail. */
|
||||||
if (s->size == 0)
|
if (s->size == 0)
|
||||||
{
|
{
|
||||||
s->size = PLT_HEADER_SIZE + PLT_TAIL_SIZE;
|
s->size = PLT_ENTRY_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
h->plt.offset = s->size - PLT_TAIL_SIZE;
|
h->plt.offset = s->size - PLT_ENTRY_SIZE + PLT_HEADER_SIZE;
|
||||||
|
|
||||||
/* If this symbol is not defined in a regular file, and we are
|
/* If this symbol is not defined in a regular file, and we are
|
||||||
not generating a shared library, then set the symbol to this
|
not generating a shared library, then set the symbol to this
|
||||||
|
@ -4247,6 +4247,7 @@ tilegx_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||||
bfd *dynobj;
|
bfd *dynobj;
|
||||||
asection *sdyn;
|
asection *sdyn;
|
||||||
struct tilegx_elf_link_hash_table *htab;
|
struct tilegx_elf_link_hash_table *htab;
|
||||||
|
size_t pad_size;
|
||||||
|
|
||||||
htab = tilegx_elf_hash_table (info);
|
htab = tilegx_elf_hash_table (info);
|
||||||
BFD_ASSERT (htab != NULL);
|
BFD_ASSERT (htab != NULL);
|
||||||
|
@ -4275,10 +4276,15 @@ tilegx_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||||
tilegx64_plt0_entry : tilegx32_plt0_entry,
|
tilegx64_plt0_entry : tilegx32_plt0_entry,
|
||||||
PLT_HEADER_SIZE);
|
PLT_HEADER_SIZE);
|
||||||
|
|
||||||
memcpy (splt->contents + splt->size - PLT_TAIL_SIZE,
|
memcpy (splt->contents + splt->size
|
||||||
|
- PLT_ENTRY_SIZE + PLT_HEADER_SIZE,
|
||||||
ABI_64_P (output_bfd) ?
|
ABI_64_P (output_bfd) ?
|
||||||
tilegx64_plt_tail_entry : tilegx32_plt_tail_entry,
|
tilegx64_plt_tail_entry : tilegx32_plt_tail_entry,
|
||||||
PLT_TAIL_SIZE);
|
PLT_TAIL_SIZE);
|
||||||
|
/* Add padding so that the plt section is a multiple of its
|
||||||
|
entry size. */
|
||||||
|
pad_size = PLT_ENTRY_SIZE - PLT_HEADER_SIZE - PLT_TAIL_SIZE;
|
||||||
|
memset (splt->contents + splt->size - pad_size, 0, pad_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
elf_section_data (splt->output_section)->this_hdr.sh_entsize
|
elf_section_data (splt->output_section)->this_hdr.sh_entsize
|
||||||
|
|
Loading…
Reference in New Issue