summaryrefslogtreecommitdiff
path: root/bfd/elf-hppa.h
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>1999-09-09 14:20:18 +0000
committerJeff Law <law@redhat.com>1999-09-09 14:20:18 +0000
commit9485257cabf8e0483aed3f6759b0246de0637486 (patch)
tree146d095da5aeb8b09caf7f314660c793057e87a4 /bfd/elf-hppa.h
parent8536ac1940c070d93b84d8d328f2a298d1aac76f (diff)
downloadbinutils-redhat-9485257cabf8e0483aed3f6759b0246de0637486.tar.gz
* elf-hppa.h (elf_hppa_final_link_relocate): Handle PLTOFF* relocs.
(elf_hppa_relocate_insn): Similarly.
Diffstat (limited to 'bfd/elf-hppa.h')
-rw-r--r--bfd/elf-hppa.h40
1 files changed, 38 insertions, 2 deletions
diff --git a/bfd/elf-hppa.h b/bfd/elf-hppa.h
index c8dab6c632..765e4e729d 100644
--- a/bfd/elf-hppa.h
+++ b/bfd/elf-hppa.h
@@ -1012,8 +1012,6 @@ elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
The list will be deleted eventually.
27210 R_PARISC_SEGREL32
- 772 R_PARISC_PLTOFF14DR
- 386 R_PARISC_PLTOFF21L
6 R_PARISC_LTOFF64
5 R_PARISC_SEGREL64 */
@@ -1182,6 +1180,36 @@ elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
break;
}
+ case R_PARISC_PLTOFF21L:
+ case R_PARISC_PLTOFF14R:
+ case R_PARISC_PLTOFF14F:
+ case R_PARISC_PLTOFF14WR:
+ case R_PARISC_PLTOFF14DR:
+ case R_PARISC_PLTOFF16F:
+ case R_PARISC_PLTOFF16WF:
+ case R_PARISC_PLTOFF16DF:
+ {
+ /* We want the value of the PLT offset for this symbol, not
+ the symbol's actual address. */
+ value = dyn_h->plt_offset + hppa_info->plt_sec->output_offset;
+
+ /* All PLTOFF 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_PLTOFF21L)
+ value = hppa_field_adjust (value, addend, e_lrsel);
+ else if (r_type == R_PARISC_PLTOFF14F
+ || r_type == R_PARISC_PLTOFF16F
+ || r_type == R_PARISC_PLTOFF16WF
+ || r_type == R_PARISC_PLTOFF16DF)
+ value = hppa_field_adjust (value, addend, e_fsel);
+ else
+ value = hppa_field_adjust (value, addend, e_rrsel);
+
+ insn = elf_hppa_relocate_insn (insn, value, r_type);
+ break;
+ }
+
case R_PARISC_LTOFF_FPTR32:
{
/* We want the value of the DLT offset for this symbol, not
@@ -1348,6 +1376,7 @@ elf_hppa_relocate_insn (insn, sym_value, r_type)
case R_PARISC_PCREL21L:
case R_PARISC_LTOFF_TP21L:
case R_PARISC_DPREL21L:
+ case R_PARISC_PLTOFF21L:
{
int w;
@@ -1377,6 +1406,9 @@ elf_hppa_relocate_insn (insn, sym_value, r_type)
case R_PARISC_DPREL14R:
case R_PARISC_DPREL14F:
case R_PARISC_GPREL16F:
+ case R_PARISC_PLTOFF14R:
+ case R_PARISC_PLTOFF14F:
+ case R_PARISC_PLTOFF16F:
{
int w;
@@ -1401,6 +1433,8 @@ elf_hppa_relocate_insn (insn, sym_value, r_type)
case R_PARISC_LTOFF_TP16DF:
case R_PARISC_DPREL14DR:
case R_PARISC_GPREL16DF:
+ case R_PARISC_PLTOFF14DR:
+ case R_PARISC_PLTOFF16DF:
{
int w;
@@ -1431,6 +1465,8 @@ elf_hppa_relocate_insn (insn, sym_value, r_type)
case R_PARISC_LTOFF_TP16WF:
case R_PARISC_DPREL14WR:
case R_PARISC_GPREL16WF:
+ case R_PARISC_PLTOFF14WR:
+ case R_PARISC_PLTOFF16WF:
{
int w;