* elf32-mips.c (_bfd_mips_elf32_gprel16_reloc): Reject
authorMaciej W. Rozycki <macro@linux-mips.org>
Fri, 11 Feb 2005 22:29:10 +0000 (22:29 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Fri, 11 Feb 2005 22:29:10 +0000 (22:29 +0000)
R_MIPS_LITERAL relocations for external symbols.
* elf64-mips.c (mips_elf64_literal_reloc): Likewise.
* elfn32-mips.c (mips_elf_literal_reloc): Likewise.

bfd/ChangeLog
bfd/elf32-mips.c
bfd/elf64-mips.c
bfd/elfn32-mips.c

index 17fe6e6e6f34d94ccb677891f57f698e3b500388..89ca22a910a59b226dfdd20ad38da43293fb45ab 100644 (file)
@@ -1,3 +1,10 @@
+2005-02-11  Maciej W. Rozycki  <macro@mips.com>
+
+       * elf32-mips.c (_bfd_mips_elf32_gprel16_reloc): Reject
+       R_MIPS_LITERAL relocations for external symbols.
+       * elf64-mips.c (mips_elf64_literal_reloc): Likewise.
+       * elfn32-mips.c (mips_elf_literal_reloc): Likewise.
+
 2005-02-11  H.J. Lu  <hongjiu.lu@intel.com>
 
        * bfd-in2.h: Rebuilt.
index 07d8ba4b5e3659c0f79b2a594b5448b437332d9e..5c259f101f32ae7f405c152e37e00c1306c37e32 100644 (file)
@@ -770,6 +770,17 @@ _bfd_mips_elf32_gprel16_reloc (bfd *abfd, arelent *reloc_entry,
   bfd_reloc_status_type ret;
   bfd_vma gp;
 
+  /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
+  if (reloc_entry->howto->type == R_MIPS_LITERAL
+      && output_bfd != NULL
+      && (symbol->flags & BSF_SECTION_SYM) == 0
+      && (symbol->flags & BSF_LOCAL) != 0)
+    {
+      *error_message = (char *)
+       _("literal relocation occurs for an external symbol");
+      return bfd_reloc_outofrange;
+    }
+
   if (output_bfd != NULL)
     relocatable = TRUE;
   else
index 74ec7cbc478a7462ed2a4818c651f19b5834c974..b36743562fa94d4bab4955a2c4c0d2d1179e0b38 100644 (file)
@@ -1543,14 +1543,14 @@ mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   bfd_reloc_status_type ret;
   bfd_vma gp;
 
-  /* If we're relocating, and this is an external symbol, we don't
-     want to change anything.  */
+  /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
   if (output_bfd != NULL
       && (symbol->flags & BSF_SECTION_SYM) == 0
       && (symbol->flags & BSF_LOCAL) != 0)
     {
-      reloc_entry->address += input_section->output_offset;
-      return bfd_reloc_ok;
+      *error_message = (char *)
+       _("literal relocation occurs for an external symbol");
+      return bfd_reloc_outofrange;
     }
 
   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
index d87c45c076dccca1e90007cac1af246a725ef2ff..228601caa5816403370e9b2f602e473844c868b3 100644 (file)
@@ -1348,6 +1348,16 @@ mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   bfd_reloc_status_type ret;
   bfd_vma gp;
 
+  /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
+  if (output_bfd != NULL
+      && (symbol->flags & BSF_SECTION_SYM) == 0
+      && (symbol->flags & BSF_LOCAL) != 0)
+    {
+      *error_message = (char *)
+       _("literal relocation occurs for an external symbol");
+      return bfd_reloc_outofrange;
+    }
+
   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
   if (output_bfd != NULL)
     relocatable = TRUE;