* 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:
parent
76a406e5b0
commit
8dea12685e
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue