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] C6X PREL31 relocation


The attached patch implements BFD linker support the R_C6000_PREL31 
relocation.  Unlike R_ARM_PREL31 the value is a scaled offset (i.e. the high 
bits of the offset) rather than a byte offset.

Tested on c6x-elf

Ok?

2011-03-22  Paul Brook  <paul@codesourcery.com>
 
	bfd/
	* elf32-tic6x.c (elf32_tic6x_howto_table): R_C6000_PREL31 is
	pc-relative.
	(elf32_tic6x_howto_table_rel): Ditto.
	(elf32_tic6x_relocate_section): Implement R_C6000_PREL31.
	(elf32_tic6x_check_relocs): Ditto.
diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
index 1adb11b..b165346 100644
--- a/bfd/elf32-tic6x.c
+++ b/bfd/elf32-tic6x.c
@@ -433,7 +433,7 @@ static reloc_howto_type elf32_tic6x_howto_table[] =
 	 1,			/* rightshift */
 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
 	 31,			/* bitsize */
-	 FALSE,			/* pc_relative */
+	 TRUE,			/* pc_relative */
 	 0,			/* bitpos */
 	 complain_overflow_dont,/* complain_on_overflow */
 	 bfd_elf_generic_reloc,	/* special_function */
@@ -441,7 +441,7 @@ static reloc_howto_type elf32_tic6x_howto_table[] =
 	 FALSE,			/* partial_inplace */
 	 0,			/* src_mask */
 	 0x7fffffff,		/* dst_mask */
-	 FALSE),		/* pcrel_offset */
+	 TRUE),			/* pcrel_offset */
   HOWTO (R_C6000_COPY,		/* type */
 	 0,			/* rightshift */
 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
@@ -1005,7 +1005,7 @@ static reloc_howto_type elf32_tic6x_howto_table_rel[] =
 	 1,			/* rightshift */
 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
 	 31,			/* bitsize */
-	 FALSE,			/* pc_relative */
+	 TRUE,			/* pc_relative */
 	 0,			/* bitpos */
 	 complain_overflow_dont,/* complain_on_overflow */
 	 bfd_elf_generic_reloc,	/* special_function */
@@ -1013,7 +1013,7 @@ static reloc_howto_type elf32_tic6x_howto_table_rel[] =
 	 TRUE,			/* partial_inplace */
 	 0,			/* src_mask */
 	 0x7fffffff,		/* dst_mask */
-	 FALSE),		/* pcrel_offset */
+	 TRUE),			/* pcrel_offset */
   HOWTO (R_C6000_COPY,		/* type */
 	 0,			/* rightshift */
 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
@@ -2425,12 +2425,15 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
 	  break;
 
 	case R_C6000_PREL31:
-	  /* Shared libraries and exception handling support not
-	     implemented.  */
-	  (*_bfd_error_handler) (_("%B: relocation type %d not implemented"),
-				 input_bfd, r_type);
-	  ok = FALSE;
-	  continue;
+	  if (h != NULL
+	      && h->plt.offset != (bfd_vma) -1
+	      && htab->elf.splt != NULL)
+	    {
+	      relocation = (htab->elf.splt->output_section->vma
+			    + htab->elf.splt->output_offset
+			    + h->plt.offset);
+	    }
+	  break;
 
 	case R_C6000_COPY:
 	  /* Invalid in relocatable object.  */
@@ -2608,6 +2611,7 @@ elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info,
       switch (r_type)
 	{
 	case R_C6000_PCR_S21:
+	case R_C6000_PREL31:
 	  /* This symbol requires a procedure linkage table entry.  We
 	     actually build the entry in adjust_dynamic_symbol,
 	     because this might be a case of linking PIC code which is

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