This is the mail archive of the binutils@sources.redhat.com 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]

[arm] VxWorks target support


The attached patch adds support for the arm-vxworks target. Mostly mechanical, 
plus some changes fixing RELA relocations.

Tested on arm-none-elf --enable-targets=all.
Ok?

Paul

2005-01-06  Paul Brook  <paul@codesourcery.com>

bfd/
 * config.bfd: Add entry for arm-*-vxworks and arm-*-windiss.
 * configure.in: Add bfd_elf32_{big,little}arm_vxworks_vec.
 * configure: Regenerate.
 * elf32-arm.c: Add VxWorks target bfd.
 (USE_REL): Remove.
 (elf32_arm_link_hash_table): Add use_rel.
 (elf32_arm_link_hash_table_create, elf32_arm_final_link_relocate,
 elf32_arm_relocate_section): Replace USE_REL with runtime check.
 Correct offset calculation for RELA case.
 (elf_backend_may_use_rel_p, elf_backend_may_use_rela_p,
 elf_backend_default_use_rela_p, elf_backend_rela_normal): Define.
 (elf32_arm_vxworks_link_hash_table_create): New function.
 * targets.c (bfd_elf32_bigarm_vxworks_vec): Add declaration.
 (bfd_elf32_littlearm_vxworks_vec): Ditto.
 (_bfd_target_vector): Add bfd_elf32_{big,little}arm_vxworks_vec.
gas/
 * config/tc-arm.c (FPU_DEFAULT): Define for TE_VXWORKS.
 (md_begin): Handle TE_VXWORKS for FP defaults.
 (md_apply_fix3): Correct rela offsets.
 (elf32_arm_target_format): Add VxWorks targets.
ld/
 * Makefie.am: Add earmelf_vxworks.
 * Makefile.in: Regenerate.
 * configure.tgt: Make arm-*-vxworks a separate case.
 * emulparams/armelf_vxworks.sh: New function.
Index: bfd/config.bfd
===================================================================
RCS file: /cvs/src/src/bfd/config.bfd,v
retrieving revision 1.179
diff -u -p -r1.179 config.bfd
--- bfd/config.bfd	16 Dec 2004 16:02:56 -0000	1.179
+++ bfd/config.bfd	6 Jan 2005 14:23:05 -0000
@@ -236,11 +236,15 @@ case "${targ}" in
     targ_selvecs=bfd_elf32_bigarm_vec
     ;;
   arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \
-  arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \
+  arm*-*-uclinux* | arm-*-kfreebsd*-gnu | \
   arm*-*-eabi* )
     targ_defvec=bfd_elf32_littlearm_vec
     targ_selvecs=bfd_elf32_bigarm_vec
     ;;
+  arm*-*-vxworks | arm*-*-windiss)
+    targ_defvec=bfd_elf32_littlearm_vxworks_vec
+    targ_selvecs=bfd_elf32_bigarm_vxworks_vec
+    ;;
   arm*-*-symbianelf*)
     targ_defvec=bfd_elf32_littlearm_symbian_vec
     targ_selvecs=bfd_elf32_bigarm_symbian_vec
Index: bfd/configure.in
===================================================================
RCS file: /cvs/src/src/bfd/configure.in,v
retrieving revision 1.165
diff -u -p -r1.165 configure.in
--- bfd/configure.in	8 Nov 2004 13:17:35 -0000	1.165
+++ bfd/configure.in	6 Jan 2005 14:23:07 -0000
@@ -584,6 +584,8 @@ do
     bfd_elf32_bigarm_vec)	tb="$tb elf32-arm.lo elf32.lo $elf" ;;
     bfd_elf32_bigarm_symbian_vec)	
                                 tb="$tb elf32-arm.lo elf32.lo $elf" ;;
+    bfd_elf32_bigarm_vxworks_vec)	
+                                tb="$tb elf32-arm.lo elf32.lo $elf" ;;
     bfd_elf32_bigmips_vec) 	tb="$tb elf32-mips.lo elfxx-mips.lo elf32.lo $elf ecofflink.lo" ;;
     bfd_elf32_cr16c_vec)	tb="$tb elf32-cr16c.lo elf32.lo $elf" ;;
     bfd_elf32_cris_vec)		tb="$tb elf32-cris.lo elf32.lo $elf" ;;
@@ -612,6 +614,8 @@ do
     bfd_elf32_littlearc_vec)	tb="$tb elf32-arc.lo elf32.lo $elf" ;;
     bfd_elf32_littlearm_symbian_vec)
                                 tb="$tb elf32-arm.lo elf32.lo $elf" ;;
+    bfd_elf32_littlearm_vxworks_vec)
+                                tb="$tb elf32-arm.lo elf32.lo $elf" ;;
     bfd_elf32_littlearm_vec)	tb="$tb elf32-arm.lo elf32.lo $elf" ;;
     bfd_elf32_littlemips_vec) 	tb="$tb elf32-mips.lo elfxx-mips.lo elf32.lo $elf ecofflink.lo" ;;
     bfd_elf32_m32r_vec)		tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.14
diff -u -p -r1.14 elf32-arm.c
--- bfd/elf32-arm.c	31 Dec 2004 16:22:25 -0000	1.14
+++ bfd/elf32-arm.c	6 Jan 2005 14:23:09 -0000
@@ -1,5 +1,5 @@
 /* 32-bit ELF support for ARM
-   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
+   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -28,8 +28,6 @@
 #define NUM_ELEM(a)  (sizeof (a) / (sizeof (a)[0]))
 #endif
 
-#define USE_REL	1
-
 #define elf_info_to_howto               0
 #define elf_info_to_howto_rel           elf32_arm_info_to_howto
 
@@ -987,10 +985,6 @@ elf32_arm_nabi_grok_psinfo (abfd, note)
 #define elf_backend_grok_prstatus	elf32_arm_nabi_grok_prstatus
 #define elf_backend_grok_psinfo		elf32_arm_nabi_grok_psinfo
 
-#ifndef USE_REL
-#define USE_REL	0
-#endif
-
 typedef unsigned long int insn32;
 typedef unsigned short int insn16;
 
@@ -1180,6 +1174,9 @@ struct elf32_arm_link_hash_table
     /* True if the target system is Symbian OS.  */
     int symbian_p;
 
+    /* True if the target uses REL relocations.  */
+    int use_rel;
+
     /* Short-cuts to get to dynamic linker sections.  */
     asection *sgot;
     asection *sgotplt;
@@ -1389,6 +1386,7 @@ elf32_arm_link_hash_table_create (bfd *a
   ret->plt_entry_size = 12;
 #endif
   ret->symbian_p = 0;
+  ret->use_rel = 1;
   ret->sym_sec.abfd = NULL;
   ret->obfd = abfd;
 
@@ -2288,20 +2286,21 @@ elf32_arm_final_link_relocate (reloc_how
   local_got_offsets = elf_local_got_offsets (input_bfd);
   r_symndx = ELF32_R_SYM (rel->r_info);
 
-#if USE_REL
-  addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
-
-  if (addend & ((howto->src_mask + 1) >> 1))
+  if (globals->use_rel)
     {
-      signed_addend = -1;
-      signed_addend &= ~ howto->src_mask;
-      signed_addend |= addend;
+      addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
+
+      if (addend & ((howto->src_mask + 1) >> 1))
+	{
+	  signed_addend = -1;
+	  signed_addend &= ~ howto->src_mask;
+	  signed_addend |= addend;
+	}
+      else
+	signed_addend = addend;
     }
   else
-    signed_addend = addend;
-#else
-  addend = signed_addend = rel->r_addend;
-#endif
+    addend = signed_addend = rel->r_addend;
 
   switch (r_type)
     {
@@ -2508,7 +2507,11 @@ elf32_arm_final_link_relocate (reloc_how
 	  value -= (input_section->output_section->vma
 		    + input_section->output_offset);
 	  value -= rel->r_offset;
-	  value += (signed_addend << howto->size);
+	  if (globals->use_rel)
+	    value += (signed_addend << howto->size);
+	  else
+	    /* RELA addends do not have to be adjusted by howto->size.  */
+	    value += signed_addend;
 
 	  signed_addend = value;
 	  signed_addend >>= howto->rightshift;
@@ -2602,12 +2605,13 @@ elf32_arm_final_link_relocate (reloc_how
 
     case R_ARM_THM_ABS5:
       /* Support ldr and str instructions for the thumb.  */
-#if USE_REL
-      /* Need to refetch addend.  */
-      addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
-      /* ??? Need to determine shift amount from operand size.  */
-      addend >>= howto->rightshift;
-#endif
+      if (globals->use_rel)
+	{
+	  /* Need to refetch addend.  */
+	  addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
+	  /* ??? Need to determine shift amount from operand size.  */
+	  addend >>= howto->rightshift;
+	}
       value += addend;
 
       /* ??? Isn't value unsigned?  */
@@ -2634,17 +2638,16 @@ elf32_arm_final_link_relocate (reloc_how
 	bfd_vma check;
 	bfd_signed_vma signed_check;
 
-#if USE_REL
 	/* Need to refetch the addend and squish the two 11 bit pieces
 	   together.  */
-	{
-	  bfd_vma upper = upper_insn & 0x7ff;
-	  bfd_vma lower = lower_insn & 0x7ff;
-	  upper = (upper ^ 0x400) - 0x400; /* Sign extend.  */
-	  addend = (upper << 12) | (lower << 1);
-	  signed_addend = addend;
-	}
-#endif
+	if (globals->use_rel)
+	  {
+	    bfd_vma upper = upper_insn & 0x7ff;
+	    bfd_vma lower = lower_insn & 0x7ff;
+	    upper = (upper ^ 0x400) - 0x400; /* Sign extend.  */
+	    addend = (upper << 12) | (lower << 1);
+	    signed_addend = addend;
+	  }
 #ifndef OLD_ARM_ABI
 	if (r_type == R_ARM_THM_XPC22)
 	  {
@@ -2735,22 +2738,23 @@ elf32_arm_final_link_relocate (reloc_how
 	bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
 	bfd_signed_vma signed_check;
 
-#if USE_REL
-	/* Need to refetch addend.  */
-	addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
-	if (addend & ((howto->src_mask + 1) >> 1))
+	if (globals->use_rel)
 	  {
-	    signed_addend = -1;
-	    signed_addend &= ~ howto->src_mask;
-	    signed_addend |= addend;
+	    /* Need to refetch addend.  */
+	    addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
+	    if (addend & ((howto->src_mask + 1) >> 1))
+	      {
+		signed_addend = -1;
+		signed_addend &= ~ howto->src_mask;
+		signed_addend |= addend;
+	      }
+	    else
+	      signed_addend = addend;
+	    /* The value in the insn has been right shifted.  We need to
+	       undo this, so that we can perform the address calculation
+	       in terms of bytes.  */
+	    signed_addend <<= howto->rightshift;
 	  }
-	else
-	  signed_addend = addend;
-	/* The value in the insn has been right shifted.  We need to
-	   undo this, so that we can perform the address calculation
-	   in terms of bytes.  */
-	signed_addend <<= howto->rightshift;
-#endif
 	relocation = value + signed_addend;
 
 	relocation -= (input_section->output_section->vma
@@ -2780,11 +2784,12 @@ elf32_arm_final_link_relocate (reloc_how
 	bfd_vma relocation;
 
 	insn = bfd_get_32 (input_bfd, hit_data);
-#if USE_REL
-	/* Extract the addend.  */
-	addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
-	signed_addend = addend;
-#endif
+	if (globals->use_rel)
+	  {
+	    /* Extract the addend.  */
+	    addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
+	    signed_addend = addend;
+	  }
 	relocation = value + signed_addend;
 
 	relocation -= (input_section->output_section->vma
@@ -2985,7 +2990,6 @@ elf32_arm_final_link_relocate (reloc_how
     }
 }
 
-#if USE_REL
 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS.  */
 static void
 arm_add_to_rel (bfd *              abfd,
@@ -3059,7 +3063,6 @@ arm_add_to_rel (bfd *              abfd,
       bfd_put_32 (abfd, contents, address);
     }
 }
-#endif /* USE_REL */
 
 /* Relocate an ARM ELF section.  */
 static bfd_boolean
@@ -3079,12 +3082,10 @@ elf32_arm_relocate_section (bfd *       
   const char *name;
   struct elf32_arm_link_hash_table * globals;
 
-#if !USE_REL
-  if (info->relocatable)
+  globals = elf32_arm_hash_table (info);
+  if (info->relocatable && !globals->use_rel)
     return TRUE;
-#endif
 
-  globals = elf32_arm_hash_table (info);
   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
   sym_hashes = elf_sym_hashes (input_bfd);
 
@@ -3113,8 +3114,7 @@ elf32_arm_relocate_section (bfd *       
       bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
       howto = bfd_reloc.howto;
 
-#if USE_REL
-      if (info->relocatable)
+      if (info->relocatable && globals->use_rel)
 	{
 	  /* This is a relocatable link.  We don't have to change
 	     anything, unless the reloc is against a section symbol,
@@ -3135,7 +3135,6 @@ elf32_arm_relocate_section (bfd *       
 
 	  continue;
 	}
-#endif
 
       /* This is a final link.  */
       h = NULL;
@@ -3146,48 +3145,49 @@ elf32_arm_relocate_section (bfd *       
 	{
 	  sym = local_syms + r_symndx;
 	  sec = local_sections[r_symndx];
-#if USE_REL
-	  relocation = (sec->output_section->vma
-			+ sec->output_offset
-			+ sym->st_value);
-	  if ((sec->flags & SEC_MERGE)
-		   && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
+	  if (globals->use_rel)
 	    {
-	      asection *msec;
-	      bfd_vma addend, value;
-
-	      if (howto->rightshift)
+	      relocation = (sec->output_section->vma
+			    + sec->output_offset
+			    + sym->st_value);
+	      if ((sec->flags & SEC_MERGE)
+		       && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
 		{
-		  (*_bfd_error_handler)
-		    (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
-		     input_bfd, input_section,
-		     (long) rel->r_offset, howto->name);
-		  return FALSE;
-		}
+		  asection *msec;
+		  bfd_vma addend, value;
 
-	      value = bfd_get_32 (input_bfd, contents + rel->r_offset);
+		  if (howto->rightshift)
+		    {
+		      (*_bfd_error_handler)
+			(_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
+			 input_bfd, input_section,
+			 (long) rel->r_offset, howto->name);
+		      return FALSE;
+		    }
 
-	      /* Get the (signed) value from the instruction.  */
-	      addend = value & howto->src_mask;
-	      if (addend & ((howto->src_mask + 1) >> 1))
-		{
-		  bfd_signed_vma mask;
+		  value = bfd_get_32 (input_bfd, contents + rel->r_offset);
+
+		  /* Get the (signed) value from the instruction.  */
+		  addend = value & howto->src_mask;
+		  if (addend & ((howto->src_mask + 1) >> 1))
+		    {
+		      bfd_signed_vma mask;
 
-		  mask = -1;
-		  mask &= ~ howto->src_mask;
-		  addend |= mask;
+		      mask = -1;
+		      mask &= ~ howto->src_mask;
+		      addend |= mask;
+		    }
+		  msec = sec;
+		  addend =
+		    _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
+		    - relocation;
+		  addend += msec->output_section->vma + msec->output_offset;
+		  value = (value & ~ howto->dst_mask) | (addend & howto->dst_mask);
+		  bfd_put_32 (input_bfd, value, contents + rel->r_offset);
 		}
-	      msec = sec;
-	      addend =
-		_bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
-		- relocation;
-	      addend += msec->output_section->vma + msec->output_offset;
-	      value = (value & ~ howto->dst_mask) | (addend & howto->dst_mask);
-	      bfd_put_32 (input_bfd, value, contents + rel->r_offset);
 	    }
-#else
-	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
-#endif
+	  else
+	    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
 	}
       else
 	{
@@ -5734,14 +5734,62 @@ const struct elf_size_info elf32_arm_siz
 #define elf_backend_plt_readonly    1
 #define elf_backend_want_got_plt    1
 #define elf_backend_want_plt_sym    0
-#if !USE_REL
-#define elf_backend_rela_normal     1
-#endif
+#define elf_backend_may_use_rel_p   1
+#define elf_backend_may_use_rela_p  0
+#define elf_backend_default_use_rela_p 0
+#define elf_backend_rela_normal     0
 
 #define elf_backend_got_header_size	12
 
 #include "elf32-target.h"
 
+/* VxWorks Targets */
+
+#undef TARGET_LITTLE_SYM
+#define TARGET_LITTLE_SYM               bfd_elf32_littlearm_vxworks_vec
+#undef TARGET_LITTLE_NAME
+#define TARGET_LITTLE_NAME              "elf32-littlearm-vxworks"
+#undef TARGET_BIG_SYM
+#define TARGET_BIG_SYM                  bfd_elf32_bigarm_vxworks_vec
+#undef TARGET_BIG_NAME
+#define TARGET_BIG_NAME                 "elf32-bigarm-vxworks"
+
+/* Like elf32_arm_link_hash_table_create -- but overrides
+   appropriately for VxWorks.  */
+static struct bfd_link_hash_table *
+elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
+{
+  struct bfd_link_hash_table *ret;
+
+  ret = elf32_arm_link_hash_table_create (abfd);
+  if (ret)
+    {
+      struct elf32_arm_link_hash_table *htab
+	= (struct elf32_arm_link_hash_table *)ret;
+      htab->use_rel = 0;
+    }
+  return ret;
+}     
+
+#undef elf32_bed
+#define elf32_bed elf32_arm_vxworks_bed
+
+#undef bfd_elf32_bfd_link_hash_table_create
+#define bfd_elf32_bfd_link_hash_table_create \
+  elf32_arm_vxworks_link_hash_table_create
+
+#undef elf_backend_may_use_rel_p
+#define elf_backend_may_use_rel_p   0
+#undef elf_backend_may_use_rela_p
+#define elf_backend_may_use_rela_p  1
+#undef elf_backend_default_use_rela_p
+#define elf_backend_default_use_rela_p 1
+#undef elf_backend_rela_normal
+#define elf_backend_rela_normal     1
+
+#include "elf32-target.h"
+
+
 /* Symbian OS Targets */
 
 #undef TARGET_LITTLE_SYM
@@ -5859,4 +5907,13 @@ elf32_arm_symbian_modify_segment_map (bf
 #undef elf_backend_want_got_plt
 #define elf_backend_want_got_plt 0
 
+#undef elf_backend_may_use_rel_p
+#define elf_backend_may_use_rel_p   1
+#undef elf_backend_may_use_rela_p
+#define elf_backend_may_use_rela_p  0
+#undef elf_backend_default_use_rela_p
+#define elf_backend_default_use_rela_p 1
+#undef elf_backend_rela_normal
+#define elf_backend_rela_normal     0
+
 #include "elf32-target.h"
Index: bfd/targets.c
===================================================================
RCS file: /cvs/src/src/bfd/targets.c,v
retrieving revision 1.120
diff -u -p -r1.120 targets.c
--- bfd/targets.c	8 Nov 2004 13:17:35 -0000	1.120
+++ bfd/targets.c	6 Jan 2005 14:23:09 -0000
@@ -1,6 +1,6 @@
 /* Generic target-file-type support for the BFD library.
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004
+   2000, 2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
    Written by Cygnus Support.
 
@@ -536,6 +536,7 @@ extern const bfd_target bfd_elf32_big_ge
 extern const bfd_target bfd_elf32_bigarc_vec;
 extern const bfd_target bfd_elf32_bigarm_vec;
 extern const bfd_target bfd_elf32_bigarm_symbian_vec;
+extern const bfd_target bfd_elf32_bigarm_vxworks_vec;
 extern const bfd_target bfd_elf32_bigmips_vec;
 extern const bfd_target bfd_elf32_cr16c_vec;
 extern const bfd_target bfd_elf32_cris_vec;
@@ -564,6 +565,7 @@ extern const bfd_target bfd_elf32_little
 extern const bfd_target bfd_elf32_littlearc_vec;
 extern const bfd_target bfd_elf32_littlearm_vec;
 extern const bfd_target bfd_elf32_littlearm_symbian_vec;
+extern const bfd_target bfd_elf32_littlearm_vxworks_vec;
 extern const bfd_target bfd_elf32_littlemips_vec;
 extern const bfd_target bfd_elf32_m32r_vec;
 extern const bfd_target bfd_elf32_m32rle_vec;
@@ -833,6 +835,7 @@ static const bfd_target * const _bfd_tar
 	&bfd_elf32_bigarc_vec,
 	&bfd_elf32_bigarm_vec,
 	&bfd_elf32_bigarm_symbian_vec,
+	&bfd_elf32_bigarm_vxworks_vec,
 	&bfd_elf32_bigmips_vec,
 	&bfd_elf32_cr16c_vec,
 	&bfd_elf32_cris_vec,
@@ -863,6 +866,7 @@ static const bfd_target * const _bfd_tar
 	&bfd_elf32_littlearc_vec,
 	&bfd_elf32_littlearm_vec,
 	&bfd_elf32_littlearm_symbian_vec,
+	&bfd_elf32_littlearm_vxworks_vec,
 	&bfd_elf32_littlemips_vec,
 	&bfd_elf32_m32r_vec,
         &bfd_elf32_m32rle_vec,
Index: gas/config/tc-arm.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.c,v
retrieving revision 1.187
diff -u -p -r1.187 tc-arm.c
--- gas/config/tc-arm.c	9 Dec 2004 20:25:22 -0000	1.187
+++ gas/config/tc-arm.c	6 Jan 2005 14:23:12 -0000
@@ -1,5 +1,6 @@
 /* tc-arm.c -- Assemble for the ARM
-   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+   2005
    Free Software Foundation, Inc.
    Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
 	Modified by David Taylor (dtaylor@armltd.co.uk)
@@ -125,6 +126,8 @@ enum arm_float_abi
     /* Legacy a.out format.  */
 #   define FPU_DEFAULT FPU_ARCH_FPA	/* Soft-float, but FPA order.  */
 #  endif
+# elif defined (TE_VXWORKS)
+#  define FPU_DEFAULT FPU_ARCH_VFP	/* Soft-float, VFP order.  */
 # else
    /* For backwards compatibility, default to FPA.  */
 #  define FPU_DEFAULT FPU_ARCH_FPA
@@ -11059,7 +11062,7 @@ md_begin (void)
     }
   else if (mfpu_opt == -1)
     {
-#if !(defined (TE_LINUX) || defined (TE_NetBSD))
+#if !(defined (TE_LINUX) || defined (TE_NetBSD) || defined (TE_VXWORKS)) 
       /* Some environments specify a default FPU.  If they don't, infer it
 	 from the processor.  */
       if (mcpu_fpu_opt != -1)
@@ -11764,7 +11767,18 @@ md_apply_fix3 (fixS *   fixP,
 	as_bad_where (fixP->fx_file, fixP->fx_line,
 		      _("out of range branch"));
 
-      newval = (value & 0x00ffffff) | (newval & 0xff000000);
+      if (seg->use_rela_p && !fixP->fx_done)
+	{
+	  /* Must unshift the value before storing it in the addend.  */
+	  value <<= 2;
+#ifdef OBJ_ELF
+	  fixP->fx_offset = value;
+#endif
+	  fixP->fx_addnumber = value;
+	  newval = newval & 0xff000000;
+	}
+      else
+	  newval = (value & 0x00ffffff) | (newval & 0xff000000);
       md_number_to_chars (buf, newval, INSN_SIZE);
       break;
 
@@ -11779,7 +11793,21 @@ md_apply_fix3 (fixS *   fixP,
 	hbit   = (value >> 1) & 1;
 	value  = (value >> 2) & 0x00ffffff;
 	value  = (value + (newval & 0x00ffffff)) & 0x00ffffff;
-	newval = value | (newval & 0xfe000000) | (hbit << 24);
+
+	if (seg->use_rela_p && !fixP->fx_done)
+	  {
+	    /* Must sign-extend and unshift the value before storing
+	       it in the addend.  */
+	    value = SEXT24 (value);
+	    value = (value << 2) | hbit;
+#ifdef OBJ_ELF
+	    fixP->fx_offset = value;
+#endif
+	    fixP->fx_addnumber = value;
+	    newval = newval & 0xfe000000;
+	  }
+	else
+	  newval = value | (newval & 0xfe000000) | (hbit << 24);
 	md_number_to_chars (buf, newval, INSN_SIZE);
       }
       break;
@@ -11795,7 +11823,16 @@ md_apply_fix3 (fixS *   fixP,
 	if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
 	  as_bad_where (fixP->fx_file, fixP->fx_line,
 			_("branch out of range"));
-	newval = (newval & 0xff00) | ((value & 0x1ff) >> 1);
+	if (seg->use_rela_p && !fixP->fx_done)
+	  {
+#ifdef OBJ_ELF
+	    fixP->fx_offset = value;
+#endif
+	    fixP->fx_addnumber = value;
+	    newval = newval & 0xff00;
+	  }
+	else
+	  newval = (newval & 0xff00) | ((value & 0x1ff) >> 1);
       }
       md_number_to_chars (buf, newval, THUMB_SIZE);
       break;
@@ -11811,7 +11848,16 @@ md_apply_fix3 (fixS *   fixP,
 	if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
 	  as_bad_where (fixP->fx_file, fixP->fx_line,
 			_("branch out of range"));
-	newval = (newval & 0xf800) | ((value & 0xfff) >> 1);
+	if (seg->use_rela_p && !fixP->fx_done)
+	  {
+#ifdef OBJ_ELF
+	    fixP->fx_offset = value;
+#endif
+	    fixP->fx_addnumber = value;
+	    newval = newval & 0xf800;
+	  }
+	else
+	  newval = (newval & 0xf800) | ((value & 0xfff) >> 1);
       }
       md_number_to_chars (buf, newval, THUMB_SIZE);
       break;
@@ -11836,20 +11882,35 @@ md_apply_fix3 (fixS *   fixP,
 	  as_bad_where (fixP->fx_file, fixP->fx_line,
 			_("branch with link out of range"));
 
-	newval  = (newval  & 0xf800) | ((value & 0x7fffff) >> 12);
-	newval2 = (newval2 & 0xf800) | ((value & 0xfff) >> 1);
 	if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
 	  /* For a BLX instruction, make sure that the relocation is rounded up
 	     to a word boundary.  This follows the semantics of the instruction
 	     which specifies that bit 1 of the target address will come from bit
 	     1 of the base address.  */
-	  newval2 = (newval2 + 1) & ~ 1;
+	  value = (value + 1) & ~ 1;
+
+	if (seg->use_rela_p && !fixP->fx_done)
+	  {
+#ifdef OBJ_ELF
+	    fixP->fx_offset = value;
+#endif
+	    fixP->fx_addnumber = value;
+	    newval = newval & 0xf800;
+	    newval2 = newval2 & 0xf800;
+	  }
+	else
+	  {
+	    newval  = (newval  & 0xf800) | ((value & 0x7fffff) >> 12);
+	    newval2 = (newval2 & 0xf800) | ((value & 0xfff) >> 1);
+	  }
 	md_number_to_chars (buf, newval, THUMB_SIZE);
 	md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
       }
       break;
 
     case BFD_RELOC_8:
+      if (seg->use_rela_p && !fixP->fx_done)
+	break;
       if (fixP->fx_done || fixP->fx_pcrel)
 	md_number_to_chars (buf, value, 1);
 #ifdef OBJ_ELF
@@ -11862,6 +11923,8 @@ md_apply_fix3 (fixS *   fixP,
       break;
 
     case BFD_RELOC_16:
+      if (seg->use_rela_p && !fixP->fx_done)
+	break;
       if (fixP->fx_done || fixP->fx_pcrel)
 	md_number_to_chars (buf, value, 2);
 #ifdef OBJ_ELF
@@ -11877,6 +11940,8 @@ md_apply_fix3 (fixS *   fixP,
     case BFD_RELOC_ARM_GOT32:
     case BFD_RELOC_ARM_GOTOFF:
     case BFD_RELOC_ARM_TARGET2:
+      if (seg->use_rela_p && !fixP->fx_done)
+	break;
       md_number_to_chars (buf, 0, 4);
       break;
 #endif
@@ -11887,6 +11952,8 @@ md_apply_fix3 (fixS *   fixP,
     case BFD_RELOC_ARM_ROSEGREL32:
     case BFD_RELOC_ARM_SBREL32:
     case BFD_RELOC_32_PCREL:
+      if (seg->use_rela_p && !fixP->fx_done)
+	break;
       if (fixP->fx_done || fixP->fx_pcrel)
 	md_number_to_chars (buf, value, 4);
 #ifdef OBJ_ELF
@@ -13502,6 +13569,10 @@ elf32_arm_target_format (void)
   return (target_big_endian
 	  ? "elf32-bigarm-symbian"
 	  : "elf32-littlearm-symbian");
+#elif defined (TE_VXWORKS)
+  return (target_big_endian
+	  ? "elf32-bigarm-vxworks"
+	  : "elf32-littlearm-vxworks");
 #else
   if (target_big_endian)
     return "elf32-bigarm";
Index: ld/Makefile.am
===================================================================
RCS file: /cvs/src/src/ld/Makefile.am,v
retrieving revision 1.167
diff -u -p -r1.167 Makefile.am
--- ld/Makefile.am	4 Jan 2005 15:16:25 -0000	1.167
+++ ld/Makefile.am	6 Jan 2005 14:23:13 -0000
@@ -125,6 +125,7 @@ ALL_EMULATIONS = \
 	earmelfb_linux.o \
 	earmelf_nbsd.o \
 	earmelfb_nbsd.o \
+	earmelf_vxworks.o \
 	earmnto.o \
 	earmnbsd.o \
 	earmpe.o \
@@ -518,6 +519,11 @@ earmelfb_nbsd.c: $(srcdir)/emulparams/ar
   $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/armelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armelfb_nbsd "$(tdir_armelfb_nbsd)"
+earmelf_vxworks.c: $(srcdir)/emulparams/armelf_vxworks.sh \
+  $(srcdir)/emulparams/armelf.sh $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/armelf.em $(srcdir)/scripttempl/elf.sc \
+  ${GEN_DEPENDS}
+	${GENSCRIPTS} armelf_vxworks "$(tdir_armelf)"
 earmaoutb.c:	$(srcdir)/emulparams/armaoutb.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/armaout.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armaoutb "$(tdir_armaoutb)"
Index: ld/configure.tgt
===================================================================
RCS file: /cvs/src/src/ld/configure.tgt,v
retrieving revision 1.161
diff -u -p -r1.161 configure.tgt
--- ld/configure.tgt	16 Dec 2004 16:02:50 -0000	1.161
+++ ld/configure.tgt	6 Jan 2005 14:23:13 -0000
@@ -257,7 +257,7 @@ arm-*-nto*)		targ_emul=armnto ;;
 arm-*-openbsd*)		targ_emul=armnbsd ;;
 arm-*-rtems*)		targ_emul=armelf ;;
 armeb-*-elf)		targ_emul=armelfb ;;
-arm-*-elf | arm-*-vxworks | arm*-*-eabi*)
+arm-*-elf | arm*-*-eabi*)
 	  		targ_emul=armelf ;;
 arm*-*-symbianelf*)     targ_emul=armsymbian;;
 arm-*-kaos*)		targ_emul=armelf ;;
@@ -266,6 +266,7 @@ arm*b-*-linux-gnu*)	targ_emul=armelfb_li
 arm*-*-linux-gnueabi)	targ_emul=armelf_linux_eabi ;;
 arm*-*-linux-gnu*)	targ_emul=armelf_linux; targ_extra_emuls=armelf ;;
 arm*-*-uclinux*)	targ_emul=armelf_linux; targ_extra_emuls=armelf ;;
+arm-*-vxworks)		targ_emul=armelf_vxworks ;;
 arm*-*-conix*)		targ_emul=armelf ;;
 thumb-*-linux-gnu* | thumb-*-uclinux*)	targ_emul=armelf_linux; targ_extra_emuls=armelf ;;
 strongarm-*-coff)	targ_emul=armcoff ;;
Index: ld/emulparams/armelf_vxworks.sh
===================================================================
RCS file: ld/emulparams/armelf_vxworks.sh
diff -N ld/emulparams/armelf_vxworks.sh
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/emulparams/armelf_vxworks.sh	6 Jan 2005 14:23:13 -0000
@@ -0,0 +1,4 @@
+. ${srcdir}/emulparams/armelf.sh
+OUTPUT_FORMAT="elf32-littlearm-vxworks"
+BIG_OUTPUT_FORMAT="elf32-bigarm-vxworks"
+LITTLE_OUTPUT_FORMAT="$OUTPUT_FORMAT"

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