diff options
-rw-r--r-- | bfd/ChangeLog | 4 | ||||
-rw-r--r-- | bfd/elf-hppa.h | 57 |
2 files changed, 56 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 3e5b8e0..de48586 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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 diff --git a/bfd/elf-hppa.h b/bfd/elf-hppa.h index 2cc46c6..a73d273 100644 --- a/bfd/elf-hppa.h +++ b/bfd/elf-hppa.h @@ -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; |