* elf-hppa.h (elf_hppa_final_link_relocate): Get the right

value for the stub address in a call through a stub.
        Install the value for a local symbol directly into the DLT
        instead of generating a reloc.  Correctly handle FPTR64 relocs.
This commit is contained in:
Jeff Law 1999-09-10 14:05:36 +00:00
parent af7dc6449e
commit 6a0b987115
2 changed files with 28 additions and 3 deletions

View file

@ -1,5 +1,10 @@
Fri Sep 10 00:35:14 1999 Jeffrey A Law (law@cygnus.com)
* elf-hppa.h (elf_hppa_final_link_relocate): Get the right
value for the stub address in a call through a stub.
Install the value for a local symbol directly into the DLT
instead of generating a reloc. Correctly handle FPTR64 relocs.
* elf-hppa.h (elf_hppa_unmark_useless_dynamic_symbols): New function.
(elf_hppa_remark_useless_dynamic_symbols): Similarly.
(elf_hppa_final_link): Call them.

View file

@ -1171,7 +1171,8 @@ elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
library, then redirect the call to the local stub for this
function. */
if (sym_sec->output_section == NULL)
value = dyn_h->stub_offset;
value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
+ hppa_info->stub_sec->output_section->vma);
/* Turn VALUE into a proper PC relative address. */
value -= (offset + input_section->output_offset
@ -1213,6 +1214,20 @@ elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
case R_PARISC_LTOFF16WF:
case R_PARISC_LTOFF16DF:
{
/* If this relocation was against a local symbol, then we still
have not set up the DLT entry (it's not convienent to do so
in the "finalize_dlt" routine because it is difficult to get
to the local symbol's value).
So, if this is a local symbol (h == NULL), then we need to
fill in its DLT entry. */
if (dyn_h->h == NULL)
{
bfd_put_64 (hppa_info->dlt_sec->owner,
value,
hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
}
/* We want the value of the DLT offset for this symbol, not
the symbol's actual address. */
value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
@ -1417,9 +1432,14 @@ elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
}
/* These do not require any work here. They are simply passed
through as dynamic relocations. */
case R_PARISC_FPTR64:
/* We want the value of the OPD offset for this symbol, not
the symbol's actual address. */
value = (dyn_h->opd_offset
+ hppa_info->opd_sec->output_offset
+ hppa_info->opd_sec->output_section->vma);
bfd_put_64 (input_bfd, value + addend, hit_data);
return bfd_reloc_ok;
/* Something we don't know how to handle. */