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] Support for ARM ABS32_NOI and REL32_NOI relocations


This one provides bfd support for the ARM ABS32_NOI and REL32_NOI
relocations.  No regressions on arm-none-linux-gnueabi.

OK?

Mark

--

2006-08-24 Mark Shinwell <shinwell@codesourcery.com>

        bfd/
        * elf32-arm.c (elf32_arm_final_link_relocate): Add cases
        for R_ARM_ABS32_NOI and R_ARM_REL32_NOI.
        (elf32_arm_gc_sweep_hook): Likewise.
        (elf32_arm_check_relocs): Likewise.
        (allocate_dynrelocs): Likewise.
Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.87
diff -U3 -p -r1.87 elf32-arm.c
--- bfd/elf32-arm.c	22 Aug 2006 13:18:03 -0000	1.87
+++ bfd/elf32-arm.c	24 Aug 2006 15:28:50 -0000
@@ -3626,7 +3626,9 @@ elf32_arm_final_link_relocate (reloc_how
 
     case R_ARM_PC24:
     case R_ARM_ABS32:
+    case R_ARM_ABS32_NOI:
     case R_ARM_REL32:
+    case R_ARM_REL32_NOI:
     case R_ARM_CALL:
     case R_ARM_JUMP24:
     case R_ARM_XPC25:
@@ -3642,7 +3644,8 @@ elf32_arm_final_link_relocate (reloc_how
 	 will use the symbol's value, which may point to a PLT entry, but we
 	 don't need to handle that here.  If we created a PLT entry, all
 	 branches in this object should go to it.  */
-      if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32)
+      if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32
+           && r_type != R_ARM_ABS32_NOI && r_type != R_ARM_REL32_NOI)
 	  && h != NULL
 	  && splt != NULL
 	  && h->plt.offset != (bfd_vma) -1)
@@ -3666,7 +3669,7 @@ elf32_arm_final_link_relocate (reloc_how
 	 run time.  */
       if ((info->shared || globals->root.is_relocatable_executable)
 	  && (input_section->flags & SEC_ALLOC)
-	  && (r_type != R_ARM_REL32
+	  && ((r_type != R_ARM_REL32 && r_type != R_ARM_REL32_NOI)
 	      || !SYMBOL_CALLS_LOCAL (info, h))
 	  && (h == NULL
 	      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
@@ -3880,6 +3883,10 @@ elf32_arm_final_link_relocate (reloc_how
 	    value |= 1;
 	  break;
 
+	case R_ARM_ABS32_NOI:
+	  value += addend;
+	  break;
+
 	case R_ARM_REL32:
 	  value += addend;
 	  if (sym_flags == STT_ARM_TFUNC)
@@ -3888,6 +3895,12 @@ elf32_arm_final_link_relocate (reloc_how
 		    + input_section->output_offset + rel->r_offset);
 	  break;
 
+	case R_ARM_REL32_NOI:
+	  value += addend;
+	  value -= (input_section->output_section->vma
+		    + input_section->output_offset + rel->r_offset);
+	  break;
+
 	case R_ARM_PREL31:
 	  value -= (input_section->output_section->vma
 		    + input_section->output_offset + rel->r_offset);
@@ -6712,7 +6725,9 @@ elf32_arm_gc_sweep_hook (bfd *          
 	  break;
 
 	case R_ARM_ABS32:
+	case R_ARM_ABS32_NOI:
 	case R_ARM_REL32:
+	case R_ARM_REL32_NOI:
 	case R_ARM_PC24:
 	case R_ARM_PLT32:
 	case R_ARM_CALL:
@@ -6745,14 +6760,17 @@ elf32_arm_gc_sweep_hook (bfd *          
 		}
 
 	      if (r_type == R_ARM_ABS32
-		  || r_type == R_ARM_REL32)
+		  || r_type == R_ARM_REL32
+                  || r_type == R_ARM_ABS32_NOI
+                  || r_type == R_ARM_REL32_NOI)
 		{
 		  for (pp = &eh->relocs_copied; (p = *pp) != NULL;
 		       pp = &p->next)
 		  if (p->section == sec)
 		    {
 		      p->count -= 1;
-		      if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32)
+		      if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32
+                          || ELF32_R_TYPE (rel->r_info) == R_ARM_REL32_NOI)
 			p->pc_count -= 1;
 		      if (p->count == 0)
 			*pp = p->next;
@@ -6930,7 +6948,9 @@ elf32_arm_check_relocs (bfd *abfd, struc
 	    /* Fall through */
 
 	  case R_ARM_ABS32:
+	  case R_ARM_ABS32_NOI:
 	  case R_ARM_REL32:
+	  case R_ARM_REL32_NOI:
 	  case R_ARM_PC24:
 	  case R_ARM_PLT32:
 	  case R_ARM_CALL:
@@ -6961,7 +6981,10 @@ elf32_arm_check_relocs (bfd *abfd, struc
 		   refers to is in a different object.  We can't tell for
 		   sure yet, because something later might force the
 		   symbol local.  */
-		if (r_type != R_ARM_ABS32 && r_type != R_ARM_REL32)
+		if (r_type != R_ARM_ABS32
+                    && r_type != R_ARM_REL32
+                    && r_type != R_ARM_ABS32_NOI
+                    && r_type != R_ARM_REL32_NOI)
 		  h->needs_plt = 1;
 
 		/* If we create a PLT entry, this relocation will reference
@@ -6986,7 +7009,7 @@ elf32_arm_check_relocs (bfd *abfd, struc
                relocs_copied field of the hash table entry.  */
 	    if ((info->shared || htab->root.is_relocatable_executable)
 		&& (sec->flags & SEC_ALLOC) != 0
-		&& (r_type == R_ARM_ABS32
+		&& ((r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI)
 		    || (h != NULL && ! h->needs_plt
 			&& (! info->symbolic || ! h->def_regular))))
 	      {
@@ -7070,7 +7093,7 @@ elf32_arm_check_relocs (bfd *abfd, struc
 		    p->pc_count = 0;
 		  }
 
-		if (r_type == R_ARM_REL32)
+		if (r_type == R_ARM_REL32 || r_type == R_ARM_REL32_NOI)
 		  p->pc_count += 1;
 		p->count += 1;
 	      }
@@ -7605,12 +7628,12 @@ allocate_dynrelocs (struct elf_link_hash
 
   if (info->shared || htab->root.is_relocatable_executable)
     {
-      /* The only reloc that uses pc_count is R_ARM_REL32, which will
-	 appear on something like ".long foo - .".  We want calls to
-	 protected symbols to resolve directly to the function rather
-	 than going via the plt.  If people want function pointer
-	 comparisons to work as expected then they should avoid
-	 writing assembly like ".long foo - .".  */
+      /* The only reloc thats uses pc_count are R_ARM_REL32 and
+         R_ARM_REL32_NOI, which will appear on something like
+         ".long foo - .".  We want calls to protected symbols to resolve
+         directly to the function rather than going via the plt.  If people
+         want function pointer comparisons to work as expected then they
+         should avoid writing assembly like ".long foo - .".  */
       if (SYMBOL_CALLS_LOCAL (info, h))
 	{
 	  struct elf32_arm_relocs_copied **pp;

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