aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorMichael Meissner <gnu@the-meissners.org>1996-01-23 20:11:13 +0000
committerMichael Meissner <gnu@the-meissners.org>1996-01-23 20:11:13 +0000
commitd8fd85ada323236ca129497d87cccbcfba2547c2 (patch)
tree62cfffa986e58cdf72c7bd4fd5a96e92b1c9842e /bfd
parent3cbe19d280a518d398ff331eb9e8fdf829d2e6c4 (diff)
downloadgdb-d8fd85ada323236ca129497d87cccbcfba2547c2.zip
gdb-d8fd85ada323236ca129497d87cccbcfba2547c2.tar.gz
gdb-d8fd85ada323236ca129497d87cccbcfba2547c2.tar.bz2
Implement R_PPC_EMB_{SDA21,RELSDA} relocations
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog2
-rw-r--r--bfd/elf32-ppc.c13
2 files changed, 13 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d8ae120..25230aa 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -3,6 +3,8 @@ Tue Jan 23 14:33:05 1996 Michael Meissner <meissner@tiktok.cygnus.com>
* elf32-ppc.c (ppc_elf_copy_private_bfd_data): Don't complain if
the embedded bit is set on some objects and not on others. Just
or it together.
+ (ppc_elf_relocate_section): Implement R_PPC_EMB_{SDA21,RELSDA}
+ relocations.
Tue Jan 23 14:22:45 1996 Ian Lance Taylor <ian@cygnus.com>
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 9750442..541aadf 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -145,7 +145,9 @@ static boolean ppc_elf_finish_dynamic_symbol PARAMS ((bfd *,
static boolean ppc_elf_finish_dynamic_sections PARAMS ((bfd *, struct bfd_link_info *));
-#define BRANCH_PREDICT_BIT 0x200000
+#define BRANCH_PREDICT_BIT 0x200000 /* branch prediction bit for branch taken relocs */
+#define RA_REGISTER_MASK 0x001f0000 /* mask to set RA in memory instructions */
+#define RA_REGISTER_SHIFT 16 /* value to shift register by to insert RA */
/* The name of the dynamic interpreter. This is put in the .interp
section. */
@@ -2288,8 +2290,15 @@ ppc_elf_relocate_section (output_bfd, info, input_bfd, input_section,
ret = false;
continue;
}
- goto unsupported;
+
+ if (r_type == R_PPC_EMB_SDA21)
+ { /* fill in register field */
+ insn = bfd_get_32 (output_bfd, contents + offset - 2);
+ insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
+ bfd_put_32 (output_bfd, insn, contents + offset - 2);
+ }
}
+ break;
case (int)R_PPC_PLTREL24:
case (int)R_PPC_COPY: