bfd/
[deliverable/binutils-gdb.git] / bfd / elf32-arm.h
index a793d0921f8399bed0fd2e21bdfd91aaf1a82552..e32e871bff47bf0a606d8af44c4f48e8774b0a7a 100644 (file)
@@ -827,6 +827,10 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd,
 
          /* These are the only relocation types we care about.  */
          if (   r_type != R_ARM_PC24
+#ifndef OLD_ARM_ABI
+             && r_type != R_ARM_CALL
+             && r_type != R_ARM_JUMP24
+#endif
              && r_type != R_ARM_THM_PC22)
            continue;
 
@@ -864,6 +868,10 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd,
          switch (r_type)
            {
            case R_ARM_PC24:
+#ifndef OLD_ARM_ABI
+           case R_ARM_CALL:
+           case R_ARM_JUMP24:
+#endif
              /* This one is a call from arm code.  We need to look up
                 the target of the call.  If it is a thumb target, we
                 insert glue.  */
@@ -1295,6 +1303,8 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
     case R_ARM_ABS32:
     case R_ARM_REL32:
 #ifndef OLD_ARM_ABI
+    case R_ARM_CALL:
+    case R_ARM_JUMP24:
     case R_ARM_XPC25:
     case R_ARM_PREL31:
 #endif
@@ -1344,6 +1354,10 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
              || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
              || h->root.type != bfd_link_hash_undefweak)
          && r_type != R_ARM_PC24
+#ifndef OLD_ARM_ABI
+         && r_type != R_ARM_CALL
+         && r_type != R_ARM_JUMP24
+#endif
          && r_type != R_ARM_PLT32)
        {
          Elf_Internal_Rela outrel;
@@ -1416,6 +1430,8 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
        {
 #ifndef OLD_ARM_ABI
        case R_ARM_XPC25:         /* Arm BLX instruction.  */
+       case R_ARM_CALL:
+       case R_ARM_JUMP24:
 #endif
        case R_ARM_PC24:          /* Arm B/BL instruction */
        case R_ARM_PLT32:
@@ -2028,6 +2044,10 @@ arm_add_to_rel (bfd *              abfd,
          break;
 
        case R_ARM_PC24:
+#ifndef OLD_ARM_ABI
+       case R_ARM_CALL:
+       case R_ARM_JUMP24:
+#endif
          addend <<= howto->size;
          addend += increment;
 
@@ -2188,6 +2208,10 @@ elf32_arm_relocate_section (bfd *                  output_bfd,
              switch (r_type)
                {
                case R_ARM_PC24:
+#ifndef OLD_ARM_ABI
+               case R_ARM_CALL:
+               case R_ARM_JUMP24:
+#endif
                case R_ARM_ABS32:
                case R_ARM_THM_PC22:
                case R_ARM_PLT32:
@@ -2265,8 +2289,9 @@ elf32_arm_relocate_section (bfd *                  output_bfd,
              if ((! h ||
                   h->root.type != bfd_link_hash_undefined)
                  && (!((*info->callbacks->reloc_overflow)
-                       (info, name, howto->name, (bfd_vma) 0,
-                        input_bfd, input_section, rel->r_offset))))
+                       (info, (h ? &h->root : NULL), name, howto->name,
+                        (bfd_vma) 0, input_bfd, input_section,
+                        rel->r_offset))))
                  return FALSE;
              break;
 
@@ -2504,7 +2529,7 @@ elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
   if (EF_ARM_EABI_VERSION (in_flags) != EF_ARM_EABI_VERSION (out_flags))
     {
       _bfd_error_handler
-       (_("ERROR: %B is compiled for EABI version %d, whereas %B is compiled for version %d"),
+       (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
         ibfd, obfd,
         (in_flags & EF_ARM_EABIMASK) >> 24,
         (out_flags & EF_ARM_EABIMASK) >> 24);
@@ -2860,6 +2885,8 @@ elf32_arm_gc_sweep_hook (bfd *                     abfd ATTRIBUTE_UNUSED,
        case R_ARM_PC24:
        case R_ARM_PLT32:
 #ifndef OLD_ARM_ABI
+       case R_ARM_CALL:
+       case R_ARM_JUMP24:
        case R_ARM_PREL31:
 #endif
          r_symndx = ELF32_R_SYM (rel->r_info);
@@ -3003,6 +3030,8 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
          case R_ARM_PC24:
          case R_ARM_PLT32:
 #ifndef OLD_ARM_ABI
+         case R_ARM_CALL:
+         case R_ARM_JUMP24:
          case R_ARM_PREL31:
 #endif
            if (h != NULL)
@@ -3021,6 +3050,10 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
                   sure yet, because something later might force the
                   symbol local.  */
                if (r_type == R_ARM_PC24
+#ifndef OLD_ARM_ABI
+                   || r_type == R_ARM_CALL
+                   || r_type == R_ARM_JUMP24
+#endif
                    || r_type == R_ARM_PLT32)
                  h->needs_plt = 1;
 
@@ -3046,6 +3079,8 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
                && ((r_type != R_ARM_PC24
                     && r_type != R_ARM_PLT32
 #ifndef OLD_ARM_ABI
+                    && r_type != R_ARM_CALL
+                    && r_type != R_ARM_JUMP24
                     && r_type != R_ARM_PREL31
 #endif
                     && r_type != R_ARM_REL32)
@@ -3335,9 +3370,9 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
     }
   else
     /* It's possible that we incorrectly decided a .plt reloc was
-       needed for an R_ARM_PC24 reloc to a non-function sym in
-       check_relocs.  We can't decide accurately between function and
-       non-function syms in check-relocs;  Objects loaded later in
+       needed for an R_ARM_PC24 or similar reloc to a non-function sym
+       in check_relocs.  We can't decide accurately between function
+       and non-function syms in check-relocs; Objects loaded later in
        the link may change h->type.  So fix it now.  */
     h->plt.offset = (bfd_vma) -1;
 
@@ -3853,7 +3888,8 @@ elf32_arm_finish_dynamic_symbol (bfd * output_bfd, struct bfd_link_info * info,
                        splt->contents + h->plt.offset + 4 * i);
          
          /* Fill in the entry in the .rel.plt section.  */
-         rel.r_offset = (splt->output_offset
+         rel.r_offset = (splt->output_section->vma
+                         + splt->output_offset
                          + h->plt.offset + 4 * (i - 1));
          rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
        }
@@ -4046,7 +4082,16 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
            case DT_SYMTAB:
              name = ".dynsym";
              goto get_vma_if_bpabi;
-             
+           case DT_VERSYM:
+             name = ".gnu.version";
+             goto get_vma_if_bpabi;
+           case DT_VERDEF:
+             name = ".gnu.version_d";
+             goto get_vma_if_bpabi;
+           case DT_VERNEED:
+             name = ".gnu.version_r";
+             goto get_vma_if_bpabi;
+
            case DT_PLTGOT:
              name = ".got";
              goto get_vma;
This page took 0.026482 seconds and 4 git commands to generate.