diff options
author | Michael Meissner <gnu@the-meissners.org> | 1996-01-23 20:11:13 +0000 |
---|---|---|
committer | Michael Meissner <gnu@the-meissners.org> | 1996-01-23 20:11:13 +0000 |
commit | d8fd85ada323236ca129497d87cccbcfba2547c2 (patch) | |
tree | 62cfffa986e58cdf72c7bd4fd5a96e92b1c9842e /bfd/elf32-ppc.c | |
parent | 3cbe19d280a518d398ff331eb9e8fdf829d2e6c4 (diff) | |
download | gdb-d8fd85ada323236ca129497d87cccbcfba2547c2.zip gdb-d8fd85ada323236ca129497d87cccbcfba2547c2.tar.gz gdb-d8fd85ada323236ca129497d87cccbcfba2547c2.tar.bz2 |
Implement R_PPC_EMB_{SDA21,RELSDA} relocations
Diffstat (limited to 'bfd/elf32-ppc.c')
-rw-r--r-- | bfd/elf32-ppc.c | 13 |
1 files changed, 11 insertions, 2 deletions
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: |