]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
R_PPC64_GOT_LO_DS and R_PPC64_GOT_HA sanity check
authorAlan Modra <amodra@gmail.com>
Thu, 15 Oct 2020 22:56:32 +0000 (09:26 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 28 Jan 2021 01:22:39 +0000 (11:52 +1030)
The previous sanity check allowed a ld on the HA reloc and addis
on the LO_DS.

* elf64-ppc.c (ppc64_elf_relocate_section): Tighten sanity check
on R_PPC64_GOT_LO_DS and R_PPC64_GOT_HA instructions.

(cherry picked from commit fba8689ad3b72a3e895ebd41485d747dba5da811)

bfd/ChangeLog
bfd/elf64-ppc.c

index 4d94806609c790c74d25fbe14bdfbf54dc76283c..2350c2f20f8767b8585d8bdfe18f7d8c96b565a5 100644 (file)
@@ -1,6 +1,10 @@
 2021-01-28  Alan Modra  <amodra@gmail.com>
 
        Apply from master
+       2020-10-16  Alan Modra  <amodra@gmail.com>
+       * elf64-ppc.c (ppc64_elf_relocate_section): Tighten sanity check
+       on R_PPC64_GOT_LO_DS and R_PPC64_GOT_HA instructions.
+
        2020-08-25  Alan Modra  <amodra@gmail.com>
        PR 26489
        * elf64-ppc.c (ppc64_elf_size_stubs): Test code_sec->has_toc_reloc
index f1bce4a70381f8ab6281e1572b017229d23aadbd..fe9e54820f1489f4f8243f92622be55c31e30b0b 100644 (file)
@@ -16087,14 +16087,16 @@ ppc64_elf_relocate_section (bfd *output_bfd,
              && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
            {
              insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
-             if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
+             if (r_type == R_PPC64_GOT16_LO_DS
+                 && (insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
                {
                  insn += (14u << 26) - (58u << 26);
                  bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
                  r_type = R_PPC64_TOC16_LO;
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
                }
-             else if ((insn & (0x3fu << 26)) == 15u << 26 /* addis */)
+             else if (r_type == R_PPC64_GOT16_HA
+                      && (insn & (0x3fu << 26)) == 15u << 26 /* addis */)
                {
                  r_type = R_PPC64_TOC16_HA;
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);