diff options
-rw-r--r-- | bfd/elf32-i386.c | 9 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 9 |
2 files changed, 18 insertions, 0 deletions
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index e2f88a1..f11500f 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1335,6 +1335,15 @@ elf_i386_convert_load_reloc (bfd *abfd, Elf_Internal_Shdr *symtab_hdr, if (opcode == 0xff) { + switch (modrm & 0x38) + { + case 0x10: /* CALL */ + case 0x20: /* JMP */ + break; + default: + return true; + } + /* We have "call/jmp *foo@GOT[(%reg)]". */ if ((h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak) diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 2ed120a..abf97b2 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -1851,6 +1851,15 @@ elf_x86_64_convert_load_reloc (bfd *abfd, /* Convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX to R_X86_64_PC32. */ modrm = bfd_get_8 (abfd, contents + roff - 1); + switch (modrm & 0x38) + { + case 0x10: /* CALL */ + case 0x20: /* JMP */ + break; + default: + return true; + } + if (modrm == 0x25) { /* Convert to "jmp foo nop". */ |