2004-10-27 Richard Earnshaw <rearnsha@arm.com>
authorPaul Brook <paul@codesourcery.com>
Wed, 27 Oct 2004 20:48:22 +0000 (20:48 +0000)
committerPaul Brook <paul@codesourcery.com>
Wed, 27 Oct 2004 20:48:22 +0000 (20:48 +0000)
bfd/
* elf32-arm.h (bfd_elf32_arm_process_before_allocation): Handle
R_ARM_CALL and R_ARM_JUMP24 as aliases of R_ARM_PC24.
(elf32_arm_final_link_relocate): Ditto.
(arm_add_to_rel, elf32_arm_relocate_section): Ditto.
(elf32_arm_gc_sweep_hook, elf32_arm_check_relocs): Ditto
(elf32_arm_adjust_dynamic_symbol): Ditto.
* elfarm-nabi.c (elf32_arm_howto_table): Add R_ARM_CALL and
R_ARM_JUMP32.  Move R_ARM_R{REL32,ABS32,PC24,BASE}...
(elf32_arm_r_howto): ... To here.
(elf32_arm_howto_from_type): Use elf32_arm_r_howto.
include/
* elf/arm.h: Add R_ARM_CALL and R_ARM_JUMP32.

bfd/ChangeLog
bfd/elf32-arm.h
bfd/elfarm-nabi.c
include/ChangeLog
include/elf/arm.h

index 7e9d0855a2c0a725ad3a5d9d25b824a0169aad27..1b084520ae40044fe978efdd0d3a8f811100f9e1 100644 (file)
@@ -1,3 +1,16 @@
+2004-10-27  Richard Earnshaw  <rearnsha@arm.com>
+
+       * elf32-arm.h (bfd_elf32_arm_process_before_allocation): Handle
+       R_ARM_CALL and R_ARM_JUMP24 as aliases of R_ARM_PC24.
+       (elf32_arm_final_link_relocate): Ditto.
+       (arm_add_to_rel, elf32_arm_relocate_section): Ditto.
+       (elf32_arm_gc_sweep_hook, elf32_arm_check_relocs): Ditto
+       (elf32_arm_adjust_dynamic_symbol): Ditto.
+       * elfarm-nabi.c (elf32_arm_howto_table): Add R_ARM_CALL and
+       R_ARM_JUMP32.  Move R_ARM_R{REL32,ABS32,PC24,BASE}...
+       (elf32_arm_r_howto): ... To here.
+       (elf32_arm_howto_from_type): Use elf32_arm_r_howto.
+
 2004-10-26  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR 475
index 0d9ae49ca30a90bea1e453ef38e039349e0324af..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:
@@ -2861,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);
@@ -3004,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)
@@ -3022,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;
 
@@ -3047,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)
@@ -3336,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;
 
index 8b09cea6bc591d683854f10fe5e0f2511d3c9504..4c22f42996d2507d44dfbda6cc630d44138b1f68 100644 (file)
@@ -453,37 +453,35 @@ static reloc_howto_type elf32_arm_howto_table[] =
          0x00ffffff,           /* dst_mask */
          TRUE),                        /* pcrel_offset */
 
-  /* End of relocs used in ARM Linux */
-
-  HOWTO (R_ARM_RREL32,         /* type */
-        0,                     /* rightshift */
-        0,                     /* size (0 = byte, 1 = short, 2 = long) */
-        0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+  HOWTO (R_ARM_CALL,           /* type */
+        2,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        24,                    /* bitsize */
+        TRUE,                  /* pc_relative */
         0,                     /* bitpos */
-        complain_overflow_dont,/* complain_on_overflow */
+        complain_overflow_signed,/* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
-        "R_ARM_RREL32",        /* name */
+        "R_ARM_CALL",          /* name */
         FALSE,                 /* partial_inplace */
-        0,                     /* src_mask */
-        0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        0x00ffffff,            /* src_mask */
+        0x00ffffff,            /* dst_mask */
+        TRUE),                 /* pcrel_offset */
 
-  HOWTO (R_ARM_RABS32,         /* type */
-        0,                     /* rightshift */
-        0,                     /* size (0 = byte, 1 = short, 2 = long) */
-        0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+  HOWTO (R_ARM_JUMP24,         /* type */
+        2,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        24,                    /* bitsize */
+        TRUE,                  /* pc_relative */
         0,                     /* bitpos */
-        complain_overflow_dont,/* complain_on_overflow */
+        complain_overflow_signed,/* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
-        "R_ARM_RABS32",        /* name */
+        "R_ARM_JUMP24",        /* name */
         FALSE,                 /* partial_inplace */
-        0,                     /* src_mask */
-        0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        0x00ffffff,            /* src_mask */
+        0x00ffffff,            /* dst_mask */
+        TRUE),                 /* pcrel_offset */
 
-  HOWTO (R_ARM_RPC24,          /* type */
+  HOWTO (R_ARM_NONE,           /* type */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
@@ -491,13 +489,13 @@ static reloc_howto_type elf32_arm_howto_table[] =
         0,                     /* bitpos */
         complain_overflow_dont,/* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
-        "R_ARM_RPC24",         /* name */
+        "R_ARM_unknown_30",    /* name */
         FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
         FALSE),                /* pcrel_offset */
 
-  HOWTO (R_ARM_RBASE,          /* type */
+  HOWTO (R_ARM_NONE,           /* type */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
@@ -505,7 +503,7 @@ static reloc_howto_type elf32_arm_howto_table[] =
         0,                     /* bitpos */
         complain_overflow_dont,/* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
-        "R_ARM_RBASE",         /* name */
+        "R_ARM_unknown_31",    /* name */
         FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
@@ -746,6 +744,66 @@ static reloc_howto_type elf32_arm_got_prel =
         0xffffffff,            /* dst_mask */
         TRUE);                 /* pcrel_offset */
 
+/* Currently unused relocations.  */
+static reloc_howto_type elf32_arm_r_howto[4] =
+{
+  HOWTO (R_ARM_RREL32,         /* type */
+        0,                     /* rightshift */
+        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        0,                     /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont,/* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_ARM_RREL32",        /* name */
+        FALSE,                 /* partial_inplace */
+        0,                     /* src_mask */
+        0,                     /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  HOWTO (R_ARM_RABS32,         /* type */
+        0,                     /* rightshift */
+        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        0,                     /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont,/* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_ARM_RABS32",        /* name */
+        FALSE,                 /* partial_inplace */
+        0,                     /* src_mask */
+        0,                     /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  HOWTO (R_ARM_RPC24,          /* type */
+        0,                     /* rightshift */
+        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        0,                     /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont,/* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_ARM_RPC24",         /* name */
+        FALSE,                 /* partial_inplace */
+        0,                     /* src_mask */
+        0,                     /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  HOWTO (R_ARM_RBASE,          /* type */
+        0,                     /* rightshift */
+        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        0,                     /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont,/* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_ARM_RBASE",         /* name */
+        FALSE,                 /* partial_inplace */
+        0,                     /* src_mask */
+        0,                     /* dst_mask */
+        FALSE)                 /* pcrel_offset */
+};
+
 static reloc_howto_type *
 elf32_arm_howto_from_type (unsigned int r_type)
 {
@@ -769,6 +827,12 @@ elf32_arm_howto_from_type (unsigned int r_type)
     case R_ARM_THM_PC9:
       return &elf32_arm_thm_pc9_howto;
 
+    case R_ARM_RREL32:
+    case R_ARM_RABS32:
+    case R_ARM_RPC24:
+    case R_ARM_RBASE:
+      return &elf32_arm_r_howto[r_type - R_ARM_RREL32];
+
     default:
       return NULL;
     }
index 24a80330586a53356e1fdee29db068fabaa49178..c5739c935b9c52b3504cec53711475382283c443 100644 (file)
@@ -1,3 +1,7 @@
+2004-10-27  Richard Earnshaw  <rearnsha@arm.com>
+
+       * elf/arm.h: Add R_ARM_CALL and R_ARM_JUMP32.
+
 2004-10-27  Tomer Levi  <Tomer.Levi@nsc.com>
 
        * opcode/crx.h (enum reg): Rearrange registers, remove 'ccfg' and `'pc'.
index 9055f622de115dcb8e0440fb22a0fc36248f50d1..edff571a790025e2f47cf682205a2c2f5389d2c9 100644 (file)
@@ -123,7 +123,9 @@ START_RELOC_NUMBERS (elf_arm_reloc_type)
   FAKE_RELOC   (FIRST_INVALID_RELOC,   28)
   FAKE_RELOC   (LAST_INVALID_RELOC,   249)
 #else /* not OLD_ARM_ABI */
-  FAKE_RELOC   (FIRST_INVALID_RELOC1,  28)
+  RELOC_NUMBER (R_ARM_CALL,            28)
+  RELOC_NUMBER (R_ARM_JUMP24,          29)
+  FAKE_RELOC   (FIRST_INVALID_RELOC1,  30)
   FAKE_RELOC   (LAST_INVALID_RELOC1,   31)
   RELOC_NUMBER (R_ARM_ALU_PCREL7_0,    32)
   RELOC_NUMBER (R_ARM_ALU_PCREL15_8,   33)