* elf-hppa.h (elf_hppa_final_link_relocate): Handle LT_OFF_FPTR*,

DIR32, DIR64 and FPTR64 relocations.
        (elf_hppa_relocate_insn): Similarly.
This commit is contained in:
Jeff Law 1999-09-09 13:01:11 +00:00
parent be7582f38a
commit e5bb3efcc5
2 changed files with 56 additions and 5 deletions

View File

@ -1,5 +1,9 @@
Wed Sep 8 17:56:11 1999 Jeffrey A Law (law@cygnus.com)
* elf-hppa.h (elf_hppa_final_link_relocate): Handle LT_OFF_FPTR*,
DIR32, DIR64 and FPTR64 relocations.
(elf_hppa_relocate_insn): Similarly.
* elf-hppa.h (elf_hppa_final_link): Set the value of __gp to the
address of the .PARISC.global section.
(elf_hppa_relocate_section): Lookup and pass the PA64 hash

View File

@ -1012,10 +1012,6 @@ elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
The list will be deleted eventually.
27210 R_PARISC_SEGREL32
6675 R_PARISC_FPTR64
3974 R_PARISC_DIR64
1584 R_PARISC_LTOFF_FPTR14DR
1565 R_PARISC_LTOFF_FPTR21L
1120 R_PARISC_PCREL64
1096 R_PARISC_LTOFF_TP14DR
982 R_PARISC_LTOFF_TP21L
@ -1067,6 +1063,14 @@ elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
case R_PARISC_DLTIND14DR:
case R_PARISC_DLTIND14WR:
case R_PARISC_DLTIND21L:
case R_PARISC_LTOFF_FPTR14R:
case R_PARISC_LTOFF_FPTR14DR:
case R_PARISC_LTOFF_FPTR14WR:
case R_PARISC_LTOFF_FPTR21L:
case R_PARISC_LTOFF_FPTR16F:
case R_PARISC_LTOFF_FPTR16WF:
case R_PARISC_LTOFF_FPTR16DF:
{
/* We want the value of the DLT offset for this symbol, not
the symbol's actual address. */
@ -1075,8 +1079,12 @@ elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
/* All DLTIND relocations are basically the same at this point,
except that we need different field selectors for the 21bit
version vs the 14bit versions. */
if (r_type == R_PARISC_DLTIND21L)
if (r_type == R_PARISC_DLTIND21L
|| r_type == R_PARISC_LTOFF_FPTR21L)
value = hppa_field_adjust (value, addend, e_lrsel);
else if (r_type == R_PARISC_LTOFF_FPTR16F
|| R_PARISC_LTOFF_FPTR16WF)
value = hppa_field_adjust (value, addend, e_fsel);
else
value = hppa_field_adjust (value, addend, e_rrsel);
@ -1105,6 +1113,38 @@ elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
break;
}
case R_PARISC_LTOFF_FPTR32:
{
/* 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;
bfd_put_32 (input_bfd, value, hit_data);
return bfd_reloc_ok;
}
case R_PARISC_LTOFF_FPTR64:
{
/* 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;
bfd_put_64 (input_bfd, value, hit_data);
return bfd_reloc_ok;
}
case R_PARISC_DIR32:
bfd_put_32 (input_bfd, value, hit_data);
return bfd_reloc_ok;
case R_PARISC_DIR64:
bfd_put_64 (input_bfd, value, hit_data);
return bfd_reloc_ok;
/* These do not require any work here. They are simply passed
through as dynamic relocations. */
case R_PARISC_FPTR64:
return bfd_reloc_ok;
/* Something we don't know how to handle. */
default:
/* ?!? This is temporary as we flesh out basic linker support, once
@ -1186,6 +1226,7 @@ elf_hppa_relocate_insn (insn, sym_value, r_type)
/* ADDIL or LDIL instructions. */
case R_PARISC_DLTREL21L:
case R_PARISC_DLTIND21L:
case R_PARISC_LTOFF_FPTR21L:
{
int w;
@ -1204,6 +1245,8 @@ elf_hppa_relocate_insn (insn, sym_value, r_type)
case R_PARISC_DLTREL14F:
case R_PARISC_DLTIND14R:
case R_PARISC_DLTIND14F:
case R_PARISC_LTOFF_FPTR14R:
case R_PARISC_LTOFF_FPTR16F:
{
int w;
@ -1220,6 +1263,8 @@ elf_hppa_relocate_insn (insn, sym_value, r_type)
/* Doubleword loads and stores with a 14bit displacement. */
case R_PARISC_DLTREL14DR:
case R_PARISC_DLTIND14DR:
case R_PARISC_LTOFF_FPTR14DR:
case R_PARISC_LTOFF_FPTR16DF:
{
int w;
@ -1242,6 +1287,8 @@ elf_hppa_relocate_insn (insn, sym_value, r_type)
/* Floating point single word load/store instructions. */
case R_PARISC_DLTREL14WR:
case R_PARISC_DLTIND14WR:
case R_PARISC_LTOFF_FPTR14WR:
case R_PARISC_LTOFF_FPTR16WF:
{
int w;