This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] MIPS/BFD: Handle MIPS16 GOT16 and GPREL16 relocs correctly


Hi,

 While making microMIPS changes I have come across several places where 
MIPS16 GOT16 and GPREL16 relocs are not recognised where their standard 
MIPS counterpars are.  This is a bug, because MIPS16 relocs are by 
definition handled the same as their standard MIPS counterparts and 
separate relocs have only been defined because of the odd different layout 
of relocatable fields in MIPS16 instructions.

 Regression-tested succesfully on mips-sde-elf and mips-linux-gnu targets.

2010-07-26  Maciej W. Rozycki  <macro@codesourcery.com>

	bfd/
	* elfxx-mips.h: Include "elf/mips.h".
	(gprel16_reloc_p): New inline function.
	* elfxx-mips.c (_bfd_mips_elf_check_relocs)
	[R_MIPS16_GOT16, R_MIPS_GOT16, R_MIPS_GOT_HI16, R_MIPS_GOT_LO16]: 
	Use got16_reloc_p.
	(_bfd_mips_elf_relocate_section)[bfd_reloc_overflow]: Use 
	gprel16_reloc_p.
	* elf32-mips.c (mips_info_to_howto_rel): Likewise.
	* elfn32-mips.c (mips_info_to_howto_rel): Likewise.

 OK to apply?

  Maciej

binutils-mips-gp16.diff
Index: binutils-fsf-trunk-quilt/bfd/elfxx-mips.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/bfd/elfxx-mips.c	2010-07-24 02:25:04.000000000 +0100
+++ binutils-fsf-trunk-quilt/bfd/elfxx-mips.c	2010-07-24 02:25:13.000000000 +0100
@@ -7727,7 +7727,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, s
 		  howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, FALSE);
 		  addend = mips_elf_read_rel_addend (abfd, rel,
 						     howto, contents);
-		  if (r_type == R_MIPS_GOT16)
+		  if (got16_reloc_p (r_type))
 		    mips_elf_add_lo16_rel_addend (abfd, rel, rel_end,
 						  contents, &addend);
 		  else
@@ -9196,7 +9196,7 @@ _bfd_mips_elf_relocate_section (bfd *out
 	      BFD_ASSERT (htab != NULL);
 	      BFD_ASSERT (name != NULL);
 	      if (!htab->small_data_overflow_reported
-		  && (howto->type == R_MIPS_GPREL16
+		  && (gprel16_reloc_p (howto->type)
 		      || howto->type == R_MIPS_LITERAL))
 		{
 		  msg = _("small-data section exceeds 64KB;"
Index: binutils-fsf-trunk-quilt/bfd/elf32-mips.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/bfd/elf32-mips.c	2010-07-24 02:25:04.000000000 +0100
+++ binutils-fsf-trunk-quilt/bfd/elf32-mips.c	2010-07-24 02:25:13.000000000 +0100
@@ -1422,8 +1422,7 @@ mips_info_to_howto_rel (bfd *abfd, arele
      when we do the relocation, because the symbol manipulations done
      by the linker may cause us to lose track of the input BFD.  */
   if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
-      && (r_type == (unsigned int) R_MIPS_GPREL16
-	  || r_type == (unsigned int) R_MIPS_LITERAL))
+      && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
     cache_ptr->addend = elf_gp (abfd);
 }
 
Index: binutils-fsf-trunk-quilt/bfd/elfxx-mips.h
===================================================================
--- binutils-fsf-trunk-quilt.orig/bfd/elfxx-mips.h	2010-07-24 02:25:04.000000000 +0100
+++ binutils-fsf-trunk-quilt/bfd/elfxx-mips.h	2010-07-24 02:25:13.000000000 +0100
@@ -21,6 +21,7 @@
 
 #include "elf/common.h"
 #include "elf/internal.h"
+#include "elf/mips.h"
 
 extern bfd_boolean _bfd_mips_elf_new_section_hook
   (bfd *, asection *);
@@ -153,6 +154,12 @@ extern const struct bfd_elf_special_sect
 
 extern bfd_boolean _bfd_mips_elf_common_definition (Elf_Internal_Sym *);
 
+static inline bfd_boolean
+gprel16_reloc_p (unsigned int r_type)
+{
+  return r_type == R_MIPS_GPREL16 || r_type == R_MIPS16_GPREL;
+}
+
 #define elf_backend_common_definition   _bfd_mips_elf_common_definition
 #define elf_backend_name_local_section_symbols \
   _bfd_mips_elf_name_local_section_symbols
Index: binutils-fsf-trunk-quilt/bfd/elfn32-mips.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/bfd/elfn32-mips.c	2010-07-24 02:25:13.000000000 +0100
+++ binutils-fsf-trunk-quilt/bfd/elfn32-mips.c	2010-07-24 02:25:13.000000000 +0100
@@ -2259,8 +2259,7 @@ mips_info_to_howto_rel (bfd *abfd, arele
      when we do the relocation, because the symbol manipulations done
      by the linker may cause us to lose track of the input BFD.  */
   if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
-      && (r_type == (unsigned int) R_MIPS_GPREL16
-	  || r_type == (unsigned int) R_MIPS_LITERAL))
+      && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
     cache_ptr->addend = elf_gp (abfd);
 }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]