Check invalid x32 relocations.
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 15 Jan 2011 15:49:48 +0000 (15:49 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 15 Jan 2011 15:49:48 +0000 (15:49 +0000)
2011-01-15  H.J. Lu  <hongjiu.lu@intel.com>

* elf64-x86-64.c (elf_x86_64_check_relocs): Check invalid x32
relocations.

bfd/ChangeLog
bfd/elf64-x86-64.c

index 37c49a370be6144bea2b58fa801a62b85a804fa7..00ff8ff9cb0985a939883ea47665231a634ffb2e 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf64-x86-64.c (elf_x86_64_check_relocs): Check invalid x32
+       relocations.
+
 2011-01-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf64-x86-64.c (elf_x86_64_link_hash_table): Add pointer_r_type.
index 579f59cd7f1113939d46397698172c58fd39cb82..9a3959ad16cd8ab428b002ccb184cf382aaeab7a 100644 (file)
@@ -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