* elf32-hppa.c (elf32_hppa_relocate_section): Set up .plt entries

for symbols forced local that need plabels.
	(elf32_hppa_adjust_dynamic_symbol): Don't allocate space in
	.plt.rela for local syms if non-shared.
	(hppa_build_one_stub): Mask lsb of plt.offset.
	(elf32_hppa_finish_dynamic_symbol): Abort if lsb of plt.offset set.
	(clobber_millicode_symbols): Correct comment.
	(elf32_hppa_relocate_section): Likewise.
	(elf32_hppa_finish_dynamic_symbol): Likewise.
This commit is contained in:
Alan Modra 2001-05-28 10:12:04 +00:00
parent 76a406e5b0
commit 8dea12685e
2 changed files with 58 additions and 17 deletions

View File

@ -1,3 +1,15 @@
2001-05-28 Alan Modra <amodra@one.net.au>
* elf32-hppa.c (elf32_hppa_relocate_section): Set up .plt entries
for symbols forced local that need plabels.
(elf32_hppa_adjust_dynamic_symbol): Don't allocate space in
.plt.rela for local syms if non-shared.
(hppa_build_one_stub): Mask lsb of plt.offset.
(elf32_hppa_finish_dynamic_symbol): Abort if lsb of plt.offset set.
(clobber_millicode_symbols): Correct comment.
(elf32_hppa_relocate_section): Likewise.
(elf32_hppa_finish_dynamic_symbol): Likewise.
2001-05-28 Jeff Sturm <jsturm@one-point.com> 2001-05-28 Jeff Sturm <jsturm@one-point.com>
* reloc.c: Add BFD_RELOC_SPARC_UA16 and BFD_RELOC_SPARC_UA64. * reloc.c: Add BFD_RELOC_SPARC_UA16 and BFD_RELOC_SPARC_UA64.

View File

@ -831,6 +831,7 @@ hppa_build_one_stub (gen_entry, in_arg)
bfd_byte *loc; bfd_byte *loc;
bfd_vma sym_value; bfd_vma sym_value;
bfd_vma insn; bfd_vma insn;
bfd_vma off;
int val; int val;
int size; int size;
@ -938,9 +939,12 @@ hppa_build_one_stub (gen_entry, in_arg)
case hppa_stub_import: case hppa_stub_import:
case hppa_stub_import_shared: case hppa_stub_import_shared:
if (stub_entry->h->elf.plt.offset >= (bfd_vma) -2) off = stub_entry->h->elf.plt.offset;
if (off >= (bfd_vma) -2)
abort (); abort ();
sym_value = (stub_entry->h->elf.plt.offset
off &= ~ (bfd_vma) 1;
sym_value = (off
+ hplink->splt->output_offset + hplink->splt->output_offset
+ hplink->splt->output_section->vma + hplink->splt->output_section->vma
- elf_gp (hplink->splt->output_section->owner)); - elf_gp (hplink->splt->output_section->owner));
@ -1014,10 +1018,10 @@ hppa_build_one_stub (gen_entry, in_arg)
<__gp>. */ <__gp>. */
bfd_put_32 (hplink->splt->owner, value, bfd_put_32 (hplink->splt->owner, value,
hplink->splt->contents + eh->elf.plt.offset); hplink->splt->contents + off);
value = elf_gp (hplink->splt->output_section->owner); value = elf_gp (hplink->splt->output_section->owner);
bfd_put_32 (hplink->splt->owner, value, bfd_put_32 (hplink->splt->owner, value,
hplink->splt->contents + eh->elf.plt.offset + 4); hplink->splt->contents + off + 4);
} }
break; break;
@ -1957,11 +1961,14 @@ elf32_hppa_adjust_dynamic_symbol (info, h)
return false; return false;
} }
/* We also need to make an entry in the .rela.plt section. */ if (h->dynindx != -1 || info->shared)
s = hplink->srelplt; {
s->_raw_size += sizeof (Elf32_External_Rela); /* We also need to make an entry in the .rela.plt section. */
s = hplink->srelplt;
s->_raw_size += sizeof (Elf32_External_Rela);
hplink->need_plt_stub = 1; hplink->need_plt_stub = 1;
}
} }
return true; return true;
} }
@ -2149,8 +2156,8 @@ clobber_millicode_symbols (h, info)
struct elf_link_hash_entry *h; struct elf_link_hash_entry *h;
struct bfd_link_info *info; struct bfd_link_info *info;
{ {
/* Note! We only want to remove these from the dynamic symbol /* We only want to remove these from the dynamic symbol table.
table. Therefore we do not set ELF_LINK_FORCED_LOCAL. */ Therefore we do not leave ELF_LINK_FORCED_LOCAL set. */
if (h->type == STT_PARISC_MILLI) if (h->type == STT_PARISC_MILLI)
{ {
unsigned short oldflags = h->elf_link_hash_flags; unsigned short oldflags = h->elf_link_hash_flags;
@ -3684,10 +3691,10 @@ elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
if (info->shared) if (info->shared)
{ {
/* Output a dynamic *ABS* relocation for this /* Output a dynamic relocation for this GOT
GOT entry. In this case it is relative to entry. In this case it is relative to the
the base of the object because the symbol base of the object because the symbol index
index is zero. */ is zero. */
Elf_Internal_Rela outrel; Elf_Internal_Rela outrel;
asection *srelgot = hplink->srelgot; asection *srelgot = hplink->srelgot;
@ -3735,6 +3742,25 @@ elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
if (h != NULL) if (h != NULL)
{ {
off = h->elf.plt.offset; off = h->elf.plt.offset;
if (!info->shared
&& (h->elf.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
{
/* In a non-shared link, adjust_dynamic_symbols
isn't called for symbols forced local. We
need to write out the plt entry here. */
if ((off & 1) != 0)
off &= ~1;
else
{
bfd_put_32 (output_bfd,
relocation,
hplink->splt->contents + off);
bfd_put_32 (output_bfd,
elf_gp (hplink->splt->output_section->owner),
hplink->splt->contents + off + 4);
h->elf.plt.offset |= 1;
}
}
} }
else else
{ {
@ -3780,7 +3806,7 @@ elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
} }
} }
if (off >= (bfd_vma) -2) if (off >= (bfd_vma) -2 || (off & 1) != 0)
abort (); abort ();
/* PLABELs contain function pointers. Relocation is to /* PLABELs contain function pointers. Relocation is to
@ -4015,6 +4041,9 @@ elf32_hppa_finish_dynamic_symbol (output_bfd, info, h, sym)
{ {
bfd_vma value; bfd_vma value;
if (h->plt.offset & 1)
abort ();
/* This symbol has an entry in the procedure linkage table. Set /* This symbol has an entry in the procedure linkage table. Set
it up. it up.
@ -4045,8 +4074,8 @@ elf32_hppa_finish_dynamic_symbol (output_bfd, info, h, sym)
{ {
/* To support lazy linking, the function pointer is /* To support lazy linking, the function pointer is
initialised to point to a special stub stored at the initialised to point to a special stub stored at the
end of the .plt. This is only done for plt entries end of the .plt. This is not done for plt entries
with a non-*ABS* dynamic relocation. */ with a base-relative dynamic relocation. */
value = (hplink->splt->output_offset value = (hplink->splt->output_offset
+ hplink->splt->output_section->vma + hplink->splt->output_section->vma
+ hplink->splt->_raw_size + hplink->splt->_raw_size