diff options
author | Alan Modra <amodra@gmail.com> | 2013-12-03 17:48:31 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2013-12-03 18:02:44 +1030 |
commit | 00f412ee52ff042dd349118443ef289175669b7d (patch) | |
tree | a155f8e280ecd281baa74beea8009a3676b9ab50 | |
parent | caf26be91a584ef141ac5d3cb31007731af8b8e3 (diff) | |
download | gdb-00f412ee52ff042dd349118443ef289175669b7d.zip gdb-00f412ee52ff042dd349118443ef289175669b7d.tar.gz gdb-00f412ee52ff042dd349118443ef289175669b7d.tar.bz2 |
More PowerPC64 ELFv2 --just-symbols fixes
I don't know what I was thinking here to omit the save of r2.
Possibly I was looking at -msave-toc-indirect code at the time, where
r2 is saved in the function prologue.
* elf64-ppc.c (ppc_build_one_stub <ppc_stub_plt_branch_r2off>):
Don't omit saving of r2 for ELFv2. Don't addi 2,2,0.
(ppc_size_one_stub <ppc_stub_plt_branch_r2off>): Adjust to suit.
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 30 |
2 files changed, 21 insertions, 15 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e213a15..a9420cd 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,11 @@ 2013-12-03 Alan Modra <amodra@gmail.com> + * elf64-ppc.c (ppc_build_one_stub <ppc_stub_plt_branch_r2off>): + Don't omit saving of r2 for ELFv2. Don't addi 2,2,0. + (ppc_size_one_stub <ppc_stub_plt_branch_r2off>): Adjust to suit. + +2013-12-03 Alan Modra <amodra@gmail.com> + * elf64-ppc.c (ppc64_elf_link_just_syms): Remove .got check. Handle ELFv2. diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 4bbb70f..f30c009 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -10597,8 +10597,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) r[0].r_offset = loc - stub_entry->stub_sec->contents; if (bfd_big_endian (info->output_bfd)) r[0].r_offset += 2; - if (stub_entry->stub_type == ppc_stub_plt_branch_r2off - && htab->opd_abi) + if (stub_entry->stub_type == ppc_stub_plt_branch_r2off) r[0].r_offset += 4; r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS); r[0].r_addend = dest; @@ -10611,8 +10610,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) } } - if (stub_entry->stub_type != ppc_stub_plt_branch_r2off - || !htab->opd_abi) + if (stub_entry->stub_type != ppc_stub_plt_branch_r2off) { if (PPC_HA (off) != 0) { @@ -10631,7 +10629,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) { bfd_vma r2off = get_r2off (info, stub_entry); - if (r2off == 0) + if (r2off == 0 && htab->opd_abi) { htab->stub_error = TRUE; return FALSE; @@ -10639,28 +10637,29 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) bfd_put_32 (htab->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc); loc += 4; - size = 20; + size = 16; if (PPC_HA (off) != 0) { size += 4; bfd_put_32 (htab->stub_bfd, ADDIS_R11_R2 | PPC_HA (off), loc); loc += 4; bfd_put_32 (htab->stub_bfd, LD_R12_0R11 | PPC_LO (off), loc); - loc += 4; } else - { - bfd_put_32 (htab->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc); - loc += 4; - } + bfd_put_32 (htab->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc); if (PPC_HA (r2off) != 0) { size += 4; + loc += 4; bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc); + } + if (PPC_LO (r2off) != 0) + { + size += 4; loc += 4; + bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc); } - bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc); } loc += 4; bfd_put_32 (htab->stub_bfd, MTCTR_R12, loc); @@ -10954,8 +10953,7 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) stub_entry->stub_sec->flags |= SEC_RELOC; } - if (stub_entry->stub_type != ppc_stub_plt_branch_r2off - || !htab->opd_abi) + if (stub_entry->stub_type != ppc_stub_plt_branch_r2off) { size = 12; if (PPC_HA (off) != 0) @@ -10963,12 +10961,14 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) } else { - size = 20; + size = 16; if (PPC_HA (off) != 0) size += 4; if (PPC_HA (r2off) != 0) size += 4; + if (PPC_LO (r2off) != 0) + size += 4; } } else if (info->emitrelocations) |