From d1534d1688372ff30dce2c9ff00afe6582f7cc3c Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 15 Jan 2011 15:49:48 +0000 Subject: [PATCH] Check invalid x32 relocations. 2011-01-15 H.J. Lu * elf64-x86-64.c (elf_x86_64_check_relocs): Check invalid x32 relocations. --- bfd/ChangeLog | 5 +++++ bfd/elf64-x86-64.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 37c49a370be..00ff8ff9cb0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2011-01-15 H.J. Lu + + * elf64-x86-64.c (elf_x86_64_check_relocs): Check invalid x32 + relocations. + 2011-01-14 H.J. Lu * elf64-x86-64.c (elf_x86_64_link_hash_table): Add pointer_r_type. diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 579f59cd7f1..9a3959ad16c 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -1179,6 +1179,39 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, h = (struct elf_link_hash_entry *) h->root.u.i.link; } + /* Check invalid x32 relocations. */ + if (!ABI_64_P (abfd)) + switch (r_type) + { + default: + break; + + case R_X86_64_64: + case R_X86_64_DTPOFF64: + case R_X86_64_TPOFF64: + case R_X86_64_PC64: + case R_X86_64_GOTOFF64: + case R_X86_64_GOT64: + case R_X86_64_GOTPCREL64: + case R_X86_64_GOTPC64: + case R_X86_64_GOTPLT64: + case R_X86_64_PLTOFF64: + { + if (h) + name = h->root.root.string; + else + name = bfd_elf_sym_name (abfd, symtab_hdr, isym, + NULL); + (*_bfd_error_handler) + (_("%B: relocation %s against symbol `%s' isn't " + "supported in x32 mode"), abfd, + x86_64_elf_howto_table[r_type].name, name); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + break; + } + if (h != NULL) { /* Create the ifunc sections for static executables. If we -- 2.30.2