x86: detect unsupported relocation types
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sun, 14 Oct 2018 03:52:06 +0000 (20:52 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 22 Oct 2018 09:51:45 +0000 (17:51 +0800)
Currently we support only relocations of type ELF64_R_TYPE or ELF32_R_TYPE.
We should be warned if other relocation types appear in the relocation
sections.

This type of message has helped to identify code overwriting a relocation
section before relocation and incorrect parsing of relocation tables.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/lib/relocate.c

index ed10755d9c1846b7313ad2e46a17b36511f97c71..4d09e4de4201f1d12ae6235e66cbb03cfcc8699a 100644 (file)
@@ -53,6 +53,15 @@ static void do_elf_reloc_fixups64(unsigned int text_base, uintptr_t size,
        Elf64_Addr *offset_ptr_ram;
 
        do {
+               unsigned long long type = ELF64_R_TYPE(re_src->r_info);
+
+               if (type != R_X86_64_RELATIVE) {
+                       printf("%s: unsupported relocation type 0x%llx "
+                              "at %p, ", __func__, type, re_src);
+                       printf("offset = 0x%llx\n", re_src->r_offset);
+                       continue;
+               }
+
                /* Get the location from the relocation entry */
                offset_ptr_rom = (Elf64_Addr *)(uintptr_t)re_src->r_offset;
 
@@ -91,6 +100,15 @@ static void do_elf_reloc_fixups32(unsigned int text_base, uintptr_t size,
        Elf32_Addr *offset_ptr_ram;
 
        do {
+               unsigned int type = ELF32_R_TYPE(re_src->r_info);
+
+               if (type != R_386_RELATIVE) {
+                       printf("%s: unsupported relocation type 0x%x "
+                              "at %p, ", __func__, type, re_src);
+                       printf("offset = 0x%x\n", re_src->r_offset);
+                       continue;
+               }
+
                /* Get the location from the relocation entry */
                offset_ptr_rom = (Elf32_Addr *)(uintptr_t)re_src->r_offset;