public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* Patch: Add c6x-uclinux support
@ 2011-03-11 11:42 Bernd Schmidt
  2011-03-28 22:34 ` Joseph S. Myers
  0 siblings, 1 reply; 14+ messages in thread
From: Bernd Schmidt @ 2011-03-11 11:42 UTC (permalink / raw)
  To: binutils; +Cc: Joseph S. Myers, Paul Brook

[-- Attachment #1: Type: text/plain, Size: 783 bytes --]

This patch adds a new target, c6x-uclinux, to the TI C6X port. This uses
a new kind of binary format called DSBT ELF, designed to support shared
libraries on nommu systems. Every object (shared libraries, executables,
dynamic linker) has an index, and a table at the start of the GOT to
provide data segment pointers. The mechanism is similar to the ID
shared-flat format which is used on m68k or Blackfin, but using real ELF
binaries instead of flat ones.

Also included in this patch is support for a new assembler directive,
".scomm", used to better support small-data common symbols as required
by the ABI. There's also a small assembler bugfix for -mgenerate-rel.

This patch does not yet include C++ EH support; I expect Paul Brook will
submit those parts a bit later.


Bernd

[-- Attachment #2: mainline-dsbt-0311b.diff --]
[-- Type: text/plain, Size: 244382 bytes --]

include/elf/
	* tic6x.h (R_C6000_JUMP_SPLOT, R_C6000_SBR_GOT32,
	R_C6000_PCR_H16, R_C6000_PCR_L16): New relocs.
	(SHN_TIC6X_SCOMMON): Define.

bfd/
	* elf32-tic6x.h (struct elf32_tic6x_params): New.
	(elf32_tic6x_setup): Declare.
	* elf32-tic6x.c: Include <limits.h>.
	(ELF_DYNAMIC_LINKER, DEFAULT_STACK_SIZE, PLT_ENTRY_SIZE): Define.
	(struct elf32_tic6x_link_hash_table, struct elf32_link_hash_entry):
	New structures.
	(elf32_tic6x_link_hash_table, is_tic6x_elf): New macros.
	(tic6x_elf_scom_section, tic6x_elf_scom_symbol,
	tic6x_elf_scom_symbol_ptr): New static variables.
	(elf32_tic6x_howto_table, elf32_tic6x_howto_table_rel,
	elf32_tic6x_reloc_map): Add R_C6000_JUMP_SLOT.
	(elf32_tic6x_link_hash_newfunc, elf32_tic6x_link_hash_table_create,
	elf32_tic6x_link_hash_table_free, elf32_tic6x_setup, using_dsbt,
	elf32_tic6x_create_dynamic_sections, install_rela, make_got_dynreloc,
	elf32_tic6x_finish_dynamic_symbol, elf32_tic6x_gc_sweep_hook,
	elf32_tic6x_adjust_dynamic_symbol): New static functions.
	(elf32_tic6x_relocate_section): For R_C6000_PCR_S21, convert branches
	to weak symbols as required by the ABI.
	Handle GOT and DSBT_INDEX relocs, and copy relocs to the output file
	as needed when generating DSBT output.
	(elf32_tic6x_check_relocs, elf32_tic6x_add_symbol_hook,
	elf32_tic6x_symbol_processing, elf32_tic6x_section_from_bfd_section,
	elf32_tic6x_allocate_dynrelocs, elf32_tic6x_size_dynamic_sections,
	elf32_tic6x_always_size_sections, elf32_tic6x_modify_program_headers,
	elf32_tic6x_finish_dynamic_sections, elf32_tic6x_plt_sym_val,
	elf32_tic6x_copy_private_data, elf32_tic6x_link_omit_section_dynsym):
	New static functions.
	(ELF_MAXPAGESIZE): Define to 0x1000.
	(bfd_elf32_bfd_copy_private_bfd_data,
	bfd_elf32_bfd_link_hash_table_create,
	bfd_elf32_bfd_link_hash_table_free, elf_backend_can_refcount,
	elf_backend_want_got_plt, elf_backend_want_dynbss,
	elf_backend_plt_readonly, elf_backend_got_header_size,
	elf_backend_gc_sweep_hook, elf_backend_modify_program_headers,
	elf_backend_create_dynamic_sections, elf_backend_adjust_dynamic_symbol,
	elf_backend_check_relocs, elf_backend_add_symbol_hook,
	elf_backend_symbol_processing, elf_backend_link_output_symbol_hook,
	elf_backend_section_from_bfd_section,
	elf_backend_finish_dynamic_symbol, elf_backend_always_size_sections,
	elf32_tic6x_size_dynamic_sections, elf_backend_finish_dynamic_sections,
	elf_backend_omit_section_dynsym, elf_backend_plt_sym_val): Define.
	
	* bfd/reloc.c (BFD_RELOC_C6000_JUMP_SLOT): Add.
	* bfd/bfd-in2.h: Regenerate.
	* bfd/libbfd.h: Regenerate.
	* config.bfd: Accept tic6x-*-* instead of tic6x-*-elf.

gas/
	* config/tc-tic6x.c (sbss_section, scom_section, scom_symbol): New
	static variables.
	(md_begin): Initialize them.
	(s_tic6x_scomm): New static function.
	(md_pseudo_table): Add "scomm".
	(tc_gen_reloc): Really undo all adjustments made by
	bfd_install_relocation.
	* doc/c-tic6x.texi: Document the .scomm directive.

ld/
	* emulparams/elf32_tic6x_le.sh (BIG_OUTPUT_FORMAT, EXTRA_EM_FILE,
	GENERATE_SHLIB_SCRIPT): New defines.
	(TEXT_START_ADDR): Define differently depending on target.
	(.got): Redefine to include "*(.dsbt)".
	(SDATA_START_SYMBOLS): Remove, replace with
	(OTHER_GOT_SYMBOLS): New.
	(OTHER_BSS_SECTIONS): Define only for ELF targets.
	* emultempl/tic6xdsbt.em: New file.
	* gen-doc.texi: Set C6X.
	* ld.texinfo: Likewise.
	(Options specific to C6X uClinux targets): New section.

binutils/testsuite/
	* lib/binutils-common.exp (is_elf_format): Accept tic6x*-*-uclinux*.

ld/testsuite/
	* ld-elf/sec-to-seg.exp: Remove tic6x from list of targets defining
	pagesize to 1.
	* ld-tic6x/tic6x.exp: Add support for DSBT shared library/executable
	linking tests.
	* ld-tic6x/dsbt.ld: New linker script.
	* ld-tic6x/dsbt-be.ld: New linker script.
	* ld-tic6x/dsbt-overflow.ld: New linker script.
	* ld-tic6x/dsbt-inrange.ld: New linker script.
	* ld-tic6x/shlib-1.s: New test.
	* ld-tic6x/shlib-2.s: New test.
	* ld-tic6x/shlib-app-1r.s: New test.
	* ld-tic6x/shlib-app-1.s: New test.
	* ld-tic6x/shlib-1.sd: New test.
	* ld-tic6x/shlib-1.dd: New test.
	* ld-tic6x/shlib-app-1.rd: New test.
	* ld-tic6x/shlib-app-1rb.rd: New test.
	* ld-tic6x/shlib-app-1.sd: New test.
	* ld-tic6x/static-app-1rb.od: New test.
	* ld-tic6x/shlib-app-1.dd: New test.
	* ld-tic6x/shlib-app-1rb.sd: New test.
	* ld-tic6x/static-app-1b.od: New test.
	* ld-tic6x/static-app-1r.od: New test.
	* ld-tic6x/shlib-1rb.rd: New test.
	* ld-tic6x/shlib-app-1rb.dd: New test.
	* ld-tic6x/shlib-1rb.sd: New test.
	* ld-tic6x/shlib-1rb.dd: New test.
	* ld-tic6x/shlib-app-1b.od: New test.
	* ld-tic6x/tic6x.exp: New test.
	* ld-tic6x/static-app-1rb.rd: New test.
	* ld-tic6x/shlib-app-1r.od: New test.
	* ld-tic6x/static-app-1.od: New test.
	* ld-tic6x/static-app-1b.rd: New test.
	* ld-tic6x/static-app-1r.rd: New test.
	* ld-tic6x/static-app-1rb.sd: New test.
	* ld-tic6x/static-app-1b.sd: New test.
	* ld-tic6x/static-app-1rb.dd: New test.
	* ld-tic6x/static-app-1r.sd: New test.
	* ld-tic6x/static-app-1b.dd: New test.
	* ld-tic6x/shlib-1b.rd: New test.
	* ld-tic6x/static-app-1r.dd: New test.
	* ld-tic6x/shlib-app-1b.rd: New test.
	* ld-tic6x/shlib-1r.rd: New test.
	* ld-tic6x/shlib-app-1r.rd: New test.
	* ld-tic6x/shlib-1b.sd: New test.
	* ld-tic6x/static-app-1.rd: New test.
	* ld-tic6x/shlib-app-1b.sd: New test.
	* ld-tic6x/shlib-1r.sd: New test.
	* ld-tic6x/shlib-1b.dd: New test.
	* ld-tic6x/shlib-app-1r.sd: New test.
	* ld-tic6x/shlib-app-1b.dd: New test.
	* ld-tic6x/shlib-1r.dd: New test.
	* ld-tic6x/static-app-1.sd: New test.
	* ld-tic6x/shlib-app-1r.dd: New test.
	* ld-tic6x/static-app-1.dd: New test.
	* ld-tic6x/got-reloc-local-1.s: New test.
	* ld-tic6x/got-reloc-local-2.s: New test.
	* ld-tic6x/got-reloc-local-r.d: New test.
	* ld-tic6x/got-reloc-global.s: New test.
	* ld-tic6x/got-reloc-global-addend-1.d: New test.
	* ld-tic6x/got-reloc-global-addend-1.s: New test.
	* ld-tic6x/got-reloc-global-addend-2.d: New test.
	* ld-tic6x/got-reloc-inrange.d: New test.
	* ld-tic6x/got-reloc-overflow.d: New test.
	* ld-tic6x/got-reloc-global-addend-2.s: New test.
	* ld-tic6x/dsbt-index-error.d: New test.
	* ld-tic6x/dsbt-index.d: New test.
	* ld-tic6x/dsbt-index.s: New test.
	* ld-tic6x/shlib-app-1.od: New test.
	* ld-tic6x/shlib-app-1rb.od: New test.
	* ld-tic6x/shlib-1.rd: New test.
	* ld-tic6x/weak.d: New test.
	* ld-tic6x/weak-be.d: New test.
	* ld-tic6x/weak.s: New test.

Index: bfd/bfd-in2.h
===================================================================
RCS file: /cvs/src/src/bfd/bfd-in2.h,v
retrieving revision 1.528
diff -c -p -d -p -u -r1.528 bfd-in2.h
--- bfd/bfd-in2.h	10 Jan 2011 08:40:16 -0000	1.528
+++ bfd/bfd-in2.h	11 Mar 2011 11:33:34 -0000
@@ -3764,6 +3764,7 @@ the opcode.  */
   BFD_RELOC_C6000_DSBT_INDEX,
   BFD_RELOC_C6000_PREL31,
   BFD_RELOC_C6000_COPY,
+  BFD_RELOC_C6000_JUMP_SLOT,
   BFD_RELOC_C6000_ALIGN,
   BFD_RELOC_C6000_FPHEAD,
   BFD_RELOC_C6000_NOCMP,
Index: bfd/config.bfd
===================================================================
RCS file: /cvs/src/src/bfd/config.bfd,v
retrieving revision 1.274
diff -c -p -d -p -u -r1.274 config.bfd
--- bfd/config.bfd	31 Dec 2010 11:00:52 -0000	1.274
+++ bfd/config.bfd	11 Mar 2011 11:33:34 -0000
@@ -1496,7 +1496,7 @@ case "${targ}" in
     ;;
 #endif
 
-  tic6x-*-elf)
+  tic6x-*-*)
     targ_defvec=bfd_elf32_tic6x_le_vec
     targ_selvecs=bfd_elf32_tic6x_be_vec
     ;;
Index: bfd/elf32-tic6x.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-tic6x.c,v
retrieving revision 1.13
diff -c -p -d -p -u -r1.13 elf32-tic6x.c
--- bfd/elf32-tic6x.c	5 Nov 2010 13:04:06 -0000	1.13
+++ bfd/elf32-tic6x.c	11 Mar 2011 11:33:34 -0000
@@ -1,5 +1,5 @@
 /* 32-bit ELF support for TI C6X
-   Copyright 2010
+   Copyright 2010, 2011
    Free Software Foundation, Inc.
    Contributed by Joseph Myers <joseph@codesourcery.com>
    		  Bernd Schmidt  <bernds@codesourcery.com>
@@ -29,6 +29,52 @@
 #include "elf/tic6x.h"
 #include "elf32-tic6x.h"
 
+#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
+
+/* DSBT binaries have a default 128K stack.  */
+#define DEFAULT_STACK_SIZE 0x20000
+
+/* The size in bytes of an entry in the procedure linkage table.  */
+#define PLT_ENTRY_SIZE 24
+
+/* TI C6X ELF linker hash table.  */
+
+struct elf32_tic6x_link_hash_table
+{
+  struct elf_link_hash_table elf;
+
+  /* Short-cuts to get to dynamic linker sections.  */
+  asection *sdynbss;
+  asection *srelbss;
+
+  /* C6X specific command line arguments.  */
+  struct elf32_tic6x_params params;
+
+  /* Small local sym cache.  */
+  struct sym_cache sym_cache;
+
+  /* The output BFD, for convenience.  */
+  bfd *obfd;
+
+  /* The .dsbt section.  */
+  asection *dsbt;
+};
+
+/* Get the TI C6X ELF linker hash table from a link_info structure.  */
+
+#define elf32_tic6x_hash_table(p) \
+  ((struct elf32_tic6x_link_hash_table *) ((p)->hash))
+
+/* TI C6X ELF linker hash entry.  */
+
+struct elf32_tic6x_link_hash_entry
+{
+  struct elf_link_hash_entry elf;
+
+  /* Track dynamic relocs copied for this symbol.  */
+  struct elf_dyn_relocs *dyn_relocs;
+};
+
 struct elf32_tic6x_obj_tdata
 {
   struct elf_obj_tdata root;
@@ -42,6 +88,20 @@ struct elf32_tic6x_obj_tdata
 #define elf32_tic6x_tdata(abfd) \
   ((struct elf32_tic6x_obj_tdata *) (abfd)->tdata.any)
 
+#define is_tic6x_elf(bfd) \
+  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
+   && elf_tdata (bfd) != NULL \
+   && elf_object_id (bfd) == TIC6X_ELF_DATA)
+
+/* C6X ELF uses two common sections.  One is the usual one, and the
+   other is for small objects.  All the small objects are kept
+   together, and then referenced via the gp pointer, which yields
+   faster assembler code.  This is what we use for the small common
+   section.  This approach is copied from ecoff.c.  */
+static asection tic6x_elf_scom_section;
+static asymbol  tic6x_elf_scom_symbol;
+static asymbol  *tic6x_elf_scom_symbol_ptr;
+
 static reloc_howto_type elf32_tic6x_howto_table[] =
 {
   HOWTO (R_C6000_NONE,		/* type */
@@ -395,7 +455,19 @@ static reloc_howto_type elf32_tic6x_howt
 	 0,			/* src_mask */
 	 0xffffffff,		/* dst_mask */
 	 FALSE),		/* pcrel_offset */
-  EMPTY_HOWTO (27),
+  HOWTO (R_C6000_JUMP_SLOT,	/* type */
+	 0,			/* rightshift */
+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+	 32,			/* bitsize */
+	 FALSE,			/* pc_relative */
+	 0,			/* bitpos */
+	 complain_overflow_dont,/* complain_on_overflow */
+	 bfd_elf_generic_reloc,	/* special_function */
+	 "R_C6000_JUMP_SLOT",	/* name */
+	 FALSE,			/* partial_inplace */
+	 0,			/* src_mask */
+	 0xffffffff,		/* dst_mask */
+	 FALSE),		/* pcrel_offset */
   EMPTY_HOWTO (28),
   EMPTY_HOWTO (29),
   EMPTY_HOWTO (30),
@@ -955,7 +1027,19 @@ static reloc_howto_type elf32_tic6x_howt
 	 0,			/* src_mask */
 	 0xffffffff,		/* dst_mask */
 	 FALSE),		/* pcrel_offset */
-  EMPTY_HOWTO (27),
+  HOWTO (R_C6000_JUMP_SLOT,	/* type */
+	 0,			/* rightshift */
+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+	 32,			/* bitsize */
+	 FALSE,			/* pc_relative */
+	 0,			/* bitpos */
+	 complain_overflow_dont,/* complain_on_overflow */
+	 bfd_elf_generic_reloc,	/* special_function */
+	 "R_C6000_JUMP_SLOT",	/* name */
+	 FALSE,			/* partial_inplace */
+	 0,			/* src_mask */
+	 0xffffffff,		/* dst_mask */
+	 FALSE),		/* pcrel_offset */
   EMPTY_HOWTO (28),
   EMPTY_HOWTO (29),
   EMPTY_HOWTO (30),
@@ -1259,6 +1343,7 @@ static const tic6x_reloc_map elf32_tic6x
     { BFD_RELOC_C6000_DSBT_INDEX, R_C6000_DSBT_INDEX },
     { BFD_RELOC_C6000_PREL31, R_C6000_PREL31 },
     { BFD_RELOC_C6000_COPY, R_C6000_COPY },
+    { BFD_RELOC_C6000_JUMP_SLOT, R_C6000_JUMP_SLOT },
     { BFD_RELOC_C6000_ALIGN, R_C6000_ALIGN },
     { BFD_RELOC_C6000_FPHEAD, R_C6000_FPHEAD },
     { BFD_RELOC_C6000_NOCMP, R_C6000_NOCMP }
@@ -1349,6 +1434,130 @@ elf32_tic6x_set_use_rela_p (bfd *abfd, b
   elf32_tic6x_tdata (abfd)->use_rela_p = use_rela_p;
 }
 
+/* Create an entry in a C6X ELF linker hash table.  */
+
+static struct bfd_hash_entry *
+elf32_tic6x_link_hash_newfunc (struct bfd_hash_entry *entry,
+			    struct bfd_hash_table *table,
+			    const char *string)
+{
+  /* Allocate the structure if it has not already been allocated by a
+     subclass.  */
+  if (entry == NULL)
+    {
+      entry = bfd_hash_allocate (table,
+				 sizeof (struct elf32_tic6x_link_hash_entry));
+      if (entry == NULL)
+	return entry;
+    }
+
+  /* Call the allocation method of the superclass.  */
+  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
+  if (entry != NULL)
+    {
+      struct elf32_tic6x_link_hash_entry *eh;
+
+      eh = (struct elf32_tic6x_link_hash_entry *) entry;
+      eh->dyn_relocs = NULL;
+    }
+
+  return entry;
+}
+
+/* Create a C6X ELF linker hash table.  */
+
+static struct bfd_link_hash_table *
+elf32_tic6x_link_hash_table_create (bfd *abfd)
+{
+  struct elf32_tic6x_link_hash_table *ret;
+  bfd_size_type amt = sizeof (struct elf32_tic6x_link_hash_table);
+
+  ret = bfd_malloc (amt);
+  if (ret == NULL)
+    return NULL;
+
+  if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
+				      elf32_tic6x_link_hash_newfunc,
+				      sizeof (struct elf32_tic6x_link_hash_entry),
+				      TIC6X_ELF_DATA))
+    {
+      free (ret);
+      return NULL;
+    }
+
+  ret->sym_cache.abfd = NULL;
+  ret->obfd = abfd;
+  ret->elf.is_relocatable_executable = 1;
+
+  return &ret->elf.root;
+}
+
+/* Destroy a C6X ELF linker hash table.  */
+
+static void
+elf32_tic6x_link_hash_table_free (struct bfd_link_hash_table *hash)
+{
+  _bfd_generic_link_hash_table_free (hash);
+}
+
+/* Called to pass PARAMS to the backend.  We store them in the hash table
+   associated with INFO.  */
+
+void
+elf32_tic6x_setup (struct bfd_link_info *info,
+		   struct elf32_tic6x_params *params)
+{
+  struct elf32_tic6x_link_hash_table *htab = elf32_tic6x_hash_table (info);
+  htab->params = *params;
+}
+
+/* Determine if we're dealing with a DSBT object.  */
+
+static bfd_boolean
+using_dsbt (bfd *abfd)
+{
+  return bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC,
+				   Tag_ABI_DSBT);
+}
+
+/* Create .plt, .rela.plt, .got, .got.plt, .rela.got and .dsbt
+   sections in DYNOBJ, and set up shortcuts to them in our hash
+   table.  */
+
+static bfd_boolean
+elf32_tic6x_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
+{
+  struct elf32_tic6x_link_hash_table *htab;
+  flagword flags;
+
+  htab = elf32_tic6x_hash_table (info);
+  if (htab == NULL)
+    return FALSE;
+
+  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
+    return FALSE;
+
+  /* Create .dsbt  */
+  flags = (SEC_ALLOC | SEC_LOAD
+	   | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
+  htab->dsbt = bfd_make_section_anyway_with_flags (dynobj, ".dsbt",
+						   flags);
+  if (htab->dsbt == NULL
+      || ! bfd_set_section_alignment (dynobj, htab->dsbt, 2)
+      || ! bfd_set_section_alignment (dynobj, htab->elf.splt, 5))
+    return FALSE;
+
+  htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
+  if (!info->shared)
+    htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
+
+  if (!htab->sdynbss
+      || (!info->shared && !htab->srelbss))
+    abort ();
+
+  return TRUE;
+}
+
 static bfd_boolean
 elf32_tic6x_mkobject (bfd *abfd)
 {
@@ -1361,6 +1570,419 @@ elf32_tic6x_mkobject (bfd *abfd)
   return ret;
 }
 
+/* Install relocation RELA into section SRELA, incrementing its
+   reloc_count.  */
+
+static void
+install_rela (bfd *output_bfd, asection *srela,
+	      Elf_Internal_Rela *rela)
+{
+  bfd_byte *loc;
+  bfd_vma off = srela->reloc_count++ * sizeof (Elf32_External_Rela);
+  loc = srela->contents + off;
+  BFD_ASSERT (off < srela->size);
+  bfd_elf32_swap_reloca_out (output_bfd, rela, loc);
+}
+
+/* Create a dynamic reloc against the GOT at offset OFFSET.  The contents
+   of the GOT at this offset have been initialized with the relocation.  */
+
+static void
+make_got_dynreloc (bfd *output_bfd,
+		   struct elf32_tic6x_link_hash_table *htab,
+		   asection *sym_sec, bfd_vma offset)
+{
+  asection *sgot = htab->elf.sgot;
+  Elf_Internal_Rela outrel;
+  int dynindx;
+
+  outrel.r_offset = sgot->output_section->vma + sgot->output_offset + offset;
+  outrel.r_addend = bfd_get_32 (output_bfd, sgot->contents + offset);
+  if (sym_sec && sym_sec->output_section
+      && ! bfd_is_abs_section (sym_sec->output_section)
+      && ! bfd_is_und_section (sym_sec->output_section))
+    {
+      dynindx = elf_section_data (sym_sec->output_section)->dynindx;
+      outrel.r_addend -= sym_sec->output_section->vma;
+    }
+  else
+    {
+      dynindx = 0;
+    }
+  outrel.r_info = ELF32_R_INFO (dynindx, R_C6000_ABS32);
+  install_rela (output_bfd, htab->elf.srelgot, &outrel);
+}
+
+/* Finish up dynamic symbol handling.  We set the contents of various
+   dynamic sections here.  */
+
+static bfd_boolean
+elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd,
+				   struct bfd_link_info *info,
+				   struct elf_link_hash_entry *h,
+				   Elf_Internal_Sym * sym)
+{
+  bfd *dynobj;
+  struct elf32_tic6x_link_hash_table *htab;
+
+  htab = elf32_tic6x_hash_table (info);
+  dynobj = htab->elf.dynobj;
+
+  if (h->plt.offset != (bfd_vma) -1)
+    {
+      bfd_vma plt_index;
+      bfd_vma got_section_offset, got_dp_offset, rela_offset;
+      Elf_Internal_Rela rela;
+      bfd_byte *loc;
+      asection *plt, *gotplt, *relplt;
+      const struct elf_backend_data *bed;
+
+      bed = get_elf_backend_data (output_bfd);
+
+      BFD_ASSERT (htab->elf.splt != NULL);
+      plt = htab->elf.splt;
+      gotplt = htab->elf.sgotplt;
+      relplt = htab->elf.srelplt;
+
+      /* This symbol has an entry in the procedure linkage table.  Set
+	 it up.  */
+
+      if ((h->dynindx == -1
+	   && !((h->forced_local || info->executable)
+		&& h->def_regular
+		&& h->type == STT_GNU_IFUNC))
+	  || plt == NULL
+	  || gotplt == NULL
+	  || relplt == NULL)
+	abort ();
+
+      /* Get the index in the procedure linkage table which
+	 corresponds to this symbol.  This is the index of this symbol
+	 in all the symbols for which we are making plt entries.  The
+	 first entry in the procedure linkage table is reserved.
+
+	 Get the offset into the .got table of the entry that
+	 corresponds to this function.  Each .got entry is 4 bytes.
+	 The first three are reserved.
+	 
+	 For static executables, we don't reserve anything.  */
+
+      plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
+      got_section_offset = plt_index + bed->got_header_size / 4;
+      got_dp_offset = got_section_offset + htab->params.dsbt_size;
+      rela_offset = plt_index * sizeof (Elf32_External_Rela);
+
+      got_section_offset *= 4;
+
+      /* Fill in the entry in the procedure linkage table.  */
+
+      /* ldw .d2t2 *+B14($GOT(f)), b2 */
+      bfd_put_32 (output_bfd, got_dp_offset << 8 | 0x0100006e,
+		  plt->contents + h->plt.offset);
+      /* mvk .s2 low(rela_offset), b0 */
+      bfd_put_32 (output_bfd, (rela_offset & 0xffff) << 7 | 0x0000002a,
+		  plt->contents + h->plt.offset + 4);
+      /* mvkh .s2 high(rela_offset), b0 */
+      bfd_put_32 (output_bfd, ((rela_offset >> 16) & 0xffff) << 7 | 0x0000006a,
+		  plt->contents + h->plt.offset + 8);
+      /* nop 2 */
+      bfd_put_32 (output_bfd, 0x00002000,
+		  plt->contents + h->plt.offset + 12);
+      /* b .s2 b2 */
+      bfd_put_32 (output_bfd, 0x00080362,
+		  plt->contents + h->plt.offset + 16);
+      /* nop 5 */
+      bfd_put_32 (output_bfd, 0x00008000,
+		  plt->contents + h->plt.offset + 20);
+
+      /* Fill in the entry in the global offset table.  */
+      bfd_put_32 (output_bfd,
+		  (plt->output_section->vma + plt->output_offset),
+		  gotplt->contents + got_section_offset);
+
+      /* Fill in the entry in the .rel.plt section.  */
+      rela.r_offset = (gotplt->output_section->vma
+		       + gotplt->output_offset
+		       + got_section_offset);
+      rela.r_info = ELF32_R_INFO (h->dynindx, R_C6000_JUMP_SLOT);
+      rela.r_addend = 0;
+      loc = relplt->contents + rela_offset;
+      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
+
+      if (!h->def_regular)
+	{
+	  /* Mark the symbol as undefined, rather than as defined in
+	     the .plt section.  */
+	  sym->st_shndx = SHN_UNDEF;
+	  sym->st_value = 0;
+	}
+    }
+
+  if (h->got.offset != (bfd_vma) -1)
+    {
+      asection *sgot;
+      asection *srela;
+
+      /* This symbol has an entry in the global offset table.
+         Set it up.  */
+
+      sgot = bfd_get_section_by_name (dynobj, ".got");
+      srela = bfd_get_section_by_name (dynobj, ".rela.got");
+      BFD_ASSERT (sgot != NULL && srela != NULL);
+
+      /* If this is a -Bsymbolic link, and the symbol is defined
+         locally, we just want to emit a RELATIVE reloc.  Likewise if
+         the symbol was forced to be local because of a version file.
+         The entry in the global offset table will already have been
+         initialized in the relocate_section function.  */
+      if (info->shared
+	  && (info->symbolic
+	      || h->dynindx == -1 || h->forced_local) && h->def_regular)
+	{
+	  asection *s = h->root.u.def.section;
+	  make_got_dynreloc (output_bfd, htab, s,
+			     h->got.offset & ~(bfd_vma) 1);
+	}
+      else
+	{
+	  Elf_Internal_Rela outrel;
+	  bfd_put_32 (output_bfd, (bfd_vma) 0,
+		      sgot->contents + (h->got.offset & ~(bfd_vma) 1));
+	  outrel.r_offset = (sgot->output_section->vma
+			   + sgot->output_offset
+			   + (h->got.offset & ~(bfd_vma) 1));
+	  outrel.r_info = ELF32_R_INFO (h->dynindx, R_C6000_ABS32);
+	  outrel.r_addend = 0;
+
+	  install_rela (output_bfd, srela, &outrel);
+	}
+    }
+
+  if (h->needs_copy)
+    {
+      Elf_Internal_Rela rel;
+
+      /* This symbol needs a copy reloc.  Set it up.  */
+
+      if (h->dynindx == -1
+	  || (h->root.type != bfd_link_hash_defined
+	      && h->root.type != bfd_link_hash_defweak)
+	  || htab->srelbss == NULL)
+	abort ();
+
+      rel.r_offset = (h->root.u.def.value
+		      + h->root.u.def.section->output_section->vma
+		      + h->root.u.def.section->output_offset);
+      rel.r_info = ELF32_R_INFO (h->dynindx, R_C6000_COPY);
+      rel.r_addend = 0;
+
+      install_rela (output_bfd, htab->srelbss, &rel);
+    }
+
+  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
+  if (strcmp (h->root.root.string, "__DYNAMIC") == 0
+      || h == elf_hash_table (info)->hgot)
+    sym->st_shndx = SHN_ABS;
+
+  return TRUE;
+}
+
+/* Update the got entry reference counts for the section being removed.  */
+
+static bfd_boolean
+elf32_tic6x_gc_sweep_hook (bfd *abfd,
+			   struct bfd_link_info *info,
+			   asection *sec,
+			   const Elf_Internal_Rela *relocs)
+{
+  struct elf32_tic6x_link_hash_table *htab;
+  Elf_Internal_Shdr *symtab_hdr;
+  struct elf_link_hash_entry **sym_hashes;
+  bfd_signed_vma *local_got_refcounts;
+  const Elf_Internal_Rela *rel, *relend;
+
+  if (info->relocatable)
+    return TRUE;
+
+  htab = elf32_tic6x_hash_table (info);
+  if (htab == NULL)
+    return FALSE;
+
+  elf_section_data (sec)->local_dynrel = NULL;
+
+  symtab_hdr = &elf_symtab_hdr (abfd);
+  sym_hashes = elf_sym_hashes (abfd);
+  local_got_refcounts = elf_local_got_refcounts (abfd);
+
+  relend = relocs + sec->reloc_count;
+  for (rel = relocs; rel < relend; rel++)
+    {
+      unsigned long r_symndx;
+      unsigned int r_type;
+      struct elf_link_hash_entry *h = NULL;
+
+      r_symndx = ELF32_R_SYM (rel->r_info);
+      if (r_symndx >= symtab_hdr->sh_info)
+	{
+	  struct elf32_tic6x_link_hash_entry *eh;
+	  struct elf_dyn_relocs **pp;
+	  struct elf_dyn_relocs *p;
+
+	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+	  while (h->root.type == bfd_link_hash_indirect
+		 || h->root.type == bfd_link_hash_warning)
+	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+	  eh = (struct elf32_tic6x_link_hash_entry *) h;
+
+	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
+	    if (p->sec == sec)
+	      {
+		/* Everything must go for SEC.  */
+		*pp = p->next;
+		break;
+	      }
+	}
+
+      r_type = ELF32_R_TYPE (rel->r_info);
+
+      switch (r_type)
+	{
+	case R_C6000_SBR_GOT_U15_W:
+	  if (h != NULL)
+	    {
+	      if (h->got.refcount > 0)
+		h->got.refcount -= 1;
+	    }
+	  else if (local_got_refcounts != NULL)
+	    {
+	      if (local_got_refcounts[r_symndx] > 0)
+		local_got_refcounts[r_symndx] -= 1;
+	    }
+	  break;
+
+	default:
+	  break;
+	}
+    }
+
+  return TRUE;
+}
+
+/* Adjust a symbol defined by a dynamic object and referenced by a
+   regular object.  The current definition is in some section of the
+   dynamic object, but we're not including those sections.  We have to
+   change the definition to something the rest of the link can
+   understand.  */
+
+static bfd_boolean
+elf32_tic6x_adjust_dynamic_symbol (struct bfd_link_info *info,
+				   struct elf_link_hash_entry *h)
+{
+  struct elf32_tic6x_link_hash_table *htab;
+  bfd *dynobj;
+  asection *s;
+
+  dynobj = elf_hash_table (info)->dynobj;
+
+  /* Make sure we know what is going on here.  */
+  BFD_ASSERT (dynobj != NULL
+	      && (h->needs_plt
+		  || h->u.weakdef != NULL
+		  || (h->def_dynamic && h->ref_regular && !h->def_regular)));
+
+  /* If this is a function, put it in the procedure linkage table.  We
+     will fill in the contents of the procedure linkage table later,
+     when we know the address of the .got section.  */
+  if (h->type == STT_FUNC
+      || h->needs_plt)
+    {
+      if (h->plt.refcount <= 0
+	  || SYMBOL_CALLS_LOCAL (info, h)
+	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+	      && h->root.type == bfd_link_hash_undefweak))
+	{
+	  /* This case can occur if we saw a PLT32 reloc in an input
+	     file, but the symbol was never referred to by a dynamic
+	     object, or if all references were garbage collected.  In
+	     such a case, we don't actually need to build a procedure
+	     linkage table, and we can just do a PC32 reloc instead.  */
+	  h->plt.offset = (bfd_vma) -1;
+	  h->needs_plt = 0;
+	}
+
+      return TRUE;
+    }
+
+  /* If this is a weak symbol, and there is a real definition, the
+     processor independent code will have arranged for us to see the
+     real definition first, and we can just use the same value.  */
+  if (h->u.weakdef != NULL)
+    {
+      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
+		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
+      h->root.u.def.section = h->u.weakdef->root.u.def.section;
+      h->root.u.def.value = h->u.weakdef->root.u.def.value;
+      h->non_got_ref = h->u.weakdef->non_got_ref;
+      return TRUE;
+    }
+
+  /* This is a reference to a symbol defined by a dynamic object which
+     is not a function.  */
+
+  /* If we are creating a shared library, we must presume that the
+     only references to the symbol are via the global offset table.
+     For such cases we need not do anything here; the relocations will
+     be handled correctly by relocate_section.  */
+  if (info->shared)
+    return TRUE;
+
+  /* If there are no references to this symbol that do not use the
+     GOT, we don't need to generate a copy reloc.  */
+  if (!h->non_got_ref)
+    return TRUE;
+
+  /* If -z nocopyreloc was given, we won't generate them either.  */
+  if (info->nocopyreloc)
+    {
+      h->non_got_ref = 0;
+      return TRUE;
+    }
+
+  htab = elf32_tic6x_hash_table (info);
+  if (htab == NULL)
+    return FALSE;
+
+  if (h->size == 0)
+    {
+      (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
+			     h->root.root.string);
+      return TRUE;
+    }
+
+  /* We must allocate the symbol in our .dynbss section, which will
+     become part of the .bss section of the executable.  There will be
+     an entry for this symbol in the .dynsym section.  The dynamic
+     object will contain position independent code, so all references
+     from the dynamic object to this symbol will go through the global
+     offset table.  The dynamic linker will use the .dynsym entry to
+     determine the address it must put in the global offset table, so
+     both the dynamic object and the regular object will refer to the
+     same memory location for the variable.  */
+
+  /* We must generate a R_386_COPY reloc to tell the dynamic linker to
+     copy the initial value out of the dynamic object and into the
+     runtime process image.  */
+  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
+    {
+      htab->srelbss->size += sizeof (Elf32_External_Rela);
+      h->needs_copy = 1;
+    }
+
+  s = htab->sdynbss;
+
+  return _bfd_elf_adjust_dynamic_copy (h, s);
+}
+
 static bfd_boolean
 elf32_tic6x_new_section_hook (bfd *abfd, asection *sec)
 {
@@ -1394,6 +2016,29 @@ elf32_tic6x_rel_relocation_p (bfd *abfd,
 	  < NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel);
 }
 
+/* We need dynamic symbols for every section, since segments can
+   relocate independently.  */
+static bfd_boolean
+elf32_tic6x_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
+				      struct bfd_link_info *info ATTRIBUTE_UNUSED,
+				      asection *p)
+{
+  switch (elf_section_data (p)->this_hdr.sh_type)
+    {
+    case SHT_PROGBITS:
+    case SHT_NOBITS:
+      /* If sh_type is yet undecided, assume it could be
+	 SHT_PROGBITS/SHT_NOBITS.  */
+    case SHT_NULL:
+      return FALSE;
+
+      /* There shouldn't be section relative relocations
+	 against any other section.  */
+    default:
+      return TRUE;
+    }
+}
+
 static bfd_boolean
 elf32_tic6x_relocate_section (bfd *output_bfd,
 			      struct bfd_link_info *info,
@@ -1404,14 +2049,20 @@ elf32_tic6x_relocate_section (bfd *outpu
 			      Elf_Internal_Sym *local_syms,
 			      asection **local_sections)
 {
+  bfd *dynobj;
+  struct elf32_tic6x_link_hash_table *htab;
   Elf_Internal_Shdr *symtab_hdr;
   struct elf_link_hash_entry **sym_hashes;
+  bfd_vma *local_got_offsets;
   Elf_Internal_Rela *rel;
   Elf_Internal_Rela *relend;
   bfd_boolean ok = TRUE;
 
+  htab = elf32_tic6x_hash_table (info);
+  dynobj = elf_hash_table (info)->dynobj;
   symtab_hdr = & elf_symtab_hdr (input_bfd);
   sym_hashes = elf_sym_hashes (input_bfd);
+  local_got_offsets = elf_local_got_offsets (input_bfd);
 
   relend = relocs + input_section->reloc_count;
 
@@ -1424,7 +2075,7 @@ elf32_tic6x_relocate_section (bfd *outpu
       Elf_Internal_Sym *sym;
       asection *sec;
       struct elf_link_hash_entry *h;
-      bfd_vma relocation;
+      bfd_vma off, relocation;
       bfd_boolean unresolved_reloc;
       bfd_reloc_status_type r;
       struct bfd_link_hash_entry *sbh;
@@ -1497,22 +2148,130 @@ elf32_tic6x_relocate_section (bfd *outpu
 	  continue;
 
 	case R_C6000_PCR_S21:
+	  /* A branch to an undefined weak symbol is turned into a
+	     "b .s2 B3" instruction if the existing insn is of the
+	     form "b .s2 symbol".  */
+	  if (h ? h->root.type == bfd_link_hash_undefweak
+	      && (htab->elf.splt == NULL || h->plt.offset == (bfd_vma) -1)
+	      : r_symndx != STN_UNDEF && bfd_is_und_section (sec))
+	    {
+	      unsigned long oldval;
+	      oldval = bfd_get_32 (input_bfd, contents + rel->r_offset);
+
+	      if ((oldval & 0x7e) == 0x12)
+		{
+		  oldval &= 0xF0000001;
+		  bfd_put_32 (input_bfd, oldval | 0x000c0362,
+			      contents + rel->r_offset);
+		  r = bfd_reloc_ok;
+		  goto done_reloc;
+		}
+	    }
+
 	case R_C6000_PCR_S12:
 	case R_C6000_PCR_S10:
 	case R_C6000_PCR_S7:
+	  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);
+	    }
+
 	  /* Generic PC-relative handling produces a value relative to
 	     the exact location of the relocation.  Adjust it to be
 	     relative to the start of the fetch packet instead.  */
 	  relocation += (input_section->output_section->vma
 			 + input_section->output_offset
 			 + rel->r_offset) & 0x1f;
-	  /* Fall through.  */
+	  unresolved_reloc = FALSE;
+	  break;
+
 	case R_C6000_ABS32:
 	case R_C6000_ABS16:
 	case R_C6000_ABS8:
 	case R_C6000_ABS_S16:
 	case R_C6000_ABS_L16:
 	case R_C6000_ABS_H16:
+	  /* When generating a shared object or relocatable executable, these
+	     relocations are copied into the output file to be resolved at
+	     run time.  */
+	  if ((info->shared || using_dsbt (output_bfd))
+	      && (input_section->flags & SEC_ALLOC)
+	      && (h == NULL
+		  || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+		  || h->root.type != bfd_link_hash_undefweak))
+	    {
+	      Elf_Internal_Rela outrel;
+	      bfd_boolean skip, relocate;
+	      asection *sreloc;
+
+	      unresolved_reloc = FALSE;
+
+	      sreloc = elf_section_data (input_section)->sreloc;
+	      BFD_ASSERT (sreloc != NULL && sreloc->contents != NULL);
+
+	      skip = FALSE;
+	      relocate = FALSE;
+
+	      outrel.r_offset =
+		_bfd_elf_section_offset (output_bfd, info, input_section,
+					 rel->r_offset);
+	      if (outrel.r_offset == (bfd_vma) -1)
+		skip = TRUE;
+	      else if (outrel.r_offset == (bfd_vma) -2)
+		skip = TRUE, relocate = TRUE;
+	      outrel.r_offset += (input_section->output_section->vma
+				  + input_section->output_offset);
+
+	      if (skip)
+		memset (&outrel, 0, sizeof outrel);
+	      else if (h != NULL
+		       && h->dynindx != -1
+		       && (!info->shared
+			   || !info->symbolic
+			   || !h->def_regular))
+		{
+		  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
+		  outrel.r_addend = rel->r_addend;
+		}
+	      else
+		{
+		  long indx;
+
+		  outrel.r_addend = relocation + rel->r_addend;
+
+		  if (bfd_is_abs_section (sec))
+		    indx = 0;
+		  else if (sec == NULL || sec->owner == NULL)
+		    {
+		      bfd_set_error (bfd_error_bad_value);
+		      return FALSE;
+		    }
+		  else
+		    {
+		      asection *osec;
+
+		      osec = sec->output_section;
+		      indx = elf_section_data (osec)->dynindx;
+		      outrel.r_addend -= osec->vma;
+		      BFD_ASSERT (indx != 0);
+		    }
+
+		  outrel.r_info = ELF32_R_INFO (indx, r_type);
+		}
+
+	      install_rela (output_bfd, sreloc, &outrel);
+
+	      /* If this reloc is against an external symbol, we do not want to
+		 fiddle with the addend.  Otherwise, we need to include the symbol
+		 value so that it becomes an addend for the dynamic reloc.  */
+	      if (! relocate)
+		continue;
+	    }
+
 	  /* Generic logic OK.  */
 	  break;
 
@@ -1547,7 +2306,124 @@ elf32_tic6x_relocate_section (bfd *outpu
 	case R_C6000_SBR_GOT_U15_W:
 	case R_C6000_SBR_GOT_L16_W:
 	case R_C6000_SBR_GOT_H16_W:
+	  /* Relocation is to the entry for this symbol in the global
+	     offset table.  */
+	  if (htab->elf.sgot == NULL)
+	    abort ();
+
+	  if (h != NULL)
+	    {
+	      bfd_boolean dyn;
+
+	      off = h->got.offset;
+	      dyn = htab->elf.dynamic_sections_created;
+	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
+		  || (info->shared
+		      && SYMBOL_REFERENCES_LOCAL (info, h))
+		  || (ELF_ST_VISIBILITY (h->other)
+		      && h->root.type == bfd_link_hash_undefweak))
+		{
+		  /* This is actually a static link, or it is a
+		     -Bsymbolic link and the symbol is defined
+		     locally, or the symbol was forced to be local
+		     because of a version file.  We must initialize
+		     this entry in the global offset table.  Since the
+		     offset must always be a multiple of 4, we use the
+		     least significant bit to record whether we have
+		     initialized it already.
+
+		     When doing a dynamic link, we create a .rel.got
+		     relocation entry to initialize the value.  This
+		     is done in the finish_dynamic_symbol routine.  */
+		  if ((off & 1) != 0)
+		    off &= ~1;
+		  else
+		    {
+		      bfd_put_32 (output_bfd, relocation,
+				  htab->elf.sgot->contents + off);
+		      h->got.offset |= 1;
+
+		      if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
+			  && !(ELF_ST_VISIBILITY (h->other)
+			       && h->root.type == bfd_link_hash_undefweak))
+			make_got_dynreloc (output_bfd, htab, sec, off);
+		    }
+		}
+	      else
+		unresolved_reloc = FALSE;
+	    }
+	  else
+	    {
+	      if (local_got_offsets == NULL)
+		abort ();
+
+	      off = local_got_offsets[r_symndx];
+
+	      /* The offset must always be a multiple of 4.  We use
+		 the least significant bit to record whether we have
+		 already generated the necessary reloc.  */
+	      if ((off & 1) != 0)
+		off &= ~1;
+	      else
+		{
+		  bfd_put_32 (output_bfd, relocation,
+			      htab->elf.sgot->contents + off);
+
+		  if (info->shared || using_dsbt (output_bfd))
+		    make_got_dynreloc (output_bfd, htab, sec, off);
+
+		  local_got_offsets[r_symndx] |= 1;
+		}
+	    }
+
+	  if (off >= (bfd_vma) -2)
+	    abort ();
+
+	  if (htab->dsbt)
+	    relocation = (htab->elf.sgot->output_section->vma
+			  + htab->elf.sgot->output_offset + off
+			  - htab->dsbt->output_section->vma
+			  - htab->dsbt->output_offset);
+	  else
+	    relocation = (htab->elf.sgot->output_section->vma
+			  + htab->elf.sgot->output_offset + off
+			  - htab->elf.sgotplt->output_section->vma
+			  - htab->elf.sgotplt->output_offset);
+
+	  if (rel->r_addend != 0)
+	    {
+	      /* We can't do anything for a relocation which is against
+		 a symbol *plus offset*.  GOT holds relocations for
+		 symbols.  Make this an error; the compiler isn't
+		 allowed to pass us these kinds of things.  */
+	      if (h == NULL)
+		(*_bfd_error_handler)
+		  (_("%B, section %A: relocation %s with non-zero addend %d"
+		     " against local symbol"),
+		   input_bfd,
+		   input_section,
+		   elf32_tic6x_howto_table[r_type].name,
+		   rel->r_addend);
+	      else
+		(*_bfd_error_handler)
+		  (_("%B, section %A: relocation %s with non-zero addend %d"
+		     " against symbol `%s'"),
+		   input_bfd,
+		   input_section,
+		   elf32_tic6x_howto_table[r_type].name,
+		   rel->r_addend,
+		   h->root.root.string[0] != '\0' ? h->root.root.string
+		   : _("[whose name is lost]"));
+
+	      bfd_set_error (bfd_error_bad_value);
+	      return FALSE;
+	    }
+	  break;
+
 	case R_C6000_DSBT_INDEX:
+	  relocation = elf32_tic6x_hash_table (info)->params.dsbt_index;
+	  break;
+
 	case R_C6000_PREL31:
 	  /* Shared libraries and exception handling support not
 	     implemented.  */
@@ -1658,6 +2534,906 @@ elf32_tic6x_relocate_section (bfd *outpu
   return ok;
 }
 
+\f
+/* Look through the relocs for a section during the first phase, and
+   calculate needed space in the global offset table, procedure linkage
+   table, and dynamic reloc sections.  */
+
+static bfd_boolean
+elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info,
+			  asection *sec, const Elf_Internal_Rela *relocs)
+{
+  struct elf32_tic6x_link_hash_table *htab;
+  Elf_Internal_Shdr *symtab_hdr;
+  struct elf_link_hash_entry **sym_hashes;
+  const Elf_Internal_Rela *rel;
+  const Elf_Internal_Rela *rel_end;
+  asection *sreloc;
+
+  if (info->relocatable)
+    return TRUE;
+
+  htab = elf32_tic6x_hash_table (info);
+  symtab_hdr = &elf_symtab_hdr (abfd);
+  sym_hashes = elf_sym_hashes (abfd);
+
+  /* Create dynamic sections for relocatable executables so that we can
+     copy relocations.  */
+  if (using_dsbt (abfd)
+      && ! htab->elf.dynamic_sections_created)
+    {
+      if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
+	return FALSE;
+    }
+
+  sreloc = NULL;
+
+  rel_end = relocs + sec->reloc_count;
+  for (rel = relocs; rel < rel_end; rel++)
+    {
+      unsigned int r_type;
+      unsigned long r_symndx;
+      struct elf_link_hash_entry *h;
+      Elf_Internal_Sym *isym;
+
+      r_symndx = ELF32_R_SYM (rel->r_info);
+      r_type = ELF32_R_TYPE (rel->r_info);
+
+      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
+	{
+	  (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
+				 abfd,
+				 r_symndx);
+	  return FALSE;
+	}
+
+      if (r_symndx < symtab_hdr->sh_info)
+	{
+	  /* A local symbol.  */
+	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+					abfd, r_symndx);
+	  if (isym == NULL)
+	    return FALSE;
+	  h = NULL;
+	}
+      else
+	{
+	  isym = NULL;
+	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+	  while (h->root.type == bfd_link_hash_indirect
+		 || h->root.type == bfd_link_hash_warning)
+	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+	}
+
+      switch (r_type)
+	{
+	case R_C6000_PCR_S21:
+	  /* 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
+	     never referenced by a dynamic object, in which case we
+	     don't need to generate a procedure linkage table entry
+	     after all.  */
+
+	  /* If this is a local symbol, we resolve it directly without
+	     creating a procedure linkage table entry.  */
+	  if (h == NULL)
+	    continue;
+
+	  h->needs_plt = 1;
+	  h->plt.refcount += 1;
+	  break;
+
+	case R_C6000_SBR_GOT_U15_W:
+	case R_C6000_SBR_GOT_L16_W:
+	case R_C6000_SBR_GOT_H16_W:
+	  /* This symbol requires a global offset table entry.  */
+	  if (h != NULL)
+	    {
+	      h->got.refcount += 1;
+	    }
+	  else
+	    {
+	      bfd_signed_vma *local_got_refcounts;
+
+	      /* This is a global offset table entry for a local symbol.  */
+	      local_got_refcounts = elf_local_got_refcounts (abfd);
+	      if (local_got_refcounts == NULL)
+		{
+		  bfd_size_type size;
+
+		  size = symtab_hdr->sh_info;
+		  size *= (sizeof (bfd_signed_vma)
+			   + sizeof (bfd_vma) + sizeof(char));
+		  local_got_refcounts = bfd_zalloc (abfd, size);
+		  if (local_got_refcounts == NULL)
+		    return FALSE;
+		  elf_local_got_refcounts (abfd) = local_got_refcounts;
+		}
+	      local_got_refcounts[r_symndx] += 1;
+	    }
+
+	  if (htab->elf.sgot == NULL)
+	    {
+	      if (htab->elf.dynobj == NULL)
+		htab->elf.dynobj = abfd;
+	      if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
+		return FALSE;
+	    }
+	  break;
+
+	case R_C6000_ABS32:
+	case R_C6000_ABS16:
+	case R_C6000_ABS8:
+	case R_C6000_ABS_S16:
+	case R_C6000_ABS_L16:
+	case R_C6000_ABS_H16:
+	  /* If we are creating a shared library, and this is a reloc
+	     against a global symbol, or a non PC relative reloc
+	     against a local symbol, then we need to copy the reloc
+	     into the shared library.  However, if we are linking with
+	     -Bsymbolic, we do not need to copy a reloc against a
+	     global symbol which is defined in an object we are
+	     including in the link (i.e., DEF_REGULAR is set).  At
+	     this point we have not seen all the input files, so it is
+	     possible that DEF_REGULAR is not set now but will be set
+	     later (it is never cleared).  In case of a weak definition,
+	     DEF_REGULAR may be cleared later by a strong definition in
+	     a shared library.  We account for that possibility below by
+	     storing information in the relocs_copied field of the hash
+	     table entry.  A similar situation occurs when creating
+	     shared libraries and symbol visibility changes render the
+	     symbol local.
+
+	     If on the other hand, we are creating an executable, we
+	     may need to keep relocations for symbols satisfied by a
+	     dynamic library if we manage to avoid copy relocs for the
+	     symbol.  */
+	  if ((info->shared || using_dsbt (abfd)) && (sec->flags & SEC_ALLOC) != 0)
+	    {
+	      struct elf_dyn_relocs *p;
+	      struct elf_dyn_relocs **head;
+
+	      /* We must copy these reloc types into the output file.
+		 Create a reloc section in dynobj and make room for
+		 this reloc.  */
+	      if (sreloc == NULL)
+		{
+		  if (htab->elf.dynobj == NULL)
+		    htab->elf.dynobj = abfd;
+
+		  sreloc = _bfd_elf_make_dynamic_reloc_section
+		    (sec, htab->elf.dynobj, 2, abfd, /*rela? */ TRUE);
+
+		  if (sreloc == NULL)
+		    return FALSE;
+		}
+
+	      /* If this is a global symbol, we count the number of
+		 relocations we need for this symbol.  */
+	      if (h != NULL)
+		{
+		  head = &((struct elf32_tic6x_link_hash_entry *) h)->dyn_relocs;
+		}
+	      else
+		{
+		  /* Track dynamic relocs needed for local syms too.
+		     We really need local syms available to do this
+		     easily.  Oh well.  */
+		  void **vpp;
+		  asection *s;
+
+		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
+		  if (s == NULL)
+		    s = sec;
+
+		  vpp = &elf_section_data (s)->local_dynrel;
+		  head = (struct elf_dyn_relocs **)vpp;
+		}
+
+	      p = *head;
+	      if (p == NULL || p->sec != sec)
+		{
+		  bfd_size_type amt = sizeof *p;
+		  p = bfd_alloc (htab->elf.dynobj, amt);
+		  if (p == NULL)
+		    return FALSE;
+		  p->next = *head;
+		  *head = p;
+		  p->sec = sec;
+		  p->count = 0;
+		}
+
+	      p->count += 1;
+	    }
+	  break;
+
+	case R_C6000_SBR_U15_B:
+	case R_C6000_SBR_U15_H:
+	case R_C6000_SBR_U15_W:
+	case R_C6000_SBR_S16:
+	case R_C6000_SBR_L16_B:
+	case R_C6000_SBR_L16_H:
+	case R_C6000_SBR_L16_W:
+	case R_C6000_SBR_H16_B:
+	case R_C6000_SBR_H16_H:
+	case R_C6000_SBR_H16_W:
+	  if (h != NULL && info->executable)
+	    {
+	      /* For B14-relative addresses, we might need a copy
+		 reloc.  */
+	      h->non_got_ref = 1;
+	    }
+	  break;
+
+	default:
+	  break;
+	}
+    }
+
+  return TRUE;
+}
+
+static bfd_boolean
+elf32_tic6x_add_symbol_hook (bfd *abfd,
+			     struct bfd_link_info *info ATTRIBUTE_UNUSED,
+			     Elf_Internal_Sym *sym,
+			     const char **namep ATTRIBUTE_UNUSED,
+			     flagword *flagsp ATTRIBUTE_UNUSED,
+			     asection **secp,
+			     bfd_vma *valp)
+{
+  switch (sym->st_shndx)
+    {
+    case SHN_TIC6X_SCOMMON:
+      *secp = bfd_make_section_old_way (abfd, ".scommon");
+      (*secp)->flags |= SEC_IS_COMMON;
+      *valp = sym->st_size;
+      bfd_set_section_alignment (abfd, *secp, bfd_log2 (sym->st_value));
+      break;
+    }
+
+  return TRUE;
+}
+
+static void
+elf32_tic6x_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *asym)
+{
+  elf_symbol_type *elfsym;
+
+  elfsym = (elf_symbol_type *) asym;
+  switch (elfsym->internal_elf_sym.st_shndx)
+    {
+    case SHN_TIC6X_SCOMMON:
+      if (tic6x_elf_scom_section.name == NULL)
+        {
+          /* Initialize the small common section.  */
+          tic6x_elf_scom_section.name = ".scommon";
+          tic6x_elf_scom_section.flags = SEC_IS_COMMON;
+          tic6x_elf_scom_section.output_section = &tic6x_elf_scom_section;
+          tic6x_elf_scom_section.symbol = &tic6x_elf_scom_symbol;
+          tic6x_elf_scom_section.symbol_ptr_ptr = &tic6x_elf_scom_symbol_ptr;
+          tic6x_elf_scom_symbol.name = ".scommon";
+          tic6x_elf_scom_symbol.flags = BSF_SECTION_SYM;
+          tic6x_elf_scom_symbol.section = &tic6x_elf_scom_section;
+          tic6x_elf_scom_symbol_ptr = &tic6x_elf_scom_symbol;
+        }
+      asym->section = &tic6x_elf_scom_section;
+      asym->value = elfsym->internal_elf_sym.st_size;
+      break;
+    }
+}
+
+static int
+elf32_tic6x_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+				     const char *name ATTRIBUTE_UNUSED,
+				     Elf_Internal_Sym *sym,
+				     asection *input_sec,
+				     struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
+{
+  /* If we see a common symbol, which implies a relocatable link, then
+     if a symbol was small common in an input file, mark it as small
+     common in the output file.  */
+  if (sym->st_shndx == SHN_COMMON && strcmp (input_sec->name, ".scommon") == 0)
+    sym->st_shndx = SHN_TIC6X_SCOMMON;
+
+  return 1;
+}
+
+static bfd_boolean
+elf32_tic6x_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
+				      asection *sec,
+				      int *retval)
+{
+  if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
+    {
+      *retval = SHN_TIC6X_SCOMMON;
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+/* Allocate space in .plt, .got and associated reloc sections for
+   dynamic relocs.  */
+
+static bfd_boolean
+elf32_tic6x_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
+{
+  struct bfd_link_info *info;
+  struct elf32_tic6x_link_hash_table *htab;
+  struct elf32_tic6x_link_hash_entry *eh;
+  struct elf_dyn_relocs *p;
+
+  if (h->root.type == bfd_link_hash_indirect)
+    return TRUE;
+
+  if (h->root.type == bfd_link_hash_warning)
+    /* When warning symbols are created, they **replace** the "real"
+       entry in the hash table, thus we never get to see the real
+       symbol in a hash traversal.  So look at it now.  */
+    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+  eh = (struct elf32_tic6x_link_hash_entry *) h;
+
+  info = (struct bfd_link_info *) inf;
+  htab = elf32_tic6x_hash_table (info);
+
+  if (htab->elf.dynamic_sections_created && h->plt.refcount > 0)
+    {
+      /* Make sure this symbol is output as a dynamic symbol.
+	 Undefined weak syms won't yet be marked as dynamic.  */
+      if (h->dynindx == -1 && !h->forced_local)
+	{
+	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
+	    return FALSE;
+	}
+
+      if (info->shared
+	  || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
+	{
+	  asection *s = htab->elf.splt;
+
+	  /* If this is the first .plt entry, make room for the special
+	     first entry.  */
+	  if (s->size == 0)
+	    s->size += PLT_ENTRY_SIZE;
+
+	  h->plt.offset = s->size;
+
+	  /* If this symbol is not defined in a regular file, and we are
+	     not generating a shared library, then set the symbol to this
+	     location in the .plt.  This is required to make function
+	     pointers compare as equal between the normal executable and
+	     the shared library.  */
+	  if (! info->shared && !h->def_regular)
+	    {
+	      h->root.u.def.section = s;
+	      h->root.u.def.value = h->plt.offset;
+	    }
+
+	  /* Make room for this entry.  */
+	  s->size += PLT_ENTRY_SIZE;
+	  /* We also need to make an entry in the .got.plt section, which
+	     will be placed in the .got section by the linker script.  */
+	  htab->elf.sgotplt->size += 4;
+	  /* We also need to make an entry in the .rel.plt section.  */
+	  htab->elf.srelplt->size += sizeof (Elf32_External_Rela);
+	}
+      else
+	{
+	  h->plt.offset = (bfd_vma) -1;
+	  h->needs_plt = 0;
+	}
+    }
+  else
+    {
+      h->plt.offset = (bfd_vma) -1;
+      h->needs_plt = 0;
+    }
+
+  if (h->got.refcount > 0)
+    {
+      asection *s;
+
+      /* Make sure this symbol is output as a dynamic symbol.
+	 Undefined weak syms won't yet be marked as dynamic.  */
+      if (h->dynindx == -1
+	  && !h->forced_local)
+	{
+	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
+	    return FALSE;
+	}
+
+      s = htab->elf.sgot;
+      h->got.offset = s->size;
+      s->size += 4;
+
+      if (!(ELF_ST_VISIBILITY (h->other)
+	    && h->root.type == bfd_link_hash_undefweak))
+	htab->elf.srelgot->size += sizeof (Elf32_External_Rela);
+    }
+  else
+    h->got.offset = (bfd_vma) -1;
+
+  if (eh->dyn_relocs == NULL)
+    return TRUE;
+
+  /* Discard relocs on undefined weak syms with non-default
+     visibility.  */
+  if (info->shared || using_dsbt (htab->obfd))
+    {
+      if (eh->dyn_relocs != NULL
+	  && h->root.type == bfd_link_hash_undefweak)
+	{
+	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
+	    eh->dyn_relocs = NULL;
+
+	  /* Make sure undefined weak symbols are output as a dynamic
+	     symbol in PIEs.  */
+	  else if (h->dynindx == -1
+		   && !h->forced_local)
+	    {
+	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
+		return FALSE;
+	    }
+	}
+    }
+
+  /* Finally, allocate space.  */
+  for (p = eh->dyn_relocs; p != NULL; p = p->next)
+    {
+      asection *sreloc;
+
+      sreloc = elf_section_data (p->sec)->sreloc;
+
+      BFD_ASSERT (sreloc != NULL);
+      sreloc->size += p->count * sizeof (Elf32_External_Rela);
+    }
+
+  return TRUE;
+}
+
+/* Find any dynamic relocs that apply to read-only sections.  */
+
+static bfd_boolean
+elf32_tic6x_readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
+{
+  struct elf32_tic6x_link_hash_entry *eh;
+  struct elf_dyn_relocs *p;
+
+  if (h->root.type == bfd_link_hash_warning)
+    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+  eh = (struct elf32_tic6x_link_hash_entry *) h;
+  for (p = eh->dyn_relocs; p != NULL; p = p->next)
+    {
+      asection *s = p->sec->output_section;
+
+      if (s != NULL && (s->flags & SEC_READONLY) != 0)
+	{
+	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
+
+	  info->flags |= DF_TEXTREL;
+
+	  /* Not an error, just cut short the traversal.  */
+	  return FALSE;
+	}
+    }
+  return TRUE;
+}
+
+/* Set the sizes of the dynamic sections.  */
+
+static bfd_boolean
+elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
+{
+  struct elf32_tic6x_link_hash_table *htab;
+  bfd *dynobj;
+  asection *s;
+  bfd_boolean relocs;
+  bfd *ibfd;
+
+  htab = elf32_tic6x_hash_table (info);
+  dynobj = htab->elf.dynobj;
+  if (dynobj == NULL)
+    abort ();
+
+  if (htab->elf.dynamic_sections_created)
+    {
+      /* Set the contents of the .interp section to the interpreter.  */
+      if (info->executable)
+	{
+	  s = bfd_get_section_by_name (dynobj, ".interp");
+	  if (s == NULL)
+	    abort ();
+	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
+	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
+	}
+    }
+
+  /* Set up .got offsets for local syms, and space for local dynamic
+     relocs.  */
+  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
+    {
+      bfd_signed_vma *local_got;
+      bfd_signed_vma *end_local_got;
+      char *local_tls_type;
+      bfd_vma *local_tlsdesc_gotent;
+      bfd_size_type locsymcount;
+      Elf_Internal_Shdr *symtab_hdr;
+      asection *srel;
+
+      for (s = ibfd->sections; s != NULL; s = s->next)
+	{
+	  struct elf_dyn_relocs *p;
+
+	  for (p = ((struct elf_dyn_relocs *)
+		     elf_section_data (s)->local_dynrel);
+	       p != NULL;
+	       p = p->next)
+	    {
+	      if (!bfd_is_abs_section (p->sec)
+		  && bfd_is_abs_section (p->sec->output_section))
+		{
+		  /* Input section has been discarded, either because
+		     it is a copy of a linkonce section or due to
+		     linker script /DISCARD/, so we'll be discarding
+		     the relocs too.  */
+		}
+	      else if (p->count != 0)
+		{
+		  srel = elf_section_data (p->sec)->sreloc;
+		  srel->size += p->count * sizeof (Elf32_External_Rela);
+		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
+		    info->flags |= DF_TEXTREL;
+		}
+	    }
+	}
+
+      local_got = elf_local_got_refcounts (ibfd);
+      if (!local_got)
+	continue;
+
+      symtab_hdr = &elf_symtab_hdr (ibfd);
+      locsymcount = symtab_hdr->sh_info;
+      end_local_got = local_got + locsymcount;
+      s = htab->elf.sgot;
+      srel = htab->elf.srelgot;
+      for (; local_got < end_local_got;
+	   ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
+	{
+	  if (*local_got > 0)
+	    {
+	      *local_got = s->size;
+	      s->size += 4;
+
+	      if (info->shared || using_dsbt (output_bfd))
+		{
+		  srel->size += sizeof (Elf32_External_Rela);
+		}
+	    }
+	  else
+	    *local_got = (bfd_vma) -1;
+	}
+    }
+
+  /* Allocate global sym .plt and .got entries, and space for global
+     sym dynamic relocs.  */
+  elf_link_hash_traverse (&htab->elf, elf32_tic6x_allocate_dynrelocs, info);
+
+  /* We now have determined the sizes of the various dynamic sections.
+     Allocate memory for them.  */
+  relocs = FALSE;
+  for (s = dynobj->sections; s != NULL; s = s->next)
+    {
+      bfd_boolean strip_section = TRUE;
+
+      if ((s->flags & SEC_LINKER_CREATED) == 0)
+	continue;
+
+      if (s == htab->dsbt)
+	s->size = 4 * htab->params.dsbt_size;
+      else if (s == htab->elf.splt
+	       || s == htab->elf.sgot
+	       || s == htab->elf.sgotplt
+	       || s == htab->sdynbss)
+	{
+	  /* Strip this section if we don't need it; see the
+	     comment below.  */
+	  /* We'd like to strip these sections if they aren't needed, but if
+	     we've exported dynamic symbols from them we must leave them.
+	     It's too late to tell BFD to get rid of the symbols.  */
+
+	  if (htab->elf.hplt != NULL)
+	    strip_section = FALSE;
+
+	  /* Round up the size of the PLT section to a multiple of 32.  */
+	  if (s == htab->elf.splt && s->size > 0)
+	    s->size = (s->size + 31) & ~(bfd_vma)31;
+	}
+      else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
+	{
+	  if (s->size != 0
+	      && s != htab->elf.srelplt)
+	    relocs = TRUE;
+
+	  /* We use the reloc_count field as a counter if we need
+	     to copy relocs into the output file.  */
+	  s->reloc_count = 0;
+	}
+      else
+	{
+	  /* It's not one of our sections, so don't allocate space.  */
+	  continue;
+	}
+
+      if (s->size == 0)
+	{
+	  /* If we don't need this section, strip it from the
+	     output file.  This is mostly to handle .rel.bss and
+	     .rel.plt.  We must create both sections in
+	     create_dynamic_sections, because they must be created
+	     before the linker maps input sections to output
+	     sections.  The linker does that before
+	     adjust_dynamic_symbol is called, and it is that
+	     function which decides whether anything needs to go
+	     into these sections.  */
+	  if (strip_section)
+	    s->flags |= SEC_EXCLUDE;
+	  continue;
+	}
+
+      if ((s->flags & SEC_HAS_CONTENTS) == 0)
+	continue;
+
+      /* Allocate memory for the section contents.  We use bfd_zalloc
+	 here in case unused entries are not reclaimed before the
+	 section's contents are written out.  This should not happen,
+	 but this way if it does, we get a R_C6000_NONE reloc instead
+	 of garbage.  */
+      s->contents = bfd_zalloc (dynobj, s->size);
+      if (s->contents == NULL)
+	return FALSE;
+    }
+
+  if (htab->elf.dynamic_sections_created)
+    {
+      /* Add some entries to the .dynamic section.  We fill in the
+	 values later, in elf32_tic6x_finish_dynamic_sections, but we
+	 must add the entries now so that we get the correct size for
+	 the .dynamic section.  The DT_DEBUG entry is filled in by the
+	 dynamic linker and used by the debugger.  */
+#define add_dynamic_entry(TAG, VAL) \
+  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
+
+      if (info->executable)
+	{
+	  if (!add_dynamic_entry (DT_DEBUG, 0))
+	    return FALSE;
+	}
+
+      if (!add_dynamic_entry (DT_C6000_DSBT_BASE, 0)
+	  || !add_dynamic_entry (DT_C6000_DSBT_SIZE, htab->params.dsbt_size)
+	  || !add_dynamic_entry (DT_C6000_DSBT_INDEX,
+				 htab->params.dsbt_index))
+	return FALSE;
+
+      if (htab->elf.splt->size != 0)
+	{
+	  if (!add_dynamic_entry (DT_PLTGOT, 0)
+	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
+	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
+	      || !add_dynamic_entry (DT_JMPREL, 0))
+	    return FALSE;
+	}
+
+      if (relocs)
+	{
+	  if (!add_dynamic_entry (DT_RELA, 0)
+	      || !add_dynamic_entry (DT_RELASZ, 0)
+	      || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
+	    return FALSE;
+
+	  /* If any dynamic relocs apply to a read-only section,
+	     then we need a DT_TEXTREL entry.  */
+	  if ((info->flags & DF_TEXTREL) == 0)
+	    elf_link_hash_traverse (&htab->elf,
+				    elf32_tic6x_readonly_dynrelocs, info);
+
+	  if ((info->flags & DF_TEXTREL) != 0)
+	    {
+	      if (!add_dynamic_entry (DT_TEXTREL, 0))
+		return FALSE;
+	    }
+	}
+    }
+#undef add_dynamic_entry
+
+  return TRUE;
+}
+
+/* This function is called after all the input files have been read,
+   and the input sections have been assigned to output sections.  */
+
+static bfd_boolean
+elf32_tic6x_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
+{
+  if (using_dsbt (output_bfd) && !info->relocatable)
+    {
+      struct elf_link_hash_entry *h;
+
+      /* Force a PT_GNU_STACK segment to be created.  */
+      if (! elf_tdata (output_bfd)->stack_flags)
+	elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
+
+      /* Define __stacksize if it's not defined yet.  */
+      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
+				FALSE, FALSE, FALSE);
+      if (! h || h->root.type != bfd_link_hash_defined
+	  || h->type != STT_OBJECT
+	  || !h->def_regular)
+	{
+	  struct bfd_link_hash_entry *bh = NULL;
+
+	  if (!(_bfd_generic_link_add_one_symbol
+		(info, output_bfd, "__stacksize",
+		 BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
+		 (const char *) NULL, FALSE,
+		 get_elf_backend_data (output_bfd)->collect, &bh)))
+	    return FALSE;
+
+	  h = (struct elf_link_hash_entry *) bh;
+	  h->def_regular = 1;
+	  h->type = STT_OBJECT;
+	}
+    }
+  return TRUE;
+}
+
+static bfd_boolean
+elf32_tic6x_modify_program_headers (bfd *output_bfd,
+				    struct bfd_link_info *info)
+{
+  struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
+  struct elf_segment_map *m;
+  Elf_Internal_Phdr *p;
+
+  /* objcopy and strip preserve what's already there using
+     elf32_tic6x_copy_private_bfd_data ().  */
+  if (! info)
+    return TRUE;
+
+  for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
+    if (m->p_type == PT_GNU_STACK)
+      break;
+
+  if (m)
+    {
+      struct elf_link_hash_entry *h;
+
+      /* Obtain the pointer to the __stacksize symbol.  */
+      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
+				FALSE, FALSE, FALSE);
+      if (h)
+	{
+	  while (h->root.type == bfd_link_hash_indirect
+		 || h->root.type == bfd_link_hash_warning)
+	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+	  BFD_ASSERT (h->root.type == bfd_link_hash_defined);
+	}
+
+      /* Set the header p_memsz from the symbol value.  We
+	 intentionally ignore the symbol section.  */
+      if (h && h->root.type == bfd_link_hash_defined)
+	p->p_memsz = h->root.u.def.value;
+      else
+	p->p_memsz = DEFAULT_STACK_SIZE;
+
+      p->p_align = 8;
+    }
+
+  return TRUE;
+}
+
+static bfd_boolean
+elf32_tic6x_finish_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+				     struct bfd_link_info *info)
+{
+  struct elf32_tic6x_link_hash_table *htab;
+  bfd *dynobj;
+  asection *sdyn;
+
+  htab = elf32_tic6x_hash_table (info);
+  dynobj = htab->elf.dynobj;
+  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
+
+  if (elf_hash_table (info)->dynamic_sections_created)
+    {
+      Elf32_External_Dyn * dyncon;
+      Elf32_External_Dyn * dynconend;
+
+      BFD_ASSERT (sdyn != NULL);
+
+      dyncon = (Elf32_External_Dyn *) sdyn->contents;
+      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
+
+      for (; dyncon < dynconend; dyncon++)
+	{
+	  Elf_Internal_Dyn dyn;
+	  asection *s;
+
+	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
+
+	  switch (dyn.d_tag)
+	    {
+	    default:
+	      break;
+
+	    case DT_C6000_DSBT_BASE:
+	      s = htab->dsbt;
+	      dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset);
+	      break;
+
+	    case DT_PLTGOT:
+	      s = htab->elf.sgotplt;
+	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
+	      break;
+
+	    case DT_JMPREL:
+	      s = htab->elf.srelplt;
+	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
+	      break;
+
+	    case DT_PLTRELSZ:
+	      s = htab->elf.srelplt;
+	      dyn.d_un.d_val = s->size;
+	      break;
+	    }
+	  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
+	}
+
+      /* Fill in the first entry in the procedure linkage table.  */
+      if (htab->elf.splt && htab->elf.splt->size > 0)
+	{
+	  bfd_vma got_offs = (htab->elf.sgotplt->output_section->vma
+			      + htab->elf.sgotplt->output_offset
+			      - htab->dsbt->output_section->vma
+			      - htab->dsbt->output_offset) / 4;
+
+	  /* ldw .D2T2 *+b14[$GOT(0)],b2 */
+	  bfd_put_32 (output_bfd, got_offs << 8 | 0x0100006e,
+		      htab->elf.splt->contents);
+	  /* ldw .D2T2 *+b14[$GOT(4)],b1 */
+	  bfd_put_32 (output_bfd, (got_offs + 1) << 8 | 0x0080006e,
+		      htab->elf.splt->contents + 4);
+	  /* nop 3 */
+	  bfd_put_32 (output_bfd, 0x00004000,
+		      htab->elf.splt->contents + 8);
+	  /* b .s2 b2 */
+	  bfd_put_32 (output_bfd, 0x00080362,
+		      htab->elf.splt->contents + 12);
+	  /* nop 5 */
+	  bfd_put_32 (output_bfd, 0x00008000,
+		      htab->elf.splt->contents + 16);
+
+	  elf_section_data (htab->elf.splt->output_section)
+	    ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
+	}
+    }
+
+  return TRUE;
+}
+
+/* Return address for Ith PLT stub in section PLT, for relocation REL
+   or (bfd_vma) -1 if it should not be included.  */
+
+static bfd_vma
+elf32_tic6x_plt_sym_val (bfd_vma i, const asection *plt,
+			 const arelent *rel ATTRIBUTE_UNUSED)
+{
+  return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
+}
+
 static int
 elf32_tic6x_obj_attrs_arg_type (int tag)
 {
@@ -1993,6 +3769,48 @@ elf32_tic6x_merge_private_bfd_data (bfd 
   return TRUE;
 }
 
+static bfd_boolean
+elf32_tic6x_copy_private_data (bfd * ibfd, bfd * obfd)
+{
+  _bfd_elf_copy_private_bfd_data (ibfd, obfd);
+
+  if (! is_tic6x_elf (ibfd) || ! is_tic6x_elf (obfd))
+    return TRUE;
+
+  /* Copy the stack size.  */
+  if (elf_tdata (ibfd)->phdr && elf_tdata (obfd)->phdr
+      && using_dsbt (ibfd) && using_dsbt (obfd))
+    {
+      unsigned i;
+
+      for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
+	if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
+	  {
+	    Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
+
+	    for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
+	      if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
+		{
+		  memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
+
+		  /* Rewrite the phdrs, since we're only called after they
+		     were first written.  */
+		  if (bfd_seek (obfd,
+				(bfd_signed_vma) get_elf_backend_data (obfd)
+				->s->sizeof_ehdr, SEEK_SET) != 0
+		      || get_elf_backend_data (obfd)->s
+		      ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
+					 elf_elfheader (obfd)->e_phnum) != 0)
+		    return FALSE;
+		  break;
+		}
+
+	    break;
+	  }
+    }
+
+  return TRUE;
+}
 
 #define TARGET_LITTLE_SYM	bfd_elf32_tic6x_le_vec
 #define TARGET_LITTLE_NAME	"elf32-tic6x-le"
@@ -2001,11 +3819,14 @@ elf32_tic6x_merge_private_bfd_data (bfd 
 #define ELF_ARCH		bfd_arch_tic6x
 #define ELF_TARGET_ID		TIC6X_ELF_DATA
 #define ELF_MACHINE_CODE	EM_TI_C6000
-#define ELF_MAXPAGESIZE		1
+#define ELF_MAXPAGESIZE		0x1000
 #define bfd_elf32_bfd_reloc_type_lookup elf32_tic6x_reloc_type_lookup
 #define bfd_elf32_bfd_reloc_name_lookup elf32_tic6x_reloc_name_lookup
+#define bfd_elf32_bfd_copy_private_bfd_data	elf32_tic6x_copy_private_data
 #define bfd_elf32_bfd_merge_private_bfd_data	elf32_tic6x_merge_private_bfd_data
 #define bfd_elf32_mkobject		elf32_tic6x_mkobject
+#define bfd_elf32_bfd_link_hash_table_create  elf32_tic6x_link_hash_table_create
+#define bfd_elf32_bfd_link_hash_table_free    elf32_tic6x_link_hash_table_free
 #define bfd_elf32_new_section_hook	elf32_tic6x_new_section_hook
 #define elf_backend_can_gc_sections	1
 #define elf_backend_default_use_rela_p	1
@@ -2017,9 +3838,41 @@ elf32_tic6x_merge_private_bfd_data (bfd 
 #define elf_backend_obj_attrs_section	".c6xabi.attributes"
 #define elf_backend_obj_attrs_section_type	SHT_C6000_ATTRIBUTES
 #define elf_backend_obj_attrs_vendor	"c6xabi"
+#define elf_backend_can_refcount	1
+#define elf_backend_want_got_plt	1
+#define elf_backend_want_dynbss		1
+#define elf_backend_plt_readonly	1
 #define elf_backend_rela_normal		1
+#define elf_backend_got_header_size     8
+#define elf_backend_gc_sweep_hook	elf32_tic6x_gc_sweep_hook
+#define elf_backend_modify_program_headers \
+  elf32_tic6x_modify_program_headers
+#define elf_backend_create_dynamic_sections \
+  elf32_tic6x_create_dynamic_sections
+#define elf_backend_adjust_dynamic_symbol \
+  elf32_tic6x_adjust_dynamic_symbol
+#define elf_backend_check_relocs        elf32_tic6x_check_relocs
+#define elf_backend_add_symbol_hook     elf32_tic6x_add_symbol_hook
+#define elf_backend_symbol_processing   elf32_tic6x_symbol_processing
+#define elf_backend_link_output_symbol_hook \
+  elf32_tic6x_link_output_symbol_hook
+#define elf_backend_section_from_bfd_section \
+  elf32_tic6x_section_from_bfd_section
 #define elf_backend_relocate_section	elf32_tic6x_relocate_section
+#define elf_backend_finish_dynamic_symbol \
+  elf32_tic6x_finish_dynamic_symbol
+#define elf_backend_always_size_sections \
+  elf32_tic6x_always_size_sections
+#define elf_backend_size_dynamic_sections \
+  elf32_tic6x_size_dynamic_sections
+#define elf_backend_finish_dynamic_sections \
+  elf32_tic6x_finish_dynamic_sections
 #define elf_info_to_howto		elf32_tic6x_info_to_howto
 #define elf_info_to_howto_rel		elf32_tic6x_info_to_howto_rel
 
+#undef elf_backend_omit_section_dynsym
+#define elf_backend_omit_section_dynsym elf32_tic6x_link_omit_section_dynsym
+#define elf_backend_plt_sym_val		elf32_tic6x_plt_sym_val
+
+
 #include "elf32-target.h"
Index: bfd/elf32-tic6x.h
===================================================================
RCS file: /cvs/src/src/bfd/elf32-tic6x.h,v
retrieving revision 1.2
diff -c -p -d -p -u -r1.2 elf32-tic6x.h
--- bfd/elf32-tic6x.h	16 Jun 2010 00:36:01 -0000	1.2
+++ bfd/elf32-tic6x.h	11 Mar 2011 11:33:34 -0000
@@ -1,5 +1,5 @@
 /* 32-bit ELF support for TI C6X
-   Copyright 2010
+   Copyright 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -24,3 +24,12 @@ extern int elf32_tic6x_merge_arch_attrib
 /* This function is provided for use from the assembler.  */
 
 extern void elf32_tic6x_set_use_rela_p (bfd *, bfd_boolean);
+
+struct elf32_tic6x_params
+{
+  int dsbt_index;
+  int dsbt_size;
+};
+
+extern void elf32_tic6x_setup (struct bfd_link_info *,
+			       struct elf32_tic6x_params *);
Index: bfd/libbfd.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd.h,v
retrieving revision 1.246
diff -c -p -d -p -u -r1.246 libbfd.h
--- bfd/libbfd.h	10 Jan 2011 08:40:16 -0000	1.246
+++ bfd/libbfd.h	11 Mar 2011 11:33:34 -0000
@@ -1704,6 +1704,7 @@ static const char *const bfd_reloc_code_
   "BFD_RELOC_C6000_DSBT_INDEX",
   "BFD_RELOC_C6000_PREL31",
   "BFD_RELOC_C6000_COPY",
+  "BFD_RELOC_C6000_JUMP_SLOT",
   "BFD_RELOC_C6000_ALIGN",
   "BFD_RELOC_C6000_FPHEAD",
   "BFD_RELOC_C6000_NOCMP",
Index: bfd/reloc.c
===================================================================
RCS file: /cvs/src/src/bfd/reloc.c,v
retrieving revision 1.211
diff -c -p -d -p -u -r1.211 reloc.c
--- bfd/reloc.c	10 Jan 2011 08:40:16 -0000	1.211
+++ bfd/reloc.c	11 Mar 2011 11:33:35 -0000
@@ -1,6 +1,6 @@
 /* BFD support for handling relocation entries.
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
    Written by Cygnus Support.
 
@@ -3930,6 +3930,8 @@ ENUMX
 ENUMX
   BFD_RELOC_C6000_COPY
 ENUMX
+  BFD_RELOC_C6000_JUMP_SLOT
+ENUMX
   BFD_RELOC_C6000_ALIGN
 ENUMX
   BFD_RELOC_C6000_FPHEAD
Index: binutils/testsuite/lib/binutils-common.exp
===================================================================
RCS file: /cvs/src/src/binutils/testsuite/lib/binutils-common.exp,v
retrieving revision 1.4
diff -c -p -d -p -u -r1.4 binutils-common.exp
--- binutils/testsuite/lib/binutils-common.exp	3 Jan 2011 16:53:28 -0000	1.4
+++ binutils/testsuite/lib/binutils-common.exp	11 Mar 2011 11:33:35 -0000
@@ -1,5 +1,5 @@
 # Copyright 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2003, 2004, 2006, 2007,
-# 2009, 2010 Free Software Foundation, Inc.
+# 2009, 2010, 2011 Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
 #
@@ -33,6 +33,7 @@ proc is_elf_format {} {
 	 && ![istarget frv-*-uclinux*]
 	 && ![istarget bfin-*-uclinux]
 	 && ![istarget sh*-*-uclinux*]
+	 && ![istarget tic6x*-*-uclinux*]
 	 && ![istarget *-*-irix5*]
 	 && ![istarget *-*-irix6*]
 	 && ![istarget *-*-netbsd*]
Index: gas/config/tc-tic6x.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-tic6x.c,v
retrieving revision 1.12
diff -c -p -d -p -u -r1.12 tc-tic6x.c
--- gas/config/tc-tic6x.c	3 Feb 2011 23:20:26 -0000	1.12
+++ gas/config/tc-tic6x.c	11 Mar 2011 11:33:36 -0000
@@ -34,6 +34,11 @@
 #define TRUNC(X)	((valueT) (X) & 0xffffffffU)
 #define SEXT(X)		((TRUNC (X) ^ 0x80000000U) - 0x80000000U)
 
+/* Stuff for .scomm symbols.  */
+static segT sbss_section;
+static asection scom_section;
+static asymbol scom_symbol;
+
 const char comment_chars[] = ";";
 const char line_comment_chars[] = "#*;";
 const char line_separator_chars[] = "@";
@@ -349,6 +354,138 @@ s_tic6x_nocmp (int ignored ATTRIBUTE_UNU
   demand_empty_rest_of_line ();
 }
 
+/* .scomm pseudo-op handler.
+
+   This is a new pseudo-op to handle putting objects in .scommon.
+   By doing this the linker won't need to do any work,
+   and more importantly it removes the implicit -G arg necessary to
+   correctly link the object file.  */
+
+static void
+s_tic6x_scomm (int ignore ATTRIBUTE_UNUSED)
+{
+  char *name;
+  char c;
+  char *p;
+  offsetT size;
+  symbolS *symbolP;
+  offsetT align;
+  int align2;
+
+  name = input_line_pointer;
+  c = get_symbol_end ();
+
+  /* Just after name is now '\0'.  */
+  p = input_line_pointer;
+  *p = c;
+  SKIP_WHITESPACE ();
+  if (*input_line_pointer != ',')
+    {
+      as_bad (_("Expected comma after symbol-name: rest of line ignored."));
+      ignore_rest_of_line ();
+      return;
+    }
+
+  /* Skip ','.  */
+  input_line_pointer++;
+  if ((size = get_absolute_expression ()) < 0)
+    {
+      /* xgettext:c-format  */
+      as_warn (_(".SCOMMon length (%ld.) <0! Ignored."), (long) size);
+      ignore_rest_of_line ();
+      return;
+    }
+
+  /* The third argument to .scomm is the alignment.  */
+  if (*input_line_pointer != ',')
+    align = 8;
+  else
+    {
+      ++input_line_pointer;
+      align = get_absolute_expression ();
+      if (align <= 0)
+	{
+	  as_warn (_("ignoring bad alignment"));
+	  align = 8;
+	}
+    }
+
+  /* Convert to a power of 2 alignment.  */
+  if (align)
+    {
+      for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2)
+	continue;
+      if (align != 1)
+	{
+	  as_bad (_("Common alignment not a power of 2"));
+	  ignore_rest_of_line ();
+	  return;
+	}
+    }
+  else
+    align2 = 0;
+
+  *p = 0;
+  symbolP = symbol_find_or_make (name);
+  *p = c;
+
+  if (S_IS_DEFINED (symbolP))
+    {
+      /* xgettext:c-format  */
+      as_bad (_("Ignoring attempt to re-define symbol `%s'."),
+	      S_GET_NAME (symbolP));
+      ignore_rest_of_line ();
+      return;
+    }
+
+  if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
+    {
+      /* xgettext:c-format  */
+      as_bad (_("Length of .scomm \"%s\" is already %ld. Not changed to %ld."),
+	      S_GET_NAME (symbolP),
+	      (long) S_GET_VALUE (symbolP),
+	      (long) size);
+
+      ignore_rest_of_line ();
+      return;
+    }
+
+  if (symbol_get_obj (symbolP)->local)
+    {
+      segT old_sec = now_seg;
+      int old_subsec = now_subseg;
+      char *pfrag;
+
+      record_alignment (sbss_section, align2);
+      subseg_set (sbss_section, 0);
+
+      if (align2)
+	frag_align (align2, 0, 0);
+
+      if (S_GET_SEGMENT (symbolP) == sbss_section)
+	symbol_get_frag (symbolP)->fr_symbol = 0;
+
+      symbol_set_frag (symbolP, frag_now);
+
+      pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
+			(char *) 0);
+      *pfrag = 0;
+      S_SET_SIZE (symbolP, size);
+      S_SET_SEGMENT (symbolP, sbss_section);
+      S_CLEAR_EXTERNAL (symbolP);
+      subseg_set (old_sec, old_subsec);
+    }
+  else
+    {
+      S_SET_VALUE (symbolP, (valueT) size);
+      S_SET_ALIGN (symbolP, 1 << align2);
+      S_SET_EXTERNAL (symbolP);
+      S_SET_SEGMENT (symbolP, &scom_section);
+    }
+
+  demand_empty_rest_of_line ();
+}
+
 /* Track for each attribute whether it has been set explicitly (and so
    should not have a default value set by the assembler).  */
 static bfd_boolean tic6x_attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
@@ -396,6 +533,7 @@ const pseudo_typeS md_pseudo_table[] =
     { "arch", s_tic6x_arch, 0 },
     { "c6xabi_attribute", s_tic6x_c6xabi_attribute, 0 },
     { "nocmp", s_tic6x_nocmp, 0 },
+    { "scomm",	s_tic6x_scomm, 0 },
     { "word", cons, 4 },
     { 0, 0, 0 }
   };
@@ -411,6 +549,9 @@ void
 md_begin (void)
 {
   tic6x_opcode_id id;
+  flagword applicable;
+  segT seg;
+  subsegT subseg;
 
   bfd_set_arch_mach (stdoutput, TARGET_ARCH, 0);
 
@@ -427,6 +568,32 @@ md_begin (void)
 	  != NULL)
 	as_fatal ("%s", _(errmsg));
     }
+
+  /* Save the current subseg so we can restore it [it's the default one and
+     we don't want the initial section to be .sbss].  */
+  seg = now_seg;
+  subseg = now_subseg;
+
+  /* The sbss section is for local .scomm symbols.  */
+  sbss_section = subseg_new (".bss", 0);
+  seg_info (sbss_section)->bss = 1;
+
+  /* This is copied from perform_an_assembly_pass.  */
+  applicable = bfd_applicable_section_flags (stdoutput);
+  bfd_set_section_flags (stdoutput, sbss_section, applicable & SEC_ALLOC);
+
+  subseg_set (seg, subseg);
+
+  /* We must construct a fake section similar to bfd_com_section
+     but with the name .scommon.  */
+  scom_section                = bfd_com_section;
+  scom_section.name           = ".scommon";
+  scom_section.output_section = & scom_section;
+  scom_section.symbol         = & scom_symbol;
+  scom_section.symbol_ptr_ptr = & scom_section.symbol;
+  scom_symbol                 = * bfd_com_section.symbol;
+  scom_symbol.name            = ".scommon";
+  scom_symbol.section         = & scom_section;
 }
 
 /* Whether the current line being parsed had the "||" parallel bars.  */
@@ -4029,11 +4196,13 @@ arelent *
 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
 {
   arelent *reloc;
+  asymbol *symbol;
   bfd_reloc_code_real_type r_type;
 
   reloc = xmalloc (sizeof (arelent));
   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
-  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
+  symbol = symbol_get_bfdsym (fixp->fx_addsy);
+  *reloc->sym_ptr_ptr = symbol;
   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
   reloc->addend = (tic6x_generate_rela ? fixp->fx_offset : 0);
   r_type = fixp->fx_r_type;
@@ -4049,7 +4218,11 @@ tc_gen_reloc (asection *section ATTRIBUT
 
   /* Correct for adjustments bfd_install_relocation will make.  */
   if (reloc->howto->pcrel_offset && reloc->howto->partial_inplace)
-    reloc->addend += reloc->address;
+    {
+      reloc->addend += reloc->address;
+      if (!bfd_is_com_section (symbol))
+	reloc->addend -= symbol->value;
+    }
 
   return reloc;
 }
Index: gas/doc/c-tic6x.texi
===================================================================
RCS file: /cvs/src/src/gas/doc/c-tic6x.texi,v
retrieving revision 1.9
diff -c -p -d -p -u -r1.9 c-tic6x.texi
--- gas/doc/c-tic6x.texi	3 Feb 2011 23:20:26 -0000	1.9
+++ gas/doc/c-tic6x.texi	11 Mar 2011 11:33:36 -0000
@@ -151,4 +151,10 @@ The @var{tag} is either an attribute num
 Disallow use of C64x+ compact instructions in the current text
 section.
 
+@cindex @code{.scomm} directive, TIC6X
+@item .scomm @var{symbol}, @var{size}, @var{align}
+Like @code{.comm}, creating a common symbol @var{symbol} with size @var{size}
+and alignment @var{align}, but unlike when using @code{.comm}, this symbol
+will be placed into the small BSS section by the linker.
+
 @end table
Index: include/elf/tic6x.h
===================================================================
RCS file: /cvs/src/src/include/elf/tic6x.h,v
retrieving revision 1.3
diff -c -p -d -p -u -r1.3 tic6x.h
--- include/elf/tic6x.h	21 Oct 2010 21:16:53 -0000	1.3
+++ include/elf/tic6x.h	11 Mar 2011 11:33:37 -0000
@@ -1,5 +1,5 @@
 /* TI C6X ELF support for BFD.
-   Copyright 2010
+   Copyright 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -53,6 +53,10 @@ START_RELOC_NUMBERS (elf_tic6x_reloc_typ
   RELOC_NUMBER (R_C6000_DSBT_INDEX, 24)
   RELOC_NUMBER (R_C6000_PREL31, 25)
   RELOC_NUMBER (R_C6000_COPY, 26)
+  RELOC_NUMBER (R_C6000_JUMP_SLOT, 27)
+  RELOC_NUMBER (R_C6000_SBR_GOT32, 28)
+  RELOC_NUMBER (R_C6000_PCR_H16, 29)
+  RELOC_NUMBER (R_C6000_PCR_L16, 30)
   RELOC_NUMBER (R_C6000_ALIGN, 253)
   RELOC_NUMBER (R_C6000_FPHEAD, 254)
   RELOC_NUMBER (R_C6000_NOCMP, 255)
@@ -89,6 +93,13 @@ END_RELOC_NUMBERS (R_TIC6X_max)
 /* Extended program header attributes.  */
 #define SHT_TI_PHATTRS		0x7F000004
 
+/* Processor specific section indices.  These sections do not actually
+   exist.  Symbols with a st_shndx field corresponding to one of these
+   values have a special meaning.  */
+
+/* Small data area common symbol.  */
+#define SHN_TIC6X_SCOMMON	SHN_LORESERVE
+
 /* Processor-specific segment types.  */
 
 /* Extended Segment Attributes.  */
Index: ld/gen-doc.texi
===================================================================
RCS file: /cvs/src/src/ld/gen-doc.texi,v
retrieving revision 1.12
diff -c -p -d -p -u -r1.12 gen-doc.texi
--- ld/gen-doc.texi	12 Jul 2008 08:54:13 -0000	1.12
+++ ld/gen-doc.texi	11 Mar 2011 11:33:37 -0000
@@ -4,6 +4,7 @@
 
 @c 2. Specific target machines
 @set ARM
+@set C6X
 @set H8300
 @set HPPA
 @set I960
Index: ld/ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.273
diff -c -p -d -p -u -r1.273 ld.texinfo
--- ld/ld.texinfo	4 Mar 2011 23:44:01 -0000	1.273
+++ ld/ld.texinfo	11 Mar 2011 11:33:38 -0000
@@ -22,6 +22,7 @@
 @set UsesEnvVars
 @set GENERIC
 @set ARM
+@set C6X
 @set H8300
 @set HPPA
 @set I960
@@ -2612,6 +2613,34 @@ The image is Terminal Server aware.
 
 @c man end
 
+@ifset C6X
+@subsection Options specific to C6X uClinux targets
+
+@c man begin OPTIONS
+
+The C6X uClinux target uses a binary format called DSBT to support shared
+libraries.  Each shared library in the system needs to have a unique index;
+all executables use an index of 0.
+
+@table @gcctabopt
+
+@kindex --dsbt-size
+@item --dsbt-size @var{size}
+This option sets the number of entires in the DSBT of the current executable
+or shared library to @var{size}.  The default is to create a table with 64
+entries.
+
+@kindex --dsbt-index
+@item --dsbt-index @var{index}
+This option sets the DSBT index of the current executable or shared library
+to @var{index}.  The default is 0, which is appropriate for generating
+executables.
+
+@end table
+
+@c man end
+@end ifset
+
 @ifset M68HC11
 @subsection Options specific to Motorola 68HC11 and 68HC12 targets
 
Index: ld/emulparams/elf32_tic6x_le.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32_tic6x_le.sh,v
retrieving revision 1.4
diff -c -p -d -p -u -r1.4 elf32_tic6x_le.sh
--- ld/emulparams/elf32_tic6x_le.sh	21 Oct 2010 21:16:53 -0000	1.4
+++ ld/emulparams/elf32_tic6x_le.sh	11 Mar 2011 11:33:38 -0000
@@ -1,14 +1,29 @@
 SCRIPT_NAME=elf
 TEMPLATE_NAME=elf32
 OUTPUT_FORMAT="elf32-tic6x-le"
+BIG_OUTPUT_FORMAT="elf32-tic6x-be"
+EXTRA_EM_FILE=tic6xdsbt
+GENERATE_SHLIB_SCRIPT=yes
 # This address is an arbitrary value expected to be suitable for
 # semihosting simulator use, but not on hardware where it is expected
 # to be overridden.
-TEXT_START_ADDR=0x8000
+case ${target} in
+    *-elf)
+	TEXT_START_ADDR=0x8000
+	;;
+    *-uclinux)
+	TEXT_START_ADDR=0x0
+	GOT="
+.got ${RELOCATING-0} : {
+  *(.dsbt)
+  *(.got.plt) *(.igot.plt) *(.got) *(.igot)
+}"
+	;;
+esac
 MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=tic6x
 EXECUTABLE_SYMBOLS="EXTERN (__c6xabi_DSBT_BASE);"
-SDATA_START_SYMBOLS="PROVIDE_HIDDEN (__c6xabi_DSBT_BASE = .);"
+OTHER_GOT_SYMBOLS="PROVIDE_HIDDEN (__c6xabi_DSBT_BASE = .);"
 # ".bss" is near (small) BSS, ".far" is far (normal) BSS, ".const" is
 # far read-only data, ".rodata" is near read-only data.  ".neardata"
 # is near (small) data, ".fardata" is (along with .data) far data.
@@ -24,7 +39,9 @@ OTHER_READWRITE_SECTIONS=".fardata ${REL
 OTHER_READWRITE_RELOC_SECTIONS="
   .rel.fardata     ${RELOCATING-0} : { *(.rel.fardata${RELOCATING+ .rel.fardata.*}) }
   .rela.fardata    ${RELOCATING-0} : { *(.rela.fardata${RELOCATING+ .rela.fardata.*}) }"
-OTHER_BSS_SECTIONS="
+case ${target} in
+    *-elf)
+	OTHER_BSS_SECTIONS="
   .heap : 
   { 
     . = ALIGN(4); 
@@ -37,4 +54,6 @@ OTHER_BSS_SECTIONS="
     . +=  0x100000;
     _STACK_START = .;
   }"
+	;;
+esac
 ATTRS_SECTIONS='.c6xabi.attributes 0 : { KEEP (*(.c6xabi.attributes)) KEEP (*(.gnu.attributes)) }'
Index: ld/emultempl/tic6xdsbt.em
===================================================================
RCS file: ld/emultempl/tic6xdsbt.em
diff -N ld/emultempl/tic6xdsbt.em
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/emultempl/tic6xdsbt.em	11 Mar 2011 11:33:38 -0000
@@ -0,0 +1,105 @@
+# This shell script emits a C file. -*- C -*-
+#   Copyright 2011 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+
+# This file is sourced from elf32.em, and defines extra C6X DSBT specific
+# features.
+#
+fragment <<EOF
+#include "ldctor.h"
+#include "elf32-tic6x.h"
+
+static struct elf32_tic6x_params params =
+{
+  0, 64
+};
+
+static int
+is_tic6x_target (void)
+{
+  extern const bfd_target bfd_elf32_tic6x_le_vec;
+  extern const bfd_target bfd_elf32_tic6x_be_vec;
+
+  return (link_info.output_bfd->xvec == &bfd_elf32_tic6x_le_vec
+  	  || link_info.output_bfd->xvec == &bfd_elf32_tic6x_be_vec);
+}
+
+/* Pass params to backend.  */
+
+static void
+tic6x_after_open (void)
+{
+  if (is_tic6x_target ())
+    {
+      if (params.dsbt_index >= params.dsbt_size)
+	{
+	  einfo (_("%P%F: invalid --dsbt-index %d, outside DSBT size.\n"),
+		 params.dsbt_index);
+	}
+      elf32_tic6x_setup (&link_info, &params);
+    }
+
+  gld${EMULATION_NAME}_after_open ();
+}
+EOF
+
+# This code gets inserted into the generic elf32.sc linker script
+# and allows us to define our own command line switches.
+PARSE_AND_LIST_PROLOGUE='
+#define OPTION_DSBT_INDEX		300
+#define OPTION_DSBT_SIZE		301
+'
+
+PARSE_AND_LIST_LONGOPTS='
+  {"dsbt-index", required_argument, NULL, OPTION_DSBT_INDEX},
+  {"dsbt-size", required_argument, NULL, OPTION_DSBT_SIZE},
+'
+
+PARSE_AND_LIST_OPTIONS='
+  fprintf (file, _("  --dsbt-index <index>\n"));
+  fprintf (file, _("\t\t\tUse this as the DSBT index for the output object\n"));
+  fprintf (file, _("  --dsbt-size <index>\n"));
+  fprintf (file, _("\t\t\tUse this as the number of entries in the DSBT table\n"));
+'
+
+PARSE_AND_LIST_ARGS_CASES='
+    case OPTION_DSBT_INDEX:
+      {
+	char *end;
+	params.dsbt_index = strtol (optarg, &end, 0);
+	if (*end == 0
+	    && params.dsbt_index >= 0 && params.dsbt_index < 0x7fff)
+	  break;
+	einfo (_("%P%F: invalid --dsbt-index %s\n"), optarg);
+      }
+      break;
+    case OPTION_DSBT_SIZE:
+      {
+	char *end;
+	params.dsbt_size = strtol (optarg, &end, 0);
+	if (*end == 0
+	    && params.dsbt_size >= 0 && params.dsbt_size < 0x7fff)
+	  break;
+	einfo (_("%P%F: invalid --dsbt-size %s\n"), optarg);
+      }
+      break;
+'
+
+LDEMUL_AFTER_OPEN=tic6x_after_open
Index: ld/testsuite/ld-elf/sec-to-seg.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-elf/sec-to-seg.exp,v
retrieving revision 1.3
diff -c -p -d -p -u -r1.3 sec-to-seg.exp
--- ld/testsuite/ld-elf/sec-to-seg.exp	28 Oct 2010 06:27:55 -0000	1.3
+++ ld/testsuite/ld-elf/sec-to-seg.exp	11 Mar 2011 11:33:38 -0000
@@ -87,7 +87,6 @@ if {    [istarget avr-*-*]
      || [istarget moxie-*-*]
      || [istarget msp430-*-*]
      || [istarget mt-*-*]
-     || [istarget tic6x-*-*]
     } {
     set B_test_same_seg 0
 } else {
Index: ld/testsuite/ld-tic6x/dsbt-be.ld
===================================================================
RCS file: ld/testsuite/ld-tic6x/dsbt-be.ld
diff -N ld/testsuite/ld-tic6x/dsbt-be.ld
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/dsbt-be.ld	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,67 @@
+OUTPUT_FORMAT("elf32-tic6x-be", "elf32-tic6x-be",
+	      "elf32-tic6x-be")
+EXTERN (__c6xabi_DSBT_BASE);
+SECTIONS
+{
+  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x0)); . = SEGMENT_START("text-segment", 0x0) + SIZEOF_HEADERS;
+  . = 0x8000;
+  .hash           : { *(.hash) }
+  .gnu.hash       : { *(.gnu.hash) }
+  .dynsym         : { *(.dynsym) }
+  .dynstr         : { *(.dynstr) }
+  .gnu.version    : { *(.gnu.version) }
+  .gnu.version_d  : { *(.gnu.version_d) }
+  .gnu.version_r  : { *(.gnu.version_r) }
+  .rel.init       : { *(.rel.init) }
+  .rela.init      : { *(.rela.init) }
+  .rel.text       : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
+  .rela.text      : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
+  .rel.fini       : { *(.rel.fini) }
+  .rela.fini      : { *(.rela.fini) }
+  .rel.const     : { *(.rel.const .rel.const.* .rel.gnu.linkonce.r.*) }
+  .rela.const    : { *(.rela.const .rela.const.* .rela.gnu.linkonce.r.*) }
+  .rel.rodata     : { *(.rel.rodata .rel.rodata.*) }
+  .rela.rodata    : { *(.rela.rodata .rela.rodata.*) }
+  .rel.data.rel.ro   : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
+  .rela.data.rel.ro   : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
+  .rel.data       : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
+  .rela.data      : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
+  .rel.fardata       : { *(.rel.fardata .rel.fardata.*) }
+  .rela.fardata      : { *(.rela.fardata .rela.fardata.*) }
+  .rel.tdata	  : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
+  .rela.tdata	  : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
+  .rel.tbss	  : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
+  .rela.tbss	  : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
+  .rel.ctors      : { *(.rel.ctors) }
+  .rela.ctors     : { *(.rela.ctors) }
+  .rel.dtors      : { *(.rel.dtors) }
+  .rela.dtors     : { *(.rela.dtors) }
+  .rel.got        : { *(.rel.got) }
+  .rela.got       : { *(.rela.got) }
+  .rel.neardata      : { *(.rel.neardata .rel.neardata.* .rel.gnu.linkonce.s.*) }
+  .rela.neardata     : { *(.rela.neardata .rela.neardata.* .rela.gnu.linkonce.s.*) }
+  .rel.bss       : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.sb.*) }
+  .rela.bss      : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.sb.*) }
+  .rel.neardata2     : { *(.rel.neardata2 .rel.neardata2.* .rel.gnu.linkonce.s2.*) }
+  .rela.neardata2    : { *(.rela.neardata2 .rela.neardata2.* .rela.gnu.linkonce.s2.*) }
+  .rel.bss2      : { *(.rel.bss2 .rel.bss2.* .rel.gnu.linkonce.sb2.*) }
+  .rela.bss2     : { *(.rela.bss2 .rela.bss2.* .rela.gnu.linkonce.sb2.*) }
+  .rel.far        : { *(.rel.far .rel.far.* .rel.gnu.linkonce.b.*) }
+  .rela.far       : { *(.rela.far .rela.far.* .rela.gnu.linkonce.b.*) }
+  .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
+  .dynamic        : { *(.dynamic) }
+  .data : { *(.data*) }
+  . = 0x10000000;
+  .rel.plt        : { *(.rel.plt) }
+  .rela.plt       : { *(.rela.plt) }
+  .plt            : { *(.plt) }
+  .text : { *(.text*) }
+  PROVIDE_HIDDEN (__c6xabi_DSBT_BASE = .);
+  .got   : { *(.dsbt) *(.got.plt) *(.igot.plt) *(.got) *(.igot) }
+  .neardata : { *(.neardata .neardata.* .gnu.linkonce.s.*) }
+  .rodata   : { *(.rodata .rodata.*) }
+  .bss : { *(.dynbss) *(.bss .bss.* .gnu.linkonce.sb.*) *(.scommon) }
+  .far : { *(.dynfar) *(.far .far.* .gnu.linkonce.b.*) *(COMMON) }
+  .c6xabi.attributes 0 : { KEEP (*(.c6xabi.attributes)) KEEP (*(.gnu.attributes)) }
+  /DISCARD/ : { *(*) }
+}
Index: ld/testsuite/ld-tic6x/dsbt-index-error.d
===================================================================
RCS file: ld/testsuite/ld-tic6x/dsbt-index-error.d
diff -N ld/testsuite/ld-tic6x/dsbt-index-error.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/dsbt-index-error.d	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,5 @@
+#name: C6X invalid DSBT_INDEX
+#as: -mlittle-endian
+#ld: -melf32_tic6x_le -Tsbr.ld --dsbt-index 5 --dsbt-size 3
+#source: dsbt-index.s
+#error: .*invalid --dsbt-index 5, outside DSBT size.*
Index: ld/testsuite/ld-tic6x/dsbt-index.d
===================================================================
RCS file: ld/testsuite/ld-tic6x/dsbt-index.d
diff -N ld/testsuite/ld-tic6x/dsbt-index.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/dsbt-index.d	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,14 @@
+#name: C6X DSBT_INDEX reloc
+#as: -mlittle-endian
+#ld: -melf32_tic6x_le -Tsbr.ld --dsbt-index 5
+#source: dsbt-index.s
+#objdump: -dr
+
+.*: *file format elf32-tic6x-le
+
+
+Disassembly of section \.text:
+
+10000000 <[^>]*>:
+10000000:[ \t]+0700056e[ \t]+ldw \.D2T2 \*\+b14\(20\),b14
+[ \t]*\.\.\.
Index: ld/testsuite/ld-tic6x/dsbt-index.s
===================================================================
RCS file: ld/testsuite/ld-tic6x/dsbt-index.s
diff -N ld/testsuite/ld-tic6x/dsbt-index.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/dsbt-index.s	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,3 @@
+.text
+.nocmp
+	ldw     .d2t2   *+B14($DSBT_index(__c6xabi_DSBT_BASE)), B14
Index: ld/testsuite/ld-tic6x/dsbt-inrange.ld
===================================================================
RCS file: ld/testsuite/ld-tic6x/dsbt-inrange.ld
diff -N ld/testsuite/ld-tic6x/dsbt-inrange.ld
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/dsbt-inrange.ld	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,68 @@
+EXTERN (__c6xabi_DSBT_BASE);
+SECTIONS
+{
+  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x0)); . = SEGMENT_START("text-segment", 0x0) + SIZEOF_HEADERS;
+  . = 0x8000;
+  .hash           : { *(.hash) }
+  .gnu.hash       : { *(.gnu.hash) }
+  .dynsym         : { *(.dynsym) }
+  .dynstr         : { *(.dynstr) }
+  .gnu.version    : { *(.gnu.version) }
+  .gnu.version_d  : { *(.gnu.version_d) }
+  .gnu.version_r  : { *(.gnu.version_r) }
+  .rel.init       : { *(.rel.init) }
+  .rela.init      : { *(.rela.init) }
+  .rel.text       : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
+  .rela.text      : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
+  .rel.fini       : { *(.rel.fini) }
+  .rela.fini      : { *(.rela.fini) }
+  .rel.const     : { *(.rel.const .rel.const.* .rel.gnu.linkonce.r.*) }
+  .rela.const    : { *(.rela.const .rela.const.* .rela.gnu.linkonce.r.*) }
+  .rel.rodata     : { *(.rel.rodata .rel.rodata.*) }
+  .rela.rodata    : { *(.rela.rodata .rela.rodata.*) }
+  .rel.data.rel.ro   : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
+  .rela.data.rel.ro   : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
+  .rel.data       : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
+  .rela.data      : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
+  .rel.fardata       : { *(.rel.fardata .rel.fardata.*) }
+  .rela.fardata      : { *(.rela.fardata .rela.fardata.*) }
+  .rel.tdata	  : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
+  .rela.tdata	  : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
+  .rel.tbss	  : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
+  .rela.tbss	  : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
+  .rel.ctors      : { *(.rel.ctors) }
+  .rela.ctors     : { *(.rela.ctors) }
+  .rel.dtors      : { *(.rel.dtors) }
+  .rela.dtors     : { *(.rela.dtors) }
+  .rel.got        : { *(.rel.got) }
+  .rela.got       : { *(.rela.got) }
+  .rel.neardata      : { *(.rel.neardata .rel.neardata.* .rel.gnu.linkonce.s.*) }
+  .rela.neardata     : { *(.rela.neardata .rela.neardata.* .rela.gnu.linkonce.s.*) }
+  .rel.bss       : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.sb.*) }
+  .rela.bss      : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.sb.*) }
+  .rel.neardata2     : { *(.rel.neardata2 .rel.neardata2.* .rel.gnu.linkonce.s2.*) }
+  .rela.neardata2    : { *(.rela.neardata2 .rela.neardata2.* .rela.gnu.linkonce.s2.*) }
+  .rel.bss2      : { *(.rel.bss2 .rel.bss2.* .rel.gnu.linkonce.sb2.*) }
+  .rela.bss2     : { *(.rela.bss2 .rela.bss2.* .rela.gnu.linkonce.sb2.*) }
+  .rel.far        : { *(.rel.far .rel.far.* .rel.gnu.linkonce.b.*) }
+  .rela.far       : { *(.rela.far .rela.far.* .rela.gnu.linkonce.b.*) }
+  .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
+  .dynamic        : { *(.dynamic) }
+  .data : { *(.data*) }
+  . = 0x10000000;
+  .rel.plt        : { *(.rel.plt) }
+  .rela.plt       : { *(.rela.plt) }
+  .plt            : { *(.plt) }
+  .text : { *(.text*) }
+  . = 0x20000000;
+  PROVIDE_HIDDEN (__c6xabi_DSBT_BASE = .);
+  .dsbt   : { *(.dsbt) }
+  . = 0x2001fff4;
+  .got   : { *(.got.plt) *(.igot.plt) *(.got) *(.igot) }
+  .neardata : { *(.neardata .neardata.* .gnu.linkonce.s.*) }
+  .rodata   : { *(.rodata .rodata.*) }
+  .bss : { *(.dynbss) *(.bss .bss.* .gnu.linkonce.sb.*) *(.scommon) }
+  .far : { *(.dynfar) *(.far .far.* .gnu.linkonce.b.*) *(COMMON) }
+  .c6xabi.attributes 0 : { KEEP (*(.c6xabi.attributes)) KEEP (*(.gnu.attributes)) }
+  /DISCARD/ : { *(*) }
+}
Index: ld/testsuite/ld-tic6x/dsbt-overflow.ld
===================================================================
RCS file: ld/testsuite/ld-tic6x/dsbt-overflow.ld
diff -N ld/testsuite/ld-tic6x/dsbt-overflow.ld
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/dsbt-overflow.ld	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,68 @@
+EXTERN (__c6xabi_DSBT_BASE);
+SECTIONS
+{
+  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x0)); . = SEGMENT_START("text-segment", 0x0) + SIZEOF_HEADERS;
+  . = 0x8000;
+  .hash           : { *(.hash) }
+  .gnu.hash       : { *(.gnu.hash) }
+  .dynsym         : { *(.dynsym) }
+  .dynstr         : { *(.dynstr) }
+  .gnu.version    : { *(.gnu.version) }
+  .gnu.version_d  : { *(.gnu.version_d) }
+  .gnu.version_r  : { *(.gnu.version_r) }
+  .rel.init       : { *(.rel.init) }
+  .rela.init      : { *(.rela.init) }
+  .rel.text       : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
+  .rela.text      : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
+  .rel.fini       : { *(.rel.fini) }
+  .rela.fini      : { *(.rela.fini) }
+  .rel.const     : { *(.rel.const .rel.const.* .rel.gnu.linkonce.r.*) }
+  .rela.const    : { *(.rela.const .rela.const.* .rela.gnu.linkonce.r.*) }
+  .rel.rodata     : { *(.rel.rodata .rel.rodata.*) }
+  .rela.rodata    : { *(.rela.rodata .rela.rodata.*) }
+  .rel.data.rel.ro   : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
+  .rela.data.rel.ro   : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
+  .rel.data       : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
+  .rela.data      : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
+  .rel.fardata       : { *(.rel.fardata .rel.fardata.*) }
+  .rela.fardata      : { *(.rela.fardata .rela.fardata.*) }
+  .rel.tdata	  : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
+  .rela.tdata	  : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
+  .rel.tbss	  : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
+  .rela.tbss	  : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
+  .rel.ctors      : { *(.rel.ctors) }
+  .rela.ctors     : { *(.rela.ctors) }
+  .rel.dtors      : { *(.rel.dtors) }
+  .rela.dtors     : { *(.rela.dtors) }
+  .rel.got        : { *(.rel.got) }
+  .rela.got       : { *(.rela.got) }
+  .rel.neardata      : { *(.rel.neardata .rel.neardata.* .rel.gnu.linkonce.s.*) }
+  .rela.neardata     : { *(.rela.neardata .rela.neardata.* .rela.gnu.linkonce.s.*) }
+  .rel.bss       : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.sb.*) }
+  .rela.bss      : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.sb.*) }
+  .rel.neardata2     : { *(.rel.neardata2 .rel.neardata2.* .rel.gnu.linkonce.s2.*) }
+  .rela.neardata2    : { *(.rela.neardata2 .rela.neardata2.* .rela.gnu.linkonce.s2.*) }
+  .rel.bss2      : { *(.rel.bss2 .rel.bss2.* .rel.gnu.linkonce.sb2.*) }
+  .rela.bss2     : { *(.rela.bss2 .rela.bss2.* .rela.gnu.linkonce.sb2.*) }
+  .rel.far        : { *(.rel.far .rel.far.* .rel.gnu.linkonce.b.*) }
+  .rela.far       : { *(.rela.far .rela.far.* .rela.gnu.linkonce.b.*) }
+  .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
+  .dynamic        : { *(.dynamic) }
+  .data : { *(.data*) }
+  . = 0x10000000;
+  .rel.plt        : { *(.rel.plt) }
+  .rela.plt       : { *(.rela.plt) }
+  .plt            : { *(.plt) }
+  .text : { *(.text*) }
+  . = 0x20000000;
+  PROVIDE_HIDDEN (__c6xabi_DSBT_BASE = .);
+  .dsbt   : { *(.dsbt) }
+  . = 0x2001fff8;
+  .got   : { *(.got.plt) *(.igot.plt) *(.got) *(.igot) }
+  .neardata : { *(.neardata .neardata.* .gnu.linkonce.s.*) }
+  .rodata   : { *(.rodata .rodata.*) }
+  .bss : { *(.dynbss) *(.bss .bss.* .gnu.linkonce.sb.*) *(.scommon) }
+  .far : { *(.dynfar) *(.far .far.* .gnu.linkonce.b.*) *(COMMON) }
+  .c6xabi.attributes 0 : { KEEP (*(.c6xabi.attributes)) KEEP (*(.gnu.attributes)) }
+  /DISCARD/ : { *(*) }
+}
Index: ld/testsuite/ld-tic6x/dsbt.ld
===================================================================
RCS file: ld/testsuite/ld-tic6x/dsbt.ld
diff -N ld/testsuite/ld-tic6x/dsbt.ld
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/dsbt.ld	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,65 @@
+EXTERN (__c6xabi_DSBT_BASE);
+SECTIONS
+{
+  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x0)); . = SEGMENT_START("text-segment", 0x0) + SIZEOF_HEADERS;
+  . = 0x8000;
+  .hash           : { *(.hash) }
+  .gnu.hash       : { *(.gnu.hash) }
+  .dynsym         : { *(.dynsym) }
+  .dynstr         : { *(.dynstr) }
+  .gnu.version    : { *(.gnu.version) }
+  .gnu.version_d  : { *(.gnu.version_d) }
+  .gnu.version_r  : { *(.gnu.version_r) }
+  .rel.init       : { *(.rel.init) }
+  .rela.init      : { *(.rela.init) }
+  .rel.text       : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
+  .rela.text      : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
+  .rel.fini       : { *(.rel.fini) }
+  .rela.fini      : { *(.rela.fini) }
+  .rel.const     : { *(.rel.const .rel.const.* .rel.gnu.linkonce.r.*) }
+  .rela.const    : { *(.rela.const .rela.const.* .rela.gnu.linkonce.r.*) }
+  .rel.rodata     : { *(.rel.rodata .rel.rodata.*) }
+  .rela.rodata    : { *(.rela.rodata .rela.rodata.*) }
+  .rel.data.rel.ro   : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
+  .rela.data.rel.ro   : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
+  .rel.data       : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
+  .rela.data      : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
+  .rel.fardata       : { *(.rel.fardata .rel.fardata.*) }
+  .rela.fardata      : { *(.rela.fardata .rela.fardata.*) }
+  .rel.tdata	  : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
+  .rela.tdata	  : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
+  .rel.tbss	  : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
+  .rela.tbss	  : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
+  .rel.ctors      : { *(.rel.ctors) }
+  .rela.ctors     : { *(.rela.ctors) }
+  .rel.dtors      : { *(.rel.dtors) }
+  .rela.dtors     : { *(.rela.dtors) }
+  .rel.got        : { *(.rel.got) }
+  .rela.got       : { *(.rela.got) }
+  .rel.neardata      : { *(.rel.neardata .rel.neardata.* .rel.gnu.linkonce.s.*) }
+  .rela.neardata     : { *(.rela.neardata .rela.neardata.* .rela.gnu.linkonce.s.*) }
+  .rel.bss       : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.sb.*) }
+  .rela.bss      : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.sb.*) }
+  .rel.neardata2     : { *(.rel.neardata2 .rel.neardata2.* .rel.gnu.linkonce.s2.*) }
+  .rela.neardata2    : { *(.rela.neardata2 .rela.neardata2.* .rela.gnu.linkonce.s2.*) }
+  .rel.bss2      : { *(.rel.bss2 .rel.bss2.* .rel.gnu.linkonce.sb2.*) }
+  .rela.bss2     : { *(.rela.bss2 .rela.bss2.* .rela.gnu.linkonce.sb2.*) }
+  .rel.far        : { *(.rel.far .rel.far.* .rel.gnu.linkonce.b.*) }
+  .rela.far       : { *(.rela.far .rela.far.* .rela.gnu.linkonce.b.*) }
+  .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
+  .dynamic        : { *(.dynamic) }
+  .data : { *(.data*) }
+  . = 0x10000000;
+  .rel.plt        : { *(.rel.plt) }
+  .rela.plt       : { *(.rela.plt) }
+  .plt            : { *(.plt) }
+  .text : { *(.text*) }
+  PROVIDE_HIDDEN (__c6xabi_DSBT_BASE = .);
+  .got   : { *(.dsbt) *(.got.plt) *(.igot.plt) *(.got) *(.igot) }
+  .neardata : { *(.neardata .neardata.* .gnu.linkonce.s.*) }
+  .rodata   : { *(.rodata .rodata.*) }
+  .bss : { *(.dynbss) *(.bss .bss.* .gnu.linkonce.sb.*) *(.scommon) }
+  .far : { *(.dynfar) *(.far .far.* .gnu.linkonce.b.*) *(COMMON) }
+  .c6xabi.attributes 0 : { KEEP (*(.c6xabi.attributes)) KEEP (*(.gnu.attributes)) }
+  /DISCARD/ : { *(*) }
+}
Index: ld/testsuite/ld-tic6x/got-reloc-global-addend-1.d
===================================================================
RCS file: ld/testsuite/ld-tic6x/got-reloc-global-addend-1.d
diff -N ld/testsuite/ld-tic6x/got-reloc-global-addend-1.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/got-reloc-global-addend-1.d	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,5 @@
+#name: C6X GOT relocations, addend
+#as: -mlittle-endian -mdsbt
+#ld: -melf32_tic6x_le -Tdsbt.ld --dsbt-index 4 -shared
+#source: got-reloc-global-addend-1.s
+#error: .*relocation R_C6000_SBR_GOT_U15_W with non-zero addend 4.*
Index: ld/testsuite/ld-tic6x/got-reloc-global-addend-1.s
===================================================================
RCS file: ld/testsuite/ld-tic6x/got-reloc-global-addend-1.s
diff -N ld/testsuite/ld-tic6x/got-reloc-global-addend-1.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/got-reloc-global-addend-1.s	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,11 @@
+.text
+.nocmp
+	ldw .d2t2 *+B14($DSBT_index(__c6xabi_DSBT_BASE)), B14
+	ldw .d2t1 *+B14($GOT(a)+4), A1
+
+	.global a
+	.section	.neardata,"aw",@progbits
+	.align	2
+	.type	a, @object
+	.size	a, 4
+a:
Index: ld/testsuite/ld-tic6x/got-reloc-global-addend-2.d
===================================================================
RCS file: ld/testsuite/ld-tic6x/got-reloc-global-addend-2.d
diff -N ld/testsuite/ld-tic6x/got-reloc-global-addend-2.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/got-reloc-global-addend-2.d	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,5 @@
+#name: C6X GOT relocations, addend
+#as: -mlittle-endian -mdsbt
+#ld: -melf32_tic6x_le -Tdsbt.ld --dsbt-index 4 -shared
+#source: got-reloc-global-addend-2.s
+#error: .*relocation R_C6000_SBR_GOT_L16_W with non-zero addend 4.*
Index: ld/testsuite/ld-tic6x/got-reloc-global-addend-2.s
===================================================================
RCS file: ld/testsuite/ld-tic6x/got-reloc-global-addend-2.s
diff -N ld/testsuite/ld-tic6x/got-reloc-global-addend-2.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/got-reloc-global-addend-2.s	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,11 @@
+.text
+.nocmp
+	ldw .d2t2 *+B14($DSBT_index(__c6xabi_DSBT_BASE)), B14
+	mvkl .s1 $DPR_GOT(a)+4, A1
+
+	.global a
+	.section	.neardata,"aw",@progbits
+	.align	2
+	.type	a, @object
+	.size	a, 4
+a:
Index: ld/testsuite/ld-tic6x/got-reloc-global.s
===================================================================
RCS file: ld/testsuite/ld-tic6x/got-reloc-global.s
diff -N ld/testsuite/ld-tic6x/got-reloc-global.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/got-reloc-global.s	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,11 @@
+.text
+.nocmp
+	ldw .d2t2 *+B14($DSBT_index(__c6xabi_DSBT_BASE)), B14
+	ldw .d2t1 *+B14($GOT(a)), A1
+
+	.global a
+	.section	.neardata,"aw",@progbits
+	.align	2
+	.type	a, @object
+	.size	a, 4
+a:
Index: ld/testsuite/ld-tic6x/got-reloc-inrange.d
===================================================================
RCS file: ld/testsuite/ld-tic6x/got-reloc-inrange.d
diff -N ld/testsuite/ld-tic6x/got-reloc-inrange.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/got-reloc-inrange.d	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,15 @@
+#name: C6X GOT relocations, no overflow
+#as: -mlittle-endian -mdsbt
+#ld: -melf32_tic6x_le -Tdsbt-inrange.ld --dsbt-index 4 -shared
+#source: got-reloc-global.s
+#objdump: -dr
+
+.*: *file format elf32-tic6x-le
+
+
+Disassembly of section \.text:
+
+10000000 <[^>]*>:
+10000000:[ \t]+0700046e[ \t]+ldw \.D2T2 \*\+b14\(16\),b14
+10000004:[ \t]+00ffff6c[ \t]+ldw \.D2T1 \*\+b14\(131068\),a1
+[ \t]+...
Index: ld/testsuite/ld-tic6x/got-reloc-local-1.s
===================================================================
RCS file: ld/testsuite/ld-tic6x/got-reloc-local-1.s
diff -N ld/testsuite/ld-tic6x/got-reloc-local-1.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/got-reloc-local-1.s	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,8 @@
+.text
+.nocmp
+	ldw .d2t2 *+B14($DSBT_index(__c6xabi_DSBT_BASE)), B14
+	ldw .d2t1 *+B14($GOT(a)), A1
+
+.data
+a:
+	.word 0
Index: ld/testsuite/ld-tic6x/got-reloc-local-2.s
===================================================================
RCS file: ld/testsuite/ld-tic6x/got-reloc-local-2.s
diff -N ld/testsuite/ld-tic6x/got-reloc-local-2.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/got-reloc-local-2.s	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,8 @@
+.text
+.nocmp
+	ldw .d2t2 *+B14($DSBT_index(__c6xabi_DSBT_BASE)), B14
+	ldw .d2t1 *+B14($GOT(b)), A1
+
+.data
+b:
+	.word 0
Index: ld/testsuite/ld-tic6x/got-reloc-local-r.d
===================================================================
RCS file: ld/testsuite/ld-tic6x/got-reloc-local-r.d
diff -N ld/testsuite/ld-tic6x/got-reloc-local-r.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/got-reloc-local-r.d	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,23 @@
+#name: C6X GOT relocations, local symbols, -r
+#as: -mlittle-endian
+#ld: -r -melf32_tic6x_le
+#source: got-reloc-local-1.s
+#source: got-reloc-local-2.s
+#objdump: -dr
+
+.*: *file format elf32-tic6x-le
+
+
+Disassembly of section \.text:
+
+00000000 <\.text>:
+[ 	]*0:[ 	]*0700006e[ 	 ]*ldw \.D2T2 \*\+b14\(0\),b14
+[ 	]*0:[ 	]*R_C6000_DSBT_INDEX	__c6xabi_DSBT_BASE
+[ 	]*4:[ 	]*0080006c[ 	]*ldw \.D2T1 \*\+b14\(0\),a1
+[ 	]*4:[ 	]*R_C6000_SBR_GOT_U15_W	a
+	\.\.\.
+[ 	]*20:[ 	]*0700006e[ 	]*ldw \.D2T2 \*\+b14\(0\),b14
+[ 	]*20: R_C6000_DSBT_INDEX	__c6xabi_DSBT_BASE
+[ 	]*24:[ 	]*0080006c[ 	]*ldw \.D2T1 \*\+b14\(0\),a1
+[ 	]*24:[ 	]*R_C6000_SBR_GOT_U15_W	b
+	\.\.\.
Index: ld/testsuite/ld-tic6x/got-reloc-overflow.d
===================================================================
RCS file: ld/testsuite/ld-tic6x/got-reloc-overflow.d
diff -N ld/testsuite/ld-tic6x/got-reloc-overflow.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/got-reloc-overflow.d	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,5 @@
+#name: C6X GOT relocations, overflow
+#as: -mlittle-endian -mdsbt
+#ld: -melf32_tic6x_le -Tdsbt-overflow.ld --dsbt-index 4 -shared
+#source: got-reloc-global.s
+#error: .*relocation truncated to fit: R_C6000_SBR_GOT_U15_W.*
Index: ld/testsuite/ld-tic6x/shlib-1.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1.dd
diff -N ld/testsuite/ld-tic6x/shlib-1.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,67 @@
+
+tmpdir/libtest\.so:     file format elf32-tic6x-le
+
+
+Disassembly of section \.plt:
+
+10000020 <sub0@plt-0x18>:
+10000020:[ \t]*0100036e[ \t]*ldw \.D2T2 \*\+b14\(12\),b2
+10000024:[ \t]*0080046e[ \t]*ldw \.D2T2 \*\+b14\(16\),b1
+10000028:[ \t]*00004000[ \t]*nop 3
+1000002c:[ \t]*00080362[ \t]*b \.S2 b2
+10000030:[ \t]*00008000[ \t]*nop 5
+10000034:[ \t]*00000000[ \t]*nop 1
+
+10000038 <sub0@plt>:
+10000038:[ \t]*0100056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b2
+1000003c:[ \t]*0000002a[ \t]*mvk \.S2 0,b0
+10000040:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+10000044:[ \t]*00002000[ \t]*nop 2
+10000048:[ \t]*00080362[ \t]*b \.S2 b2
+1000004c:[ \t]*00008000[ \t]*nop 5
+
+10000050 <sub@plt>:
+10000050:[ \t]*0100066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b2
+10000054:[ \t]*0000062a[ \t]*mvk \.S2 12,b0
+10000058:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+1000005c:[ \t]*00002000[ \t]*nop 2
+10000060:[ \t]*00080362[ \t]*b \.S2 b2
+10000064:[ \t]*00008000[ \t]*nop 5
+	\.\.\.
+
+Disassembly of section \.text:
+
+10000080 <sub1>:
+10000080:[ \t]*000c0362[ \t]*b \.S2 b3
+10000084:[ \t]*00008000[ \t]*nop 5
+
+10000088 <sub0>:
+10000088:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+1000008c:[ \t]*01bc62f6[ \t]*stw \.D2T2 b3,\*\+b15\(12\)
+10000090:[ \t]*073c82f6[ \t]*stw \.D2T2 b14,\*\+b15\(16\)
+10000094:[ \t]*0700026e[ \t]*ldw \.D2T2 \*\+b14\(8\),b14
+10000098:[ \t]*0ffffa12[ \t]*b \.S2 10000050 <sub@plt>
+1000009c:[ \t]*0ffff712[ \t]*b \.S2 10000038 <sub0@plt>
+100000a0:[ \t]*0ffffc12[ \t]*b \.S2 10000080 <sub1>
+100000a4:[ \t]*01bc62e6[ \t]*ldw \.D2T2 \*\+b15\(12\),b3
+100000a8:[ \t]*073c82e6[ \t]*ldw \.D2T2 \*\+b15\(16\),b14
+100000ac:[ \t]*07800852[ \t]*addk \.S2 16,b15
+100000b0:[ \t]*00004000[ \t]*nop 3
+100000b4:[ \t]*000c0362[ \t]*b \.S2 b3
+100000b8:[ \t]*00008000[ \t]*nop 5
+100000bc:[ \t]*00000000[ \t]*nop 1
+
+100000c0 <sub>:
+100000c0:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+100000c4:[ \t]*023c62f4[ \t]*stw \.D2T1 a4,\*\+b15\(12\)
+100000c8:[ \t]*003c62e4[ \t]*ldw \.D2T1 \*\+b15\(12\),a0
+100000cc:[ \t]*00006000[ \t]*nop 4
+100000d0:[ \t]*00014940[ \t]*add \.D1 a0,10,a0
+100000d4:[ \t]*020008f0[ \t]*or \.D1 0,a0,a4
+100000d8:[ \t]*07be0942[ \t]*add \.D2 b15,16,b15
+100000dc:[ \t]*000c0362[ \t]*b \.S2 b3
+100000e0:[ \t]*0300096e[ \t]*ldw \.D2T2 \*\+b14\(36\),b6
+100000e4:[ \t]*0380076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b7
+100000e8:[ \t]*0400086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b8
+100000ec:[ \t]*04800c6e[ \t]*ldw \.D2T2 \*\+b14\(48\),b9
+	\.\.\.
Index: ld/testsuite/ld-tic6x/shlib-1.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1.rd
diff -N ld/testsuite/ld-tic6x/shlib-1.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,123 @@
+There are 17 section headers, starting at offset 0x21c4:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 000048 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          00008048 001048 0000d0 10   A  3   6  4
+  \[ 3\] \.dynstr           STRTAB          00008118 001118 000025 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            00008140 001140 000024 0c   A  2  10  4
+  \[ 5\] \.rela\.neardata    RELA            00008164 001164 000018 0c   A  2  11  4
+  \[ 6\] \.dynamic          DYNAMIC         0000817c 00117c 0000a8 08  WA  3   0  4
+  \[ 7\] \.rela\.plt         RELA            10000000 002000 000018 0c   A  2   8  4
+  \[ 8\] \.plt              PROGBITS        10000020 002020 000060 18  AX  0   0 32
+  \[ 9\] \.text             PROGBITS        10000080 002080 000080 00  AX  0   0 32
+  \[10\] \.got              PROGBITS        10000100 002100 000028 00  WA  0   0  4
+  \[11\] \.neardata         PROGBITS        10000128 002128 000008 00  WA  0   0  4
+  \[12\] \.bss              NOBITS          10000130 002130 000004 00  WA  0   0  4
+  \[13\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 002130 000019 00      0   0  1
+  \[14\] \.shstrtab         STRTAB          00000000 002149 00007b 00      0   0  1
+  \[15\] \.symtab           SYMTAB          00000000 00246c 0001a0 10     16  19  4
+  \[16\] \.strtab           STRTAB          00000000 00260c 000059 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is DYN \(Shared object file\)
+Entry point 0x10000080
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x00224 0x00224 RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x00130 0x00134 RWE 0x1000
+  DYNAMIC        0x00117c 0x0000817c 0x0000817c 0x000a8 0x000a8 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.neardata \.dynamic 
+   01     \.rela\.plt \.plt \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x117c contains 16 entries:
+  Tag        Type                         Name/Value
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x8118
+ 0x00000006 \(SYMTAB\)                     0x8048
+ 0x0000000a \(STRSZ\)                      37 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x70000000 \(C6000_DSBT_BASE\)            0x10000100
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x2
+ 0x00000003 \(PLTGOT\)                     0x1000010c
+ 0x00000002 \(PLTRELSZ\)                   24 \(bytes\)
+ 0x00000014 \(PLTREL\)                     RELA
+ 0x00000017 \(JMPREL\)                     0x10000000
+ 0x00000007 \(RELA\)                       0x8140
+ 0x00000008 \(RELASZ\)                     84 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x1140 contains 3 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000120  00000501 R_C6000_ABS32          10000130   \.bss \+ 0
+1000011c  00000701 R_C6000_ABS32          00000000   b \+ 0
+10000124  00000b01 R_C6000_ABS32          10000128   a \+ 0
+
+Relocation section '\.rela\.neardata' at offset 0x1164 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000128  00000a01 R_C6000_ABS32          10000088   sub0 \+ 0
+1000012c  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+
+Relocation section '\.rela\.plt' at offset 0x2000 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000114  00000a1b R_C6000_JUMP_SLOT      10000088   sub0 \+ 0
+10000118  00000c1b R_C6000_JUMP_SLOT      100000c0   sub \+ 0
+
+Symbol table '\.dynsym' contains 13 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     2: 10000080     0 SECTION LOCAL  DEFAULT    9 
+     3: 10000100     0 SECTION LOCAL  DEFAULT   10 
+     4: 10000128     0 SECTION LOCAL  DEFAULT   11 
+     5: 10000130     0 SECTION LOCAL  DEFAULT   12 
+     6: 10000100     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
+     8: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+     9: 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
+    10: 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
+    11: 10000128     4 OBJECT  GLOBAL DEFAULT   11 a
+    12: 100000c0    52 FUNC    GLOBAL DEFAULT    9 sub
+
+Symbol table '\.symtab' contains 26 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 00008048     0 SECTION LOCAL  DEFAULT    2 
+     3: 00008118     0 SECTION LOCAL  DEFAULT    3 
+     4: 00008140     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008164     0 SECTION LOCAL  DEFAULT    5 
+     6: 0000817c     0 SECTION LOCAL  DEFAULT    6 
+     7: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     8: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     9: 10000080     0 SECTION LOCAL  DEFAULT    9 
+    10: 10000100     0 SECTION LOCAL  DEFAULT   10 
+    11: 10000128     0 SECTION LOCAL  DEFAULT   11 
+    12: 10000130     0 SECTION LOCAL  DEFAULT   12 
+    13: 00000000     0 SECTION LOCAL  DEFAULT   13 
+    14: 10000080     0 FUNC    LOCAL  HIDDEN     9 sub1
+    15: 0000817c     0 OBJECT  LOCAL  DEFAULT    6 _DYNAMIC
+    16: 10000130     4 NOTYPE  LOCAL  DEFAULT   12 c
+    17: 1000010c     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
+    18: 10000100     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    19: 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
+    20: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    21: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+    22: 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
+    23: 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
+    24: 10000128     4 OBJECT  GLOBAL DEFAULT   11 a
+    25: 100000c0    52 FUNC    GLOBAL DEFAULT    9 sub
Index: ld/testsuite/ld-tic6x/shlib-1.s
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1.s
diff -N ld/testsuite/ld-tic6x/shlib-1.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1.s	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,44 @@
+	.text
+	.nocmp
+	.align	2
+	.hidden	sub1
+	.type	sub1, @function
+sub1:
+		ret .s2 B3
+		nop	5
+
+	.global	sub0
+	.type	sub0, @function
+sub0:
+		sub	.d2	B15, 16, B15
+		stw	.d2t2	B3, *+B15(12)
+		stw	.d2t2	B14, *+B15(16)
+		ldw	.d2t2	*+B14($DSBT_index(__c6xabi_DSBT_BASE)), B14
+		call	.s2	(sub)
+		call	.s2	(sub0)
+		call	.s2	(sub1)
+.L2:
+		ldw	.d2t2	*+B15(12), B3
+		ldw	.d2t2	*+B15(16), B14
+		addk	.s2	16, B15
+		nop	3
+		ret	.s2	B3
+		nop	5
+	.size	sub0, .-sub0
+
+	.global	a
+	.section	.neardata,"aw",@progbits
+	.align	2
+	.type	a, @object
+	.size	a, 4
+a:
+	.long	sub0
+	.weak	g1
+	.global g2
+	.type	g2, @object
+	.size	g2, 4
+g2:
+	.long	g1
+
+	.hidden c
+	.scomm	c,4,4
Index: ld/testsuite/ld-tic6x/shlib-1.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1.sd
diff -N ld/testsuite/ld-tic6x/shlib-1.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,7 @@
+
+tmpdir/libtest\.so:     file format elf32-tic6x-le
+
+Contents of section \.got:
+[ \t]*10000100 00000000 00000000 00000000 00000000 .*
+[ \t]*10000110 00000000 20000010 20000010 00000000 .*
+[ \t]*10000120 30010010 00000000                   .*
Index: ld/testsuite/ld-tic6x/shlib-1b.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1b.dd
diff -N ld/testsuite/ld-tic6x/shlib-1b.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1b.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,67 @@
+
+tmpdir/libtestb\.so:     file format elf32-tic6x-be
+
+
+Disassembly of section \.plt:
+
+10000020 <sub0@plt-0x18>:
+10000020:[ \t]*0100036e[ \t]*ldw \.D2T2 \*\+b14\(12\),b2
+10000024:[ \t]*0080046e[ \t]*ldw \.D2T2 \*\+b14\(16\),b1
+10000028:[ \t]*00004000[ \t]*nop 3
+1000002c:[ \t]*00080362[ \t]*b \.S2 b2
+10000030:[ \t]*00008000[ \t]*nop 5
+10000034:[ \t]*00000000[ \t]*nop 1
+
+10000038 <sub0@plt>:
+10000038:[ \t]*0100056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b2
+1000003c:[ \t]*0000002a[ \t]*mvk \.S2 0,b0
+10000040:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+10000044:[ \t]*00002000[ \t]*nop 2
+10000048:[ \t]*00080362[ \t]*b \.S2 b2
+1000004c:[ \t]*00008000[ \t]*nop 5
+
+10000050 <sub@plt>:
+10000050:[ \t]*0100066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b2
+10000054:[ \t]*0000062a[ \t]*mvk \.S2 12,b0
+10000058:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+1000005c:[ \t]*00002000[ \t]*nop 2
+10000060:[ \t]*00080362[ \t]*b \.S2 b2
+10000064:[ \t]*00008000[ \t]*nop 5
+	\.\.\.
+
+Disassembly of section \.text:
+
+10000080 <sub1>:
+10000080:[ \t]*000c0362[ \t]*b \.S2 b3
+10000084:[ \t]*00008000[ \t]*nop 5
+
+10000088 <sub0>:
+10000088:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+1000008c:[ \t]*01bc62f6[ \t]*stw \.D2T2 b3,\*\+b15\(12\)
+10000090:[ \t]*073c82f6[ \t]*stw \.D2T2 b14,\*\+b15\(16\)
+10000094:[ \t]*0700026e[ \t]*ldw \.D2T2 \*\+b14\(8\),b14
+10000098:[ \t]*0ffffa12[ \t]*b \.S2 10000050 <sub@plt>
+1000009c:[ \t]*0ffff712[ \t]*b \.S2 10000038 <sub0@plt>
+100000a0:[ \t]*0ffffc12[ \t]*b \.S2 10000080 <sub1>
+100000a4:[ \t]*01bc62e6[ \t]*ldw \.D2T2 \*\+b15\(12\),b3
+100000a8:[ \t]*073c82e6[ \t]*ldw \.D2T2 \*\+b15\(16\),b14
+100000ac:[ \t]*07800852[ \t]*addk \.S2 16,b15
+100000b0:[ \t]*00004000[ \t]*nop 3
+100000b4:[ \t]*000c0362[ \t]*b \.S2 b3
+100000b8:[ \t]*00008000[ \t]*nop 5
+100000bc:[ \t]*00000000[ \t]*nop 1
+
+100000c0 <sub>:
+100000c0:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+100000c4:[ \t]*023c62f4[ \t]*stw \.D2T1 a4,\*\+b15\(12\)
+100000c8:[ \t]*003c62e4[ \t]*ldw \.D2T1 \*\+b15\(12\),a0
+100000cc:[ \t]*00006000[ \t]*nop 4
+100000d0:[ \t]*00014940[ \t]*add \.D1 a0,10,a0
+100000d4:[ \t]*020008f0[ \t]*or \.D1 0,a0,a4
+100000d8:[ \t]*07be0942[ \t]*add \.D2 b15,16,b15
+100000dc:[ \t]*000c0362[ \t]*b \.S2 b3
+100000e0:[ \t]*0300096e[ \t]*ldw \.D2T2 \*\+b14\(36\),b6
+100000e4:[ \t]*0380076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b7
+100000e8:[ \t]*0400086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b8
+100000ec:[ \t]*04800c6e[ \t]*ldw \.D2T2 \*\+b14\(48\),b9
+	\.\.\.
Index: ld/testsuite/ld-tic6x/shlib-1b.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1b.rd
diff -N ld/testsuite/ld-tic6x/shlib-1b.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1b.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,123 @@
+There are 17 section headers, starting at offset 0x21c4:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 000048 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          00008048 001048 0000d0 10   A  3   6  4
+  \[ 3\] \.dynstr           STRTAB          00008118 001118 000025 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            00008140 001140 000024 0c   A  2  10  4
+  \[ 5\] \.rela\.neardata    RELA            00008164 001164 000018 0c   A  2  11  4
+  \[ 6\] \.dynamic          DYNAMIC         0000817c 00117c 0000a8 08  WA  3   0  4
+  \[ 7\] \.rela\.plt         RELA            10000000 002000 000018 0c   A  2   8  4
+  \[ 8\] \.plt              PROGBITS        10000020 002020 000060 18  AX  0   0 32
+  \[ 9\] \.text             PROGBITS        10000080 002080 000080 00  AX  0   0 32
+  \[10\] \.got              PROGBITS        10000100 002100 000028 00  WA  0   0  4
+  \[11\] \.neardata         PROGBITS        10000128 002128 000008 00  WA  0   0  4
+  \[12\] \.bss              NOBITS          10000130 002130 000004 00  WA  0   0  4
+  \[13\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 002130 000019 00      0   0  1
+  \[14\] \.shstrtab         STRTAB          00000000 002149 00007b 00      0   0  1
+  \[15\] \.symtab           SYMTAB          00000000 00246c 0001a0 10     16  19  4
+  \[16\] \.strtab           STRTAB          00000000 00260c 000059 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is DYN \(Shared object file\)
+Entry point 0x10000080
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x00224 0x00224 RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x00130 0x00134 RWE 0x1000
+  DYNAMIC        0x00117c 0x0000817c 0x0000817c 0x000a8 0x000a8 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.neardata \.dynamic 
+   01     \.rela\.plt \.plt \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x117c contains 16 entries:
+  Tag        Type                         Name/Value
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x8118
+ 0x00000006 \(SYMTAB\)                     0x8048
+ 0x0000000a \(STRSZ\)                      37 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x70000000 \(C6000_DSBT_BASE\)            0x10000100
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x2
+ 0x00000003 \(PLTGOT\)                     0x1000010c
+ 0x00000002 \(PLTRELSZ\)                   24 \(bytes\)
+ 0x00000014 \(PLTREL\)                     RELA
+ 0x00000017 \(JMPREL\)                     0x10000000
+ 0x00000007 \(RELA\)                       0x8140
+ 0x00000008 \(RELASZ\)                     84 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x1140 contains 3 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000120  00000501 R_C6000_ABS32          10000130   \.bss \+ 0
+1000011c  00000701 R_C6000_ABS32          00000000   b \+ 0
+10000124  00000b01 R_C6000_ABS32          10000128   a \+ 0
+
+Relocation section '\.rela\.neardata' at offset 0x1164 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000128  00000a01 R_C6000_ABS32          10000088   sub0 \+ 0
+1000012c  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+
+Relocation section '\.rela\.plt' at offset 0x2000 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000114  00000a1b R_C6000_JUMP_SLOT      10000088   sub0 \+ 0
+10000118  00000c1b R_C6000_JUMP_SLOT      100000c0   sub \+ 0
+
+Symbol table '\.dynsym' contains 13 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     2: 10000080     0 SECTION LOCAL  DEFAULT    9 
+     3: 10000100     0 SECTION LOCAL  DEFAULT   10 
+     4: 10000128     0 SECTION LOCAL  DEFAULT   11 
+     5: 10000130     0 SECTION LOCAL  DEFAULT   12 
+     6: 10000100     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
+     8: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+     9: 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
+    10: 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
+    11: 10000128     4 OBJECT  GLOBAL DEFAULT   11 a
+    12: 100000c0    52 FUNC    GLOBAL DEFAULT    9 sub
+
+Symbol table '\.symtab' contains 26 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 00008048     0 SECTION LOCAL  DEFAULT    2 
+     3: 00008118     0 SECTION LOCAL  DEFAULT    3 
+     4: 00008140     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008164     0 SECTION LOCAL  DEFAULT    5 
+     6: 0000817c     0 SECTION LOCAL  DEFAULT    6 
+     7: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     8: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     9: 10000080     0 SECTION LOCAL  DEFAULT    9 
+    10: 10000100     0 SECTION LOCAL  DEFAULT   10 
+    11: 10000128     0 SECTION LOCAL  DEFAULT   11 
+    12: 10000130     0 SECTION LOCAL  DEFAULT   12 
+    13: 00000000     0 SECTION LOCAL  DEFAULT   13 
+    14: 10000080     0 FUNC    LOCAL  HIDDEN     9 sub1
+    15: 0000817c     0 OBJECT  LOCAL  DEFAULT    6 _DYNAMIC
+    16: 10000130     4 NOTYPE  LOCAL  DEFAULT   12 c
+    17: 1000010c     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
+    18: 10000100     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    19: 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
+    20: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    21: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+    22: 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
+    23: 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
+    24: 10000128     4 OBJECT  GLOBAL DEFAULT   11 a
+    25: 100000c0    52 FUNC    GLOBAL DEFAULT    9 sub
Index: ld/testsuite/ld-tic6x/shlib-1b.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1b.sd
diff -N ld/testsuite/ld-tic6x/shlib-1b.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1b.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,7 @@
+
+tmpdir/libtestb\.so:     file format elf32-tic6x-be
+
+Contents of section \.got:
+[ \t]*10000100 00000000 00000000 00000000 00000000 .*
+[ \t]*10000110 00000000 10000020 10000020 00000000 .*
+[ \t]*10000120 10000130 00000000                   .*
Index: ld/testsuite/ld-tic6x/shlib-1r.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1r.dd
diff -N ld/testsuite/ld-tic6x/shlib-1r.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1r.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,67 @@
+
+tmpdir/libtestr\.so:     file format elf32-tic6x-le
+
+
+Disassembly of section \.plt:
+
+10000020 <sub0@plt-0x18>:
+10000020:[ \t]*0100036e[ \t]*ldw \.D2T2 \*\+b14\(12\),b2
+10000024:[ \t]*0080046e[ \t]*ldw \.D2T2 \*\+b14\(16\),b1
+10000028:[ \t]*00004000[ \t]*nop 3
+1000002c:[ \t]*00080362[ \t]*b \.S2 b2
+10000030:[ \t]*00008000[ \t]*nop 5
+10000034:[ \t]*00000000[ \t]*nop 1
+
+10000038 <sub0@plt>:
+10000038:[ \t]*0100056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b2
+1000003c:[ \t]*0000002a[ \t]*mvk \.S2 0,b0
+10000040:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+10000044:[ \t]*00002000[ \t]*nop 2
+10000048:[ \t]*00080362[ \t]*b \.S2 b2
+1000004c:[ \t]*00008000[ \t]*nop 5
+
+10000050 <sub@plt>:
+10000050:[ \t]*0100066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b2
+10000054:[ \t]*0000062a[ \t]*mvk \.S2 12,b0
+10000058:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+1000005c:[ \t]*00002000[ \t]*nop 2
+10000060:[ \t]*00080362[ \t]*b \.S2 b2
+10000064:[ \t]*00008000[ \t]*nop 5
+	\.\.\.
+
+Disassembly of section \.text:
+
+10000080 <sub1>:
+10000080:[ \t]*000c0362[ \t]*b \.S2 b3
+10000084:[ \t]*00008000[ \t]*nop 5
+
+10000088 <sub0>:
+10000088:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+1000008c:[ \t]*01bc62f6[ \t]*stw \.D2T2 b3,\*\+b15\(12\)
+10000090:[ \t]*073c82f6[ \t]*stw \.D2T2 b14,\*\+b15\(16\)
+10000094:[ \t]*0700026e[ \t]*ldw \.D2T2 \*\+b14\(8\),b14
+10000098:[ \t]*0ffffa12[ \t]*b \.S2 10000050 <sub@plt>
+1000009c:[ \t]*0ffff712[ \t]*b \.S2 10000038 <sub0@plt>
+100000a0:[ \t]*0ffffc12[ \t]*b \.S2 10000080 <sub1>
+100000a4:[ \t]*01bc62e6[ \t]*ldw \.D2T2 \*\+b15\(12\),b3
+100000a8:[ \t]*073c82e6[ \t]*ldw \.D2T2 \*\+b15\(16\),b14
+100000ac:[ \t]*07800852[ \t]*addk \.S2 16,b15
+100000b0:[ \t]*00004000[ \t]*nop 3
+100000b4:[ \t]*000c0362[ \t]*b \.S2 b3
+100000b8:[ \t]*00008000[ \t]*nop 5
+100000bc:[ \t]*00000000[ \t]*nop 1
+
+100000c0 <sub>:
+100000c0:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+100000c4:[ \t]*023c62f4[ \t]*stw \.D2T1 a4,\*\+b15\(12\)
+100000c8:[ \t]*003c62e4[ \t]*ldw \.D2T1 \*\+b15\(12\),a0
+100000cc:[ \t]*00006000[ \t]*nop 4
+100000d0:[ \t]*00014940[ \t]*add \.D1 a0,10,a0
+100000d4:[ \t]*020008f0[ \t]*or \.D1 0,a0,a4
+100000d8:[ \t]*07be0942[ \t]*add \.D2 b15,16,b15
+100000dc:[ \t]*000c0362[ \t]*b \.S2 b3
+100000e0:[ \t]*0300096e[ \t]*ldw \.D2T2 \*\+b14\(36\),b6
+100000e4:[ \t]*0380076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b7
+100000e8:[ \t]*0400086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b8
+100000ec:[ \t]*04800c6e[ \t]*ldw \.D2T2 \*\+b14\(48\),b9
+	\.\.\.
Index: ld/testsuite/ld-tic6x/shlib-1r.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1r.rd
diff -N ld/testsuite/ld-tic6x/shlib-1r.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1r.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,123 @@
+There are 17 section headers, starting at offset 0x21c4:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 000048 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          00008048 001048 0000d0 10   A  3   6  4
+  \[ 3\] \.dynstr           STRTAB          00008118 001118 000025 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            00008140 001140 000024 0c   A  2  10  4
+  \[ 5\] \.rela\.neardata    RELA            00008164 001164 000018 0c   A  2  11  4
+  \[ 6\] \.dynamic          DYNAMIC         0000817c 00117c 0000a8 08  WA  3   0  4
+  \[ 7\] \.rela\.plt         RELA            10000000 002000 000018 0c   A  2   8  4
+  \[ 8\] \.plt              PROGBITS        10000020 002020 000060 18  AX  0   0 32
+  \[ 9\] \.text             PROGBITS        10000080 002080 000080 00  AX  0   0 32
+  \[10\] \.got              PROGBITS        10000100 002100 000028 00  WA  0   0  4
+  \[11\] \.neardata         PROGBITS        10000128 002128 000008 00  WA  0   0  4
+  \[12\] \.bss              NOBITS          10000130 002130 000004 00  WA  0   0  4
+  \[13\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 002130 000019 00      0   0  1
+  \[14\] \.shstrtab         STRTAB          00000000 002149 00007b 00      0   0  1
+  \[15\] \.symtab           SYMTAB          00000000 00246c 0001a0 10     16  19  4
+  \[16\] \.strtab           STRTAB          00000000 00260c 000059 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is DYN \(Shared object file\)
+Entry point 0x10000080
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x00224 0x00224 RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x00130 0x00134 RWE 0x1000
+  DYNAMIC        0x00117c 0x0000817c 0x0000817c 0x000a8 0x000a8 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.neardata \.dynamic 
+   01     \.rela\.plt \.plt \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x117c contains 16 entries:
+  Tag        Type                         Name/Value
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x8118
+ 0x00000006 \(SYMTAB\)                     0x8048
+ 0x0000000a \(STRSZ\)                      37 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x70000000 \(C6000_DSBT_BASE\)            0x10000100
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x2
+ 0x00000003 \(PLTGOT\)                     0x1000010c
+ 0x00000002 \(PLTRELSZ\)                   24 \(bytes\)
+ 0x00000014 \(PLTREL\)                     RELA
+ 0x00000017 \(JMPREL\)                     0x10000000
+ 0x00000007 \(RELA\)                       0x8140
+ 0x00000008 \(RELASZ\)                     84 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x1140 contains 3 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000120  00000501 R_C6000_ABS32          10000130   \.bss \+ 0
+1000011c  00000701 R_C6000_ABS32          00000000   b \+ 0
+10000124  00000b01 R_C6000_ABS32          10000128   a \+ 0
+
+Relocation section '\.rela\.neardata' at offset 0x1164 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000128  00000a01 R_C6000_ABS32          10000088   sub0 \+ 0
+1000012c  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+
+Relocation section '\.rela\.plt' at offset 0x2000 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000114  00000a1b R_C6000_JUMP_SLOT      10000088   sub0 \+ 0
+10000118  00000c1b R_C6000_JUMP_SLOT      100000c0   sub \+ 0
+
+Symbol table '\.dynsym' contains 13 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     2: 10000080     0 SECTION LOCAL  DEFAULT    9 
+     3: 10000100     0 SECTION LOCAL  DEFAULT   10 
+     4: 10000128     0 SECTION LOCAL  DEFAULT   11 
+     5: 10000130     0 SECTION LOCAL  DEFAULT   12 
+     6: 10000100     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
+     8: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+     9: 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
+    10: 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
+    11: 10000128     4 OBJECT  GLOBAL DEFAULT   11 a
+    12: 100000c0    52 FUNC    GLOBAL DEFAULT    9 sub
+
+Symbol table '\.symtab' contains 26 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 00008048     0 SECTION LOCAL  DEFAULT    2 
+     3: 00008118     0 SECTION LOCAL  DEFAULT    3 
+     4: 00008140     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008164     0 SECTION LOCAL  DEFAULT    5 
+     6: 0000817c     0 SECTION LOCAL  DEFAULT    6 
+     7: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     8: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     9: 10000080     0 SECTION LOCAL  DEFAULT    9 
+    10: 10000100     0 SECTION LOCAL  DEFAULT   10 
+    11: 10000128     0 SECTION LOCAL  DEFAULT   11 
+    12: 10000130     0 SECTION LOCAL  DEFAULT   12 
+    13: 00000000     0 SECTION LOCAL  DEFAULT   13 
+    14: 10000080     0 FUNC    LOCAL  HIDDEN     9 sub1
+    15: 0000817c     0 OBJECT  LOCAL  DEFAULT    6 _DYNAMIC
+    16: 10000130     4 NOTYPE  LOCAL  DEFAULT   12 c
+    17: 1000010c     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
+    18: 10000100     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    19: 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
+    20: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    21: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+    22: 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
+    23: 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
+    24: 10000128     4 OBJECT  GLOBAL DEFAULT   11 a
+    25: 100000c0    52 FUNC    GLOBAL DEFAULT    9 sub
Index: ld/testsuite/ld-tic6x/shlib-1r.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1r.sd
diff -N ld/testsuite/ld-tic6x/shlib-1r.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1r.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,7 @@
+
+tmpdir/libtestr\.so:     file format elf32-tic6x-le
+
+Contents of section \.got:
+[ \t]*10000100 00000000 00000000 00000000 00000000 .*
+[ \t]*10000110 00000000 20000010 20000010 00000000 .*
+[ \t]*10000120 30010010 00000000                   .*
Index: ld/testsuite/ld-tic6x/shlib-1rb.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1rb.dd
diff -N ld/testsuite/ld-tic6x/shlib-1rb.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1rb.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,67 @@
+
+tmpdir/libtestrb\.so:     file format elf32-tic6x-be
+
+
+Disassembly of section \.plt:
+
+10000020 <sub0@plt-0x18>:
+10000020:[ \t]*0100036e[ \t]*ldw \.D2T2 \*\+b14\(12\),b2
+10000024:[ \t]*0080046e[ \t]*ldw \.D2T2 \*\+b14\(16\),b1
+10000028:[ \t]*00004000[ \t]*nop 3
+1000002c:[ \t]*00080362[ \t]*b \.S2 b2
+10000030:[ \t]*00008000[ \t]*nop 5
+10000034:[ \t]*00000000[ \t]*nop 1
+
+10000038 <sub0@plt>:
+10000038:[ \t]*0100056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b2
+1000003c:[ \t]*0000002a[ \t]*mvk \.S2 0,b0
+10000040:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+10000044:[ \t]*00002000[ \t]*nop 2
+10000048:[ \t]*00080362[ \t]*b \.S2 b2
+1000004c:[ \t]*00008000[ \t]*nop 5
+
+10000050 <sub@plt>:
+10000050:[ \t]*0100066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b2
+10000054:[ \t]*0000062a[ \t]*mvk \.S2 12,b0
+10000058:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+1000005c:[ \t]*00002000[ \t]*nop 2
+10000060:[ \t]*00080362[ \t]*b \.S2 b2
+10000064:[ \t]*00008000[ \t]*nop 5
+	\.\.\.
+
+Disassembly of section \.text:
+
+10000080 <sub1>:
+10000080:[ \t]*000c0362[ \t]*b \.S2 b3
+10000084:[ \t]*00008000[ \t]*nop 5
+
+10000088 <sub0>:
+10000088:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+1000008c:[ \t]*01bc62f6[ \t]*stw \.D2T2 b3,\*\+b15\(12\)
+10000090:[ \t]*073c82f6[ \t]*stw \.D2T2 b14,\*\+b15\(16\)
+10000094:[ \t]*0700026e[ \t]*ldw \.D2T2 \*\+b14\(8\),b14
+10000098:[ \t]*0ffffa12[ \t]*b \.S2 10000050 <sub@plt>
+1000009c:[ \t]*0ffff712[ \t]*b \.S2 10000038 <sub0@plt>
+100000a0:[ \t]*0ffffc12[ \t]*b \.S2 10000080 <sub1>
+100000a4:[ \t]*01bc62e6[ \t]*ldw \.D2T2 \*\+b15\(12\),b3
+100000a8:[ \t]*073c82e6[ \t]*ldw \.D2T2 \*\+b15\(16\),b14
+100000ac:[ \t]*07800852[ \t]*addk \.S2 16,b15
+100000b0:[ \t]*00004000[ \t]*nop 3
+100000b4:[ \t]*000c0362[ \t]*b \.S2 b3
+100000b8:[ \t]*00008000[ \t]*nop 5
+100000bc:[ \t]*00000000[ \t]*nop 1
+
+100000c0 <sub>:
+100000c0:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+100000c4:[ \t]*023c62f4[ \t]*stw \.D2T1 a4,\*\+b15\(12\)
+100000c8:[ \t]*003c62e4[ \t]*ldw \.D2T1 \*\+b15\(12\),a0
+100000cc:[ \t]*00006000[ \t]*nop 4
+100000d0:[ \t]*00014940[ \t]*add \.D1 a0,10,a0
+100000d4:[ \t]*020008f0[ \t]*or \.D1 0,a0,a4
+100000d8:[ \t]*07be0942[ \t]*add \.D2 b15,16,b15
+100000dc:[ \t]*000c0362[ \t]*b \.S2 b3
+100000e0:[ \t]*0300096e[ \t]*ldw \.D2T2 \*\+b14\(36\),b6
+100000e4:[ \t]*0380076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b7
+100000e8:[ \t]*0400086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b8
+100000ec:[ \t]*04800c6e[ \t]*ldw \.D2T2 \*\+b14\(48\),b9
+	\.\.\.
Index: ld/testsuite/ld-tic6x/shlib-1rb.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1rb.rd
diff -N ld/testsuite/ld-tic6x/shlib-1rb.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1rb.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,123 @@
+There are 17 section headers, starting at offset 0x21c4:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 000048 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          00008048 001048 0000d0 10   A  3   6  4
+  \[ 3\] \.dynstr           STRTAB          00008118 001118 000025 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            00008140 001140 000024 0c   A  2  10  4
+  \[ 5\] \.rela\.neardata    RELA            00008164 001164 000018 0c   A  2  11  4
+  \[ 6\] \.dynamic          DYNAMIC         0000817c 00117c 0000a8 08  WA  3   0  4
+  \[ 7\] \.rela\.plt         RELA            10000000 002000 000018 0c   A  2   8  4
+  \[ 8\] \.plt              PROGBITS        10000020 002020 000060 18  AX  0   0 32
+  \[ 9\] \.text             PROGBITS        10000080 002080 000080 00  AX  0   0 32
+  \[10\] \.got              PROGBITS        10000100 002100 000028 00  WA  0   0  4
+  \[11\] \.neardata         PROGBITS        10000128 002128 000008 00  WA  0   0  4
+  \[12\] \.bss              NOBITS          10000130 002130 000004 00  WA  0   0  4
+  \[13\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 002130 000019 00      0   0  1
+  \[14\] \.shstrtab         STRTAB          00000000 002149 00007b 00      0   0  1
+  \[15\] \.symtab           SYMTAB          00000000 00246c 0001a0 10     16  19  4
+  \[16\] \.strtab           STRTAB          00000000 00260c 000059 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is DYN \(Shared object file\)
+Entry point 0x10000080
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x00224 0x00224 RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x00130 0x00134 RWE 0x1000
+  DYNAMIC        0x00117c 0x0000817c 0x0000817c 0x000a8 0x000a8 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.neardata \.dynamic 
+   01     \.rela\.plt \.plt \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x117c contains 16 entries:
+  Tag        Type                         Name/Value
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x8118
+ 0x00000006 \(SYMTAB\)                     0x8048
+ 0x0000000a \(STRSZ\)                      37 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x70000000 \(C6000_DSBT_BASE\)            0x10000100
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x2
+ 0x00000003 \(PLTGOT\)                     0x1000010c
+ 0x00000002 \(PLTRELSZ\)                   24 \(bytes\)
+ 0x00000014 \(PLTREL\)                     RELA
+ 0x00000017 \(JMPREL\)                     0x10000000
+ 0x00000007 \(RELA\)                       0x8140
+ 0x00000008 \(RELASZ\)                     84 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x1140 contains 3 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000120  00000501 R_C6000_ABS32          10000130   \.bss \+ 0
+1000011c  00000701 R_C6000_ABS32          00000000   b \+ 0
+10000124  00000b01 R_C6000_ABS32          10000128   a \+ 0
+
+Relocation section '\.rela\.neardata' at offset 0x1164 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000128  00000a01 R_C6000_ABS32          10000088   sub0 \+ 0
+1000012c  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+
+Relocation section '\.rela\.plt' at offset 0x2000 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+10000114  00000a1b R_C6000_JUMP_SLOT      10000088   sub0 \+ 0
+10000118  00000c1b R_C6000_JUMP_SLOT      100000c0   sub \+ 0
+
+Symbol table '\.dynsym' contains 13 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     2: 10000080     0 SECTION LOCAL  DEFAULT    9 
+     3: 10000100     0 SECTION LOCAL  DEFAULT   10 
+     4: 10000128     0 SECTION LOCAL  DEFAULT   11 
+     5: 10000130     0 SECTION LOCAL  DEFAULT   12 
+     6: 10000100     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
+     8: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+     9: 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
+    10: 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
+    11: 10000128     4 OBJECT  GLOBAL DEFAULT   11 a
+    12: 100000c0    52 FUNC    GLOBAL DEFAULT    9 sub
+
+Symbol table '\.symtab' contains 26 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 00008048     0 SECTION LOCAL  DEFAULT    2 
+     3: 00008118     0 SECTION LOCAL  DEFAULT    3 
+     4: 00008140     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008164     0 SECTION LOCAL  DEFAULT    5 
+     6: 0000817c     0 SECTION LOCAL  DEFAULT    6 
+     7: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     8: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     9: 10000080     0 SECTION LOCAL  DEFAULT    9 
+    10: 10000100     0 SECTION LOCAL  DEFAULT   10 
+    11: 10000128     0 SECTION LOCAL  DEFAULT   11 
+    12: 10000130     0 SECTION LOCAL  DEFAULT   12 
+    13: 00000000     0 SECTION LOCAL  DEFAULT   13 
+    14: 10000080     0 FUNC    LOCAL  HIDDEN     9 sub1
+    15: 0000817c     0 OBJECT  LOCAL  DEFAULT    6 _DYNAMIC
+    16: 10000130     4 NOTYPE  LOCAL  DEFAULT   12 c
+    17: 1000010c     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
+    18: 10000100     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    19: 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
+    20: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    21: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+    22: 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
+    23: 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
+    24: 10000128     4 OBJECT  GLOBAL DEFAULT   11 a
+    25: 100000c0    52 FUNC    GLOBAL DEFAULT    9 sub
Index: ld/testsuite/ld-tic6x/shlib-1rb.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-1rb.sd
diff -N ld/testsuite/ld-tic6x/shlib-1rb.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-1rb.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,7 @@
+
+tmpdir/libtestrb\.so:     file format elf32-tic6x-be
+
+Contents of section \.got:
+[ \t]*10000100 00000000 00000000 00000000 00000000 .*
+[ \t]*10000110 00000000 10000020 10000020 00000000 .*
+[ \t]*10000120 10000130 00000000                   .*
Index: ld/testsuite/ld-tic6x/shlib-2.s
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-2.s
diff -N ld/testsuite/ld-tic6x/shlib-2.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-2.s	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,23 @@
+	.weak a
+	.weak b
+
+	.text
+	.nocmp
+	.align	2
+	.global	sub
+	.type	sub, @function
+sub:
+		sub	.d2	B15, 16, B15
+		stw	.d2t1	A4, *+B15(12)
+		ldw	.d2t1	*+B15(12), A0
+		nop	4
+		add	.d1	A0, 10, A0
+		mv	.d1	A0, A4
+		add	.d2	B15, 16, B15
+		ret	.s2	B3
+		ldw .d2t2 *+B14($GOT(a)), B6
+		ldw .d2t2 *+B14($GOT(b)), B7
+		ldw .d2t2 *+B14($GOT(c)), B8
+		ldw .d2t2 *+B14(c), B9
+		nop	1
+	.size	sub, .-sub
Index: ld/testsuite/ld-tic6x/shlib-app-1.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1.dd
diff -N ld/testsuite/ld-tic6x/shlib-app-1.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,40 @@
+
+tmpdir/shlib-dynapp-1:     file format elf32-tic6x-le
+
+
+Disassembly of section \.plt:
+
+10000020 <sub0@plt-0x18>:
+10000020:[ \t]*0100036e[ \t]*ldw \.D2T2 \*\+b14\(12\),b2
+10000024:[ \t]*0080046e[ \t]*ldw \.D2T2 \*\+b14\(16\),b1
+10000028:[ \t]*00004000[ \t]*nop 3
+1000002c:[ \t]*00080362[ \t]*b \.S2 b2
+10000030:[ \t]*00008000[ \t]*nop 5
+10000034:[ \t]*00000000[ \t]*nop 1
+
+10000038 <sub0@plt>:
+10000038:[ \t]*0100056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b2
+1000003c:[ \t]*0000002a[ \t]*mvk \.S2 0,b0
+10000040:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+10000044:[ \t]*00002000[ \t]*nop 2
+10000048:[ \t]*00080362[ \t]*b \.S2 b2
+1000004c:[ \t]*00008000[ \t]*nop 5
+[ \t]*\.\.\.
+
+Disassembly of section \.text:
+
+10000060 <fish>:
+10000060:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000064:[ \t]*1ffffb12[ \t]*callp \.S2 10000038 <sub0@plt>,b3
+10000068:[ \t]*0ffffb12[ \t]*b \.S2 10000038 <sub0@plt>
+1000006c:[ \t]*10000012[ \t]*callp \.S2 10000060 <fish>,b3
+10000070:[ \t]*00000012[ \t]*b \.S2 10000060 <fish>
+10000074:[ \t]*02000b6e[ \t]*ldw \.D2T2 \*\+b14\(44\),b4
+10000078:[ \t]*0280086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b5
+1000007c:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+10000080:[ \t]*0300066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b6
+10000084:[ \t]*020003a8[ \t]*mvk \.S1 7,a4
+10000088:[ \t]*02000068[ \t]*mvkh \.S1 0,a4
+1000008c:[ \t]*02800328[ \t]*mvk \.S1 6,a5
+10000090:[ \t]*02800068[ \t]*mvkh \.S1 0,a5
+[ \t]*\.\.\.
Index: ld/testsuite/ld-tic6x/shlib-app-1.od
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1.od
diff -N ld/testsuite/ld-tic6x/shlib-app-1.od
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1.od	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,13 @@
+
+tmpdir/shlib-dynapp-1:     file format elf32-tic6x-le
+
+DYNAMIC RELOCATION RECORDS
+OFFSET   TYPE              VALUE 
+100000b8 R_C6000_ABS32     b
+100000bc R_C6000_ABS32     a
+100000c4 R_C6000_ABS32     g1
+100000c8 R_C6000_ABS32     g2
+100000cc R_C6000_COPY      a
+100000b4 R_C6000_JUMP_SLOT  sub0
+
+
Index: ld/testsuite/ld-tic6x/shlib-app-1.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1.rd
diff -N ld/testsuite/ld-tic6x/shlib-app-1.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,127 @@
+There are 18 section headers, starting at offset 0x2168:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 000044 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          00008044 001044 0000c0 10   A  3   6  4
+  \[ 3\] \.dynstr           STRTAB          00008104 001104 000035 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            0000813c 00113c 000018 0c   A  2  11  4
+  \[ 5\] \.rela\.neardata    RELA            00008154 001154 000018 0c   A  2  12  4
+  \[ 6\] \.rela\.bss         RELA            0000816c 00116c 00000c 0c   A  2  13  4
+  \[ 7\] \.dynamic          DYNAMIC         00008178 001178 0000b8 08  WA  3   0  4
+  \[ 8\] \.rela\.plt         RELA            10000000 002000 00000c 0c   A  2   9  4
+  \[ 9\] \.plt              PROGBITS        10000020 002020 000040 18  AX  0   0 32
+  \[10\] \.text             PROGBITS        10000060 002060 000040 00  AX  0   0 32
+  \[11\] \.got              PROGBITS        100000a0 0020a0 000020 00  WA  0   0  4
+  \[12\] \.neardata         PROGBITS        100000c0 0020c0 00000c 00  WA  0   0  4
+  \[13\] \.bss              NOBITS          100000cc 0020cc 000004 00  WA  0   0  4
+  \[14\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 0020cc 000019 00      0   0  1
+  \[15\] \.shstrtab         STRTAB          00000000 0020e5 000080 00      0   0  1
+  \[16\] \.symtab           SYMTAB          00000000 002438 0001a0 10     17  20  4
+  \[17\] \.strtab           STRTAB          00000000 0025d8 000055 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x10000060
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x00230 0x00230 RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x000cc 0x000d0 RWE 0x1000
+  DYNAMIC        0x001178 0x00008178 0x00008178 0x000b8 0x000b8 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.neardata \.rela\.bss \.dynamic 
+   01     \.rela\.plt \.plt \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x1178 contains 18 entries:
+  Tag        Type                         Name/Value
+ 0x00000001 \(NEEDED\)                     Shared library: \[tmpdir/libtest\.so\]
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x8104
+ 0x00000006 \(SYMTAB\)                     0x8044
+ 0x0000000a \(STRSZ\)                      53 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x00000015 \(DEBUG\)                      0x0
+ 0x70000000 \(C6000_DSBT_BASE\)            0x100000a0
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x0
+ 0x00000003 \(PLTGOT\)                     0x100000ac
+ 0x00000002 \(PLTRELSZ\)                   12 \(bytes\)
+ 0x00000014 \(PLTREL\)                     RELA
+ 0x00000017 \(JMPREL\)                     0x10000000
+ 0x00000007 \(RELA\)                       0x813c
+ 0x00000008 \(RELASZ\)                     72 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x113c contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000b8  00000701 R_C6000_ABS32          100000c0   b \+ 0
+100000bc  00000b01 R_C6000_ABS32          100000cc   a \+ 0
+
+Relocation section '\.rela\.neardata' at offset 0x1154 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000c4  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+100000c8  00000901 R_C6000_ABS32          00000000   g2 \+ 0
+
+Relocation section '\.rela\.bss' at offset 0x116c contains 1 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000cc  00000b1a R_C6000_COPY           100000cc   a \+ 0
+
+Relocation section '\.rela\.plt' at offset 0x2000 contains 1 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000b4  00000a1b R_C6000_JUMP_SLOT      00000000   sub0 \+ 0
+
+Symbol table '\.dynsym' contains 12 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000020     0 SECTION LOCAL  DEFAULT    9 
+     2: 10000060     0 SECTION LOCAL  DEFAULT   10 
+     3: 100000a0     0 SECTION LOCAL  DEFAULT   11 
+     4: 100000c0     0 SECTION LOCAL  DEFAULT   12 
+     5: 100000cc     0 SECTION LOCAL  DEFAULT   13 
+     6: 100000a0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 100000c0     4 OBJECT  GLOBAL DEFAULT   12 b
+     8: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+     9: 00000000     0 OBJECT  WEAK   DEFAULT  UND g2
+    10: 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
+    11: 100000cc     4 OBJECT  GLOBAL DEFAULT   13 a
+
+Symbol table '\.symtab' contains 26 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 00008044     0 SECTION LOCAL  DEFAULT    2 
+     3: 00008104     0 SECTION LOCAL  DEFAULT    3 
+     4: 0000813c     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008154     0 SECTION LOCAL  DEFAULT    5 
+     6: 0000816c     0 SECTION LOCAL  DEFAULT    6 
+     7: 00008178     0 SECTION LOCAL  DEFAULT    7 
+     8: 10000000     0 SECTION LOCAL  DEFAULT    8 
+     9: 10000020     0 SECTION LOCAL  DEFAULT    9 
+    10: 10000060     0 SECTION LOCAL  DEFAULT   10 
+    11: 100000a0     0 SECTION LOCAL  DEFAULT   11 
+    12: 100000c0     0 SECTION LOCAL  DEFAULT   12 
+    13: 100000cc     0 SECTION LOCAL  DEFAULT   13 
+    14: 00000000     0 SECTION LOCAL  DEFAULT   14 
+    15: 10000060     0 NOTYPE  LOCAL  DEFAULT   10 fish
+    16: 100000c4     8 OBJECT  LOCAL  DEFAULT   12 w
+    17: 00008178     0 OBJECT  LOCAL  DEFAULT    7 _DYNAMIC
+    18: 100000ac     0 OBJECT  LOCAL  DEFAULT   11 _GLOBAL_OFFSET_TABLE_
+    19: 100000a0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    20: 100000c0     4 OBJECT  GLOBAL DEFAULT   12 b
+    21: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    22: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+    23: 00000000     0 OBJECT  WEAK   DEFAULT  UND g2
+    24: 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
+    25: 100000cc     4 OBJECT  GLOBAL DEFAULT   13 a
Index: ld/testsuite/ld-tic6x/shlib-app-1.s
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1.s
diff -N ld/testsuite/ld-tic6x/shlib-app-1.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1.s	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,31 @@
+	.global a
+	.text
+	.nocmp
+fish:
+	ldw .d2t2 *+B14($DSBT_index(__c6xabi_DSBT_BASE)), B14
+	callp .s2 sub0, B3
+	b .s2 sub0
+	callp .s2 fish, B3
+	b .s2 fish
+	ldw .d2t2 *+B14(a), B4
+	ldw .d2t2 *+B14(b), B5
+	ldw .d2t2 *+B14($GOT(a)), B6
+	ldw .d2t2 *+B14($GOT(b)), B6
+	mvkl .s1 $DPR_GOT(a), A4
+	mvkh .s1 $DPR_GOT(a), A4
+	mvkl .s1 $DPR_GOT(b), A5
+	mvkh .s1 $DPR_GOT(b), A5
+	.global	b
+	.section	.neardata,"aw",@progbits
+	.align	2
+	.type	b, @object
+	.size	b, 4
+b:
+	.long	0x12345678
+	.weak	g1
+	.weak	g2
+	.type	w, @object
+	.size	w, 8
+w:
+	.long	g1
+	.long	g2
Index: ld/testsuite/ld-tic6x/shlib-app-1.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1.sd
diff -N ld/testsuite/ld-tic6x/shlib-app-1.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,6 @@
+
+tmpdir/shlib-dynapp-1:     file format elf32-tic6x-le
+
+Contents of section \.got:
+[ \t]*100000a0 00000000 00000000 00000000 00000000 .*
+[ \t]*100000b0 00000000 20000010 00000000 00000000 .*
Index: ld/testsuite/ld-tic6x/shlib-app-1b.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1b.dd
diff -N ld/testsuite/ld-tic6x/shlib-app-1b.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1b.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,40 @@
+
+tmpdir/shlib-dynapp-1b:     file format elf32-tic6x-be
+
+
+Disassembly of section \.plt:
+
+10000020 <sub0@plt-0x18>:
+10000020:[ \t]*0100036e[ \t]*ldw \.D2T2 \*\+b14\(12\),b2
+10000024:[ \t]*0080046e[ \t]*ldw \.D2T2 \*\+b14\(16\),b1
+10000028:[ \t]*00004000[ \t]*nop 3
+1000002c:[ \t]*00080362[ \t]*b \.S2 b2
+10000030:[ \t]*00008000[ \t]*nop 5
+10000034:[ \t]*00000000[ \t]*nop 1
+
+10000038 <sub0@plt>:
+10000038:[ \t]*0100056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b2
+1000003c:[ \t]*0000002a[ \t]*mvk \.S2 0,b0
+10000040:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+10000044:[ \t]*00002000[ \t]*nop 2
+10000048:[ \t]*00080362[ \t]*b \.S2 b2
+1000004c:[ \t]*00008000[ \t]*nop 5
+[ \t]*\.\.\.
+
+Disassembly of section \.text:
+
+10000060 <fish>:
+10000060:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000064:[ \t]*1ffffb12[ \t]*callp \.S2 10000038 <sub0@plt>,b3
+10000068:[ \t]*0ffffb12[ \t]*b \.S2 10000038 <sub0@plt>
+1000006c:[ \t]*10000012[ \t]*callp \.S2 10000060 <fish>,b3
+10000070:[ \t]*00000012[ \t]*b \.S2 10000060 <fish>
+10000074:[ \t]*02000b6e[ \t]*ldw \.D2T2 \*\+b14\(44\),b4
+10000078:[ \t]*0280086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b5
+1000007c:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+10000080:[ \t]*0300066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b6
+10000084:[ \t]*020003a8[ \t]*mvk \.S1 7,a4
+10000088:[ \t]*02000068[ \t]*mvkh \.S1 0,a4
+1000008c:[ \t]*02800328[ \t]*mvk \.S1 6,a5
+10000090:[ \t]*02800068[ \t]*mvkh \.S1 0,a5
+[ \t]*\.\.\.
Index: ld/testsuite/ld-tic6x/shlib-app-1b.od
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1b.od
diff -N ld/testsuite/ld-tic6x/shlib-app-1b.od
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1b.od	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,13 @@
+
+tmpdir/shlib-dynapp-1b:     file format elf32-tic6x-be
+
+DYNAMIC RELOCATION RECORDS
+OFFSET   TYPE              VALUE 
+100000b8 R_C6000_ABS32     b
+100000bc R_C6000_ABS32     a
+100000c4 R_C6000_ABS32     g1
+100000c8 R_C6000_ABS32     g2
+100000cc R_C6000_COPY      a
+100000b4 R_C6000_JUMP_SLOT  sub0
+
+
Index: ld/testsuite/ld-tic6x/shlib-app-1b.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1b.rd
diff -N ld/testsuite/ld-tic6x/shlib-app-1b.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1b.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,127 @@
+There are 18 section headers, starting at offset 0x2168:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 000044 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          00008044 001044 0000c0 10   A  3   6  4
+  \[ 3\] \.dynstr           STRTAB          00008104 001104 000036 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            0000813c 00113c 000018 0c   A  2  11  4
+  \[ 5\] \.rela\.neardata    RELA            00008154 001154 000018 0c   A  2  12  4
+  \[ 6\] \.rela\.bss         RELA            0000816c 00116c 00000c 0c   A  2  13  4
+  \[ 7\] \.dynamic          DYNAMIC         00008178 001178 0000b8 08  WA  3   0  4
+  \[ 8\] \.rela\.plt         RELA            10000000 002000 00000c 0c   A  2   9  4
+  \[ 9\] \.plt              PROGBITS        10000020 002020 000040 18  AX  0   0 32
+  \[10\] \.text             PROGBITS        10000060 002060 000040 00  AX  0   0 32
+  \[11\] \.got              PROGBITS        100000a0 0020a0 000020 00  WA  0   0  4
+  \[12\] \.neardata         PROGBITS        100000c0 0020c0 00000c 00  WA  0   0  4
+  \[13\] \.bss              NOBITS          100000cc 0020cc 000004 00  WA  0   0  4
+  \[14\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 0020cc 000019 00      0   0  1
+  \[15\] \.shstrtab         STRTAB          00000000 0020e5 000080 00      0   0  1
+  \[16\] \.symtab           SYMTAB          00000000 002438 0001a0 10     17  20  4
+  \[17\] \.strtab           STRTAB          00000000 0025d8 000055 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x10000060
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x00230 0x00230 RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x000cc 0x000d0 RWE 0x1000
+  DYNAMIC        0x001178 0x00008178 0x00008178 0x000b8 0x000b8 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.neardata \.rela\.bss \.dynamic 
+   01     \.rela\.plt \.plt \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x1178 contains 18 entries:
+  Tag        Type                         Name/Value
+ 0x00000001 \(NEEDED\)                     Shared library: \[tmpdir/libtestb\.so\]
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x8104
+ 0x00000006 \(SYMTAB\)                     0x8044
+ 0x0000000a \(STRSZ\)                      54 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x00000015 \(DEBUG\)                      0x0
+ 0x70000000 \(C6000_DSBT_BASE\)            0x100000a0
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x0
+ 0x00000003 \(PLTGOT\)                     0x100000ac
+ 0x00000002 \(PLTRELSZ\)                   12 \(bytes\)
+ 0x00000014 \(PLTREL\)                     RELA
+ 0x00000017 \(JMPREL\)                     0x10000000
+ 0x00000007 \(RELA\)                       0x813c
+ 0x00000008 \(RELASZ\)                     72 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x113c contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000b8  00000701 R_C6000_ABS32          100000c0   b \+ 0
+100000bc  00000b01 R_C6000_ABS32          100000cc   a \+ 0
+
+Relocation section '\.rela\.neardata' at offset 0x1154 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000c4  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+100000c8  00000901 R_C6000_ABS32          00000000   g2 \+ 0
+
+Relocation section '\.rela\.bss' at offset 0x116c contains 1 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000cc  00000b1a R_C6000_COPY           100000cc   a \+ 0
+
+Relocation section '\.rela\.plt' at offset 0x2000 contains 1 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000b4  00000a1b R_C6000_JUMP_SLOT      00000000   sub0 \+ 0
+
+Symbol table '\.dynsym' contains 12 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000020     0 SECTION LOCAL  DEFAULT    9 
+     2: 10000060     0 SECTION LOCAL  DEFAULT   10 
+     3: 100000a0     0 SECTION LOCAL  DEFAULT   11 
+     4: 100000c0     0 SECTION LOCAL  DEFAULT   12 
+     5: 100000cc     0 SECTION LOCAL  DEFAULT   13 
+     6: 100000a0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 100000c0     4 OBJECT  GLOBAL DEFAULT   12 b
+     8: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+     9: 00000000     0 OBJECT  WEAK   DEFAULT  UND g2
+    10: 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
+    11: 100000cc     4 OBJECT  GLOBAL DEFAULT   13 a
+
+Symbol table '\.symtab' contains 26 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 00008044     0 SECTION LOCAL  DEFAULT    2 
+     3: 00008104     0 SECTION LOCAL  DEFAULT    3 
+     4: 0000813c     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008154     0 SECTION LOCAL  DEFAULT    5 
+     6: 0000816c     0 SECTION LOCAL  DEFAULT    6 
+     7: 00008178     0 SECTION LOCAL  DEFAULT    7 
+     8: 10000000     0 SECTION LOCAL  DEFAULT    8 
+     9: 10000020     0 SECTION LOCAL  DEFAULT    9 
+    10: 10000060     0 SECTION LOCAL  DEFAULT   10 
+    11: 100000a0     0 SECTION LOCAL  DEFAULT   11 
+    12: 100000c0     0 SECTION LOCAL  DEFAULT   12 
+    13: 100000cc     0 SECTION LOCAL  DEFAULT   13 
+    14: 00000000     0 SECTION LOCAL  DEFAULT   14 
+    15: 10000060     0 NOTYPE  LOCAL  DEFAULT   10 fish
+    16: 100000c4     8 OBJECT  LOCAL  DEFAULT   12 w
+    17: 00008178     0 OBJECT  LOCAL  DEFAULT    7 _DYNAMIC
+    18: 100000ac     0 OBJECT  LOCAL  DEFAULT   11 _GLOBAL_OFFSET_TABLE_
+    19: 100000a0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    20: 100000c0     4 OBJECT  GLOBAL DEFAULT   12 b
+    21: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    22: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+    23: 00000000     0 OBJECT  WEAK   DEFAULT  UND g2
+    24: 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
+    25: 100000cc     4 OBJECT  GLOBAL DEFAULT   13 a
Index: ld/testsuite/ld-tic6x/shlib-app-1b.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1b.sd
diff -N ld/testsuite/ld-tic6x/shlib-app-1b.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1b.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,6 @@
+
+tmpdir/shlib-dynapp-1b:     file format elf32-tic6x-be
+
+Contents of section \.got:
+[ \t]*100000a0 00000000 00000000 00000000 00000000 .*
+[ \t]*100000b0 00000000 10000020 00000000 00000000 .*
Index: ld/testsuite/ld-tic6x/shlib-app-1r.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1r.dd
diff -N ld/testsuite/ld-tic6x/shlib-app-1r.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1r.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,36 @@
+
+tmpdir/shlib-dynapp-1r:     file format elf32-tic6x-le
+
+
+Disassembly of section \.plt:
+
+10000020 <sub0@plt-0x18>:
+10000020:[ \t]*0100036e[ \t]*ldw \.D2T2 \*\+b14\(12\),b2
+10000024:[ \t]*0080046e[ \t]*ldw \.D2T2 \*\+b14\(16\),b1
+10000028:[ \t]*00004000[ \t]*nop 3
+1000002c:[ \t]*00080362[ \t]*b \.S2 b2
+10000030:[ \t]*00008000[ \t]*nop 5
+10000034:[ \t]*00000000[ \t]*nop 1
+
+10000038 <sub0@plt>:
+10000038:[ \t]*0100056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b2
+1000003c:[ \t]*0000002a[ \t]*mvk \.S2 0,b0
+10000040:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+10000044:[ \t]*00002000[ \t]*nop 2
+10000048:[ \t]*00080362[ \t]*b \.S2 b2
+1000004c:[ \t]*00008000[ \t]*nop 5
+[ \t]*\.\.\.
+
+Disassembly of section \.text:
+
+10000060 <fish>:
+10000060:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000064:[ \t]*1ffffb12[ \t]*callp \.S2 10000038 <sub0@plt>,b3
+10000068:[ \t]*0ffffb12[ \t]*b \.S2 10000038 <sub0@plt>
+1000006c:[ \t]*10000012[ \t]*callp \.S2 10000060 <fish>,b3
+10000070:[ \t]*00000012[ \t]*b \.S2 10000060 <fish>
+10000074:[ \t]*0200096e[ \t]*ldw \.D2T2 \*\+b14\(36\),b4
+10000078:[ \t]*0280086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b5
+1000007c:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+10000080:[ \t]*0300066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b6
+[ \t]*\.\.\.
Index: ld/testsuite/ld-tic6x/shlib-app-1r.od
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1r.od
diff -N ld/testsuite/ld-tic6x/shlib-app-1r.od
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1r.od	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,11 @@
+
+tmpdir/shlib-dynapp-1r:     file format elf32-tic6x-le
+
+DYNAMIC RELOCATION RECORDS
+OFFSET   TYPE              VALUE 
+100000b8 R_C6000_ABS32     b
+100000bc R_C6000_ABS32     a
+100000c4 R_C6000_COPY      a
+100000b4 R_C6000_JUMP_SLOT  sub0
+
+
Index: ld/testsuite/ld-tic6x/shlib-app-1r.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1r.rd
diff -N ld/testsuite/ld-tic6x/shlib-app-1r.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1r.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,115 @@
+There are 17 section headers, starting at offset 0x2158:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 00003c 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          0000803c 00103c 0000a0 10   A  3   6  4
+  \[ 3\] \.dynstr           STRTAB          000080dc 0010dc 000030 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            0000810c 00110c 000018 0c   A  2  10  4
+  \[ 5\] \.rela\.bss         RELA            00008124 001124 00000c 0c   A  2  12  4
+  \[ 6\] \.dynamic          DYNAMIC         00008130 001130 0000b8 08  WA  3   0  4
+  \[ 7\] \.rela\.plt         RELA            10000000 002000 00000c 0c   A  2   8  4
+  \[ 8\] \.plt              PROGBITS        10000020 002020 000040 18  AX  0   0 32
+  \[ 9\] \.text             PROGBITS        10000060 002060 000040 00  AX  0   0 32
+  \[10\] \.got              PROGBITS        100000a0 0020a0 000020 00  WA  0   0  4
+  \[11\] \.neardata         PROGBITS        100000c0 0020c0 000004 00  WA  0   0  4
+  \[12\] \.bss              NOBITS          100000c4 0020c4 000004 00  WA  0   0  4
+  \[13\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 0020c4 000019 00      0   0  1
+  \[14\] \.shstrtab         STRTAB          00000000 0020dd 00007b 00      0   0  1
+  \[15\] \.symtab           SYMTAB          00000000 002400 000160 10     16  18  4
+  \[16\] \.strtab           STRTAB          00000000 002560 00004d 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x10000060
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x001e8 0x001e8 RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x000c4 0x000c8 RWE 0x1000
+  DYNAMIC        0x001130 0x00008130 0x00008130 0x000b8 0x000b8 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.bss \.dynamic 
+   01     \.rela\.plt \.plt \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x1130 contains 18 entries:
+  Tag        Type                         Name/Value
+ 0x00000001 \(NEEDED\)                     Shared library: \[tmpdir/libtestr\.so\]
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x80dc
+ 0x00000006 \(SYMTAB\)                     0x803c
+ 0x0000000a \(STRSZ\)                      48 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x00000015 \(DEBUG\)                      0x0
+ 0x70000000 \(C6000_DSBT_BASE\)            0x100000a0
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x0
+ 0x00000003 \(PLTGOT\)                     0x100000ac
+ 0x00000002 \(PLTRELSZ\)                   12 \(bytes\)
+ 0x00000014 \(PLTREL\)                     RELA
+ 0x00000017 \(JMPREL\)                     0x10000000
+ 0x00000007 \(RELA\)                       0x810c
+ 0x00000008 \(RELASZ\)                     48 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x110c contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000b8  00000701 R_C6000_ABS32          100000c0   b \+ 0
+100000bc  00000901 R_C6000_ABS32          100000c4   a \+ 0
+
+Relocation section '\.rela\.bss' at offset 0x1124 contains 1 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000c4  0000091a R_C6000_COPY           100000c4   a \+ 0
+
+Relocation section '\.rela\.plt' at offset 0x2000 contains 1 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000b4  0000081b R_C6000_JUMP_SLOT      00000000   sub0 \+ 0
+
+Symbol table '\.dynsym' contains 10 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     2: 10000060     0 SECTION LOCAL  DEFAULT    9 
+     3: 100000a0     0 SECTION LOCAL  DEFAULT   10 
+     4: 100000c0     0 SECTION LOCAL  DEFAULT   11 
+     5: 100000c4     0 SECTION LOCAL  DEFAULT   12 
+     6: 100000a0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 100000c0     4 OBJECT  GLOBAL DEFAULT   11 b
+     8: 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
+     9: 100000c4     4 OBJECT  GLOBAL DEFAULT   12 a
+
+Symbol table '\.symtab' contains 22 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 0000803c     0 SECTION LOCAL  DEFAULT    2 
+     3: 000080dc     0 SECTION LOCAL  DEFAULT    3 
+     4: 0000810c     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008124     0 SECTION LOCAL  DEFAULT    5 
+     6: 00008130     0 SECTION LOCAL  DEFAULT    6 
+     7: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     8: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     9: 10000060     0 SECTION LOCAL  DEFAULT    9 
+    10: 100000a0     0 SECTION LOCAL  DEFAULT   10 
+    11: 100000c0     0 SECTION LOCAL  DEFAULT   11 
+    12: 100000c4     0 SECTION LOCAL  DEFAULT   12 
+    13: 00000000     0 SECTION LOCAL  DEFAULT   13 
+    14: 10000060     0 NOTYPE  LOCAL  DEFAULT    9 fish
+    15: 00008130     0 OBJECT  LOCAL  DEFAULT    6 _DYNAMIC
+    16: 100000ac     0 OBJECT  LOCAL  DEFAULT   10 _GLOBAL_OFFSET_TABLE_
+    17: 100000a0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    18: 100000c0     4 OBJECT  GLOBAL DEFAULT   11 b
+    19: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    20: 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
+    21: 100000c4     4 OBJECT  GLOBAL DEFAULT   12 a
Index: ld/testsuite/ld-tic6x/shlib-app-1r.s
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1r.s
diff -N ld/testsuite/ld-tic6x/shlib-app-1r.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1r.s	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,19 @@
+	.global a
+.text
+fish:
+	ldw .d2t2 *+B14($DSBT_index(__c6xabi_DSBT_BASE)), B14
+	callp .s2 sub0, B3
+	b .s2 sub0
+	callp .s2 fish, B3
+	b .s2 fish
+	ldw .d2t2 *+B14(a), B4
+	ldw .d2t2 *+B14(b), B5
+	ldw .d2t2 *+B14($GOT(a)), B6
+	ldw .d2t2 *+B14($GOT(b)), B6
+	.global	b
+	.section	.neardata,"aw",@progbits
+	.align	2
+	.type	b, @object
+	.size	b, 4
+b:
+	.long	0x12345678
Index: ld/testsuite/ld-tic6x/shlib-app-1r.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1r.sd
diff -N ld/testsuite/ld-tic6x/shlib-app-1r.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1r.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,6 @@
+
+tmpdir/shlib-dynapp-1r:     file format elf32-tic6x-le
+
+Contents of section \.got:
+[ \t]*100000a0 00000000 00000000 00000000 00000000 .*
+[ \t]*100000b0 00000000 20000010 00000000 00000000 .*
Index: ld/testsuite/ld-tic6x/shlib-app-1rb.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1rb.dd
diff -N ld/testsuite/ld-tic6x/shlib-app-1rb.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1rb.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,36 @@
+
+tmpdir/shlib-dynapp-1rb:     file format elf32-tic6x-be
+
+
+Disassembly of section \.plt:
+
+10000020 <sub0@plt-0x18>:
+10000020:[ \t]*0100036e[ \t]*ldw \.D2T2 \*\+b14\(12\),b2
+10000024:[ \t]*0080046e[ \t]*ldw \.D2T2 \*\+b14\(16\),b1
+10000028:[ \t]*00004000[ \t]*nop 3
+1000002c:[ \t]*00080362[ \t]*b \.S2 b2
+10000030:[ \t]*00008000[ \t]*nop 5
+10000034:[ \t]*00000000[ \t]*nop 1
+
+10000038 <sub0@plt>:
+10000038:[ \t]*0100056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b2
+1000003c:[ \t]*0000002a[ \t]*mvk \.S2 0,b0
+10000040:[ \t]*0000006a[ \t]*mvkh \.S2 0,b0
+10000044:[ \t]*00002000[ \t]*nop 2
+10000048:[ \t]*00080362[ \t]*b \.S2 b2
+1000004c:[ \t]*00008000[ \t]*nop 5
+[ \t]*\.\.\.
+
+Disassembly of section \.text:
+
+10000060 <fish>:
+10000060:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000064:[ \t]*1ffffb12[ \t]*callp \.S2 10000038 <sub0@plt>,b3
+10000068:[ \t]*0ffffb12[ \t]*b \.S2 10000038 <sub0@plt>
+1000006c:[ \t]*10000012[ \t]*callp \.S2 10000060 <fish>,b3
+10000070:[ \t]*00000012[ \t]*b \.S2 10000060 <fish>
+10000074:[ \t]*0200096e[ \t]*ldw \.D2T2 \*\+b14\(36\),b4
+10000078:[ \t]*0280086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b5
+1000007c:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+10000080:[ \t]*0300066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b6
+[ \t]*\.\.\.
Index: ld/testsuite/ld-tic6x/shlib-app-1rb.od
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1rb.od
diff -N ld/testsuite/ld-tic6x/shlib-app-1rb.od
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1rb.od	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,11 @@
+
+tmpdir/shlib-dynapp-1rb:     file format elf32-tic6x-be
+
+DYNAMIC RELOCATION RECORDS
+OFFSET   TYPE              VALUE 
+100000b8 R_C6000_ABS32     b
+100000bc R_C6000_ABS32     a
+100000c4 R_C6000_COPY      a
+100000b4 R_C6000_JUMP_SLOT  sub0
+
+
Index: ld/testsuite/ld-tic6x/shlib-app-1rb.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1rb.rd
diff -N ld/testsuite/ld-tic6x/shlib-app-1rb.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1rb.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,115 @@
+There are 17 section headers, starting at offset 0x2158:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 00003c 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          0000803c 00103c 0000a0 10   A  3   6  4
+  \[ 3\] \.dynstr           STRTAB          000080dc 0010dc 000031 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            00008110 001110 000018 0c   A  2  10  4
+  \[ 5\] \.rela\.bss         RELA            00008128 001128 00000c 0c   A  2  12  4
+  \[ 6\] \.dynamic          DYNAMIC         00008134 001134 0000b8 08  WA  3   0  4
+  \[ 7\] \.rela\.plt         RELA            10000000 002000 00000c 0c   A  2   8  4
+  \[ 8\] \.plt              PROGBITS        10000020 002020 000040 18  AX  0   0 32
+  \[ 9\] \.text             PROGBITS        10000060 002060 000040 00  AX  0   0 32
+  \[10\] \.got              PROGBITS        100000a0 0020a0 000020 00  WA  0   0  4
+  \[11\] \.neardata         PROGBITS        100000c0 0020c0 000004 00  WA  0   0  4
+  \[12\] \.bss              NOBITS          100000c4 0020c4 000004 00  WA  0   0  4
+  \[13\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 0020c4 000019 00      0   0  1
+  \[14\] \.shstrtab         STRTAB          00000000 0020dd 00007b 00      0   0  1
+  \[15\] \.symtab           SYMTAB          00000000 002400 000160 10     16  18  4
+  \[16\] \.strtab           STRTAB          00000000 002560 00004d 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x10000060
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x001ec 0x001ec RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x000c4 0x000c8 RWE 0x1000
+  DYNAMIC        0x001134 0x00008134 0x00008134 0x000b8 0x000b8 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.bss \.dynamic 
+   01     \.rela\.plt \.plt \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x1134 contains 18 entries:
+  Tag        Type                         Name/Value
+ 0x00000001 \(NEEDED\)                     Shared library: \[tmpdir/libtestrb\.so\]
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x80dc
+ 0x00000006 \(SYMTAB\)                     0x803c
+ 0x0000000a \(STRSZ\)                      49 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x00000015 \(DEBUG\)                      0x0
+ 0x70000000 \(C6000_DSBT_BASE\)            0x100000a0
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x0
+ 0x00000003 \(PLTGOT\)                     0x100000ac
+ 0x00000002 \(PLTRELSZ\)                   12 \(bytes\)
+ 0x00000014 \(PLTREL\)                     RELA
+ 0x00000017 \(JMPREL\)                     0x10000000
+ 0x00000007 \(RELA\)                       0x8110
+ 0x00000008 \(RELASZ\)                     48 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x1110 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000b8  00000701 R_C6000_ABS32          100000c0   b \+ 0
+100000bc  00000901 R_C6000_ABS32          100000c4   a \+ 0
+
+Relocation section '\.rela\.bss' at offset 0x1128 contains 1 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000c4  0000091a R_C6000_COPY           100000c4   a \+ 0
+
+Relocation section '\.rela\.plt' at offset 0x2000 contains 1 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000b4  0000081b R_C6000_JUMP_SLOT      00000000   sub0 \+ 0
+
+Symbol table '\.dynsym' contains 10 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     2: 10000060     0 SECTION LOCAL  DEFAULT    9 
+     3: 100000a0     0 SECTION LOCAL  DEFAULT   10 
+     4: 100000c0     0 SECTION LOCAL  DEFAULT   11 
+     5: 100000c4     0 SECTION LOCAL  DEFAULT   12 
+     6: 100000a0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 100000c0     4 OBJECT  GLOBAL DEFAULT   11 b
+     8: 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
+     9: 100000c4     4 OBJECT  GLOBAL DEFAULT   12 a
+
+Symbol table '\.symtab' contains 22 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 0000803c     0 SECTION LOCAL  DEFAULT    2 
+     3: 000080dc     0 SECTION LOCAL  DEFAULT    3 
+     4: 00008110     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008128     0 SECTION LOCAL  DEFAULT    5 
+     6: 00008134     0 SECTION LOCAL  DEFAULT    6 
+     7: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     8: 10000020     0 SECTION LOCAL  DEFAULT    8 
+     9: 10000060     0 SECTION LOCAL  DEFAULT    9 
+    10: 100000a0     0 SECTION LOCAL  DEFAULT   10 
+    11: 100000c0     0 SECTION LOCAL  DEFAULT   11 
+    12: 100000c4     0 SECTION LOCAL  DEFAULT   12 
+    13: 00000000     0 SECTION LOCAL  DEFAULT   13 
+    14: 10000060     0 NOTYPE  LOCAL  DEFAULT    9 fish
+    15: 00008134     0 OBJECT  LOCAL  DEFAULT    6 _DYNAMIC
+    16: 100000ac     0 OBJECT  LOCAL  DEFAULT   10 _GLOBAL_OFFSET_TABLE_
+    17: 100000a0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    18: 100000c0     4 OBJECT  GLOBAL DEFAULT   11 b
+    19: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    20: 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
+    21: 100000c4     4 OBJECT  GLOBAL DEFAULT   12 a
Index: ld/testsuite/ld-tic6x/shlib-app-1rb.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/shlib-app-1rb.sd
diff -N ld/testsuite/ld-tic6x/shlib-app-1rb.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/shlib-app-1rb.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,6 @@
+
+tmpdir/shlib-dynapp-1rb:     file format elf32-tic6x-be
+
+Contents of section \.got:
+[ \t]*100000a0 00000000 00000000 00000000 00000000 .*
+[ \t]*100000b0 00000000 10000020 00000000 00000000 .*
Index: ld/testsuite/ld-tic6x/static-app-1.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1.dd
diff -N ld/testsuite/ld-tic6x/static-app-1.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,56 @@
+
+tmpdir/static-app-1:     file format elf32-tic6x-le
+
+
+Disassembly of section \.text:
+
+10000000 <sub1>:
+10000000:[ \t]*000c0362[ \t]*b \.S2 b3
+10000004:[ \t]*00008000[ \t]*nop 5
+
+10000008 <sub0>:
+10000008:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+1000000c:[ \t]*01bc62f6[ \t]*stw \.D2T2 b3,\*\+b15\(12\)
+10000010:[ \t]*073c82f6[ \t]*stw \.D2T2 b14,\*\+b15\(16\)
+10000014:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000018:[ \t]*00000812[ \t]*b \.S2 10000040 <sub>
+1000001c:[ \t]*00000112[ \t]*b \.S2 10000008 <sub0>
+10000020:[ \t]*0ffffc12[ \t]*b \.S2 10000000 <sub1>
+10000024:[ \t]*01bc62e6[ \t]*ldw \.D2T2 \*\+b15\(12\),b3
+10000028:[ \t]*073c82e6[ \t]*ldw \.D2T2 \*\+b15\(16\),b14
+1000002c:[ \t]*07800852[ \t]*addk \.S2 16,b15
+10000030:[ \t]*00004000[ \t]*nop 3
+10000034:[ \t]*000c0362[ \t]*b \.S2 b3
+10000038:[ \t]*00008000[ \t]*nop 5
+1000003c:[ \t]*00000000[ \t]*nop 1
+
+10000040 <sub>:
+10000040:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+10000044:[ \t]*023c62f4[ \t]*stw \.D2T1 a4,\*\+b15\(12\)
+10000048:[ \t]*003c62e4[ \t]*ldw \.D2T1 \*\+b15\(12\),a0
+1000004c:[ \t]*00006000[ \t]*nop 4
+10000050:[ \t]*00014940[ \t]*add \.D1 a0,10,a0
+10000054:[ \t]*020008f0[ \t]*or \.D1 0,a0,a4
+10000058:[ \t]*07be0942[ \t]*add \.D2 b15,16,b15
+1000005c:[ \t]*000c0362[ \t]*b \.S2 b3
+10000060:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+10000064:[ \t]*0380056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b7
+10000068:[ \t]*0400066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b8
+1000006c:[ \t]*04800d6e[ \t]*ldw \.D2T2 \*\+b14\(52\),b9
+[ \t]*\.\.\.
+
+10000080 <fish>:
+10000080:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000084:[ \t]*1ffff112[ \t]*callp \.S2 10000008 <sub0>,b3
+10000088:[ \t]*0ffff112[ \t]*b \.S2 10000008 <sub0>
+1000008c:[ \t]*10000012[ \t]*callp \.S2 10000080 <fish>,b3
+10000090:[ \t]*00000012[ \t]*b \.S2 10000080 <fish>
+10000094:[ \t]*0200086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b4
+10000098:[ \t]*02800a6e[ \t]*ldw \.D2T2 \*\+b14\(40\),b5
+1000009c:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+100000a0:[ \t]*0300056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b6
+100000a4:[ \t]*020003a8[ \t]*mvk \.S1 7,a4
+100000a8:[ \t]*02000068[ \t]*mvkh \.S1 0,a4
+100000ac:[ \t]*028002a8[ \t]*mvk \.S1 5,a5
+100000b0:[ \t]*02800068[ \t]*mvkh \.S1 0,a5
+[ \t]*\.\.\.
Index: ld/testsuite/ld-tic6x/static-app-1.od
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1.od
diff -N ld/testsuite/ld-tic6x/static-app-1.od
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1.od	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,14 @@
+
+tmpdir/static-app-1:     file format elf32-tic6x-le
+
+DYNAMIC RELOCATION RECORDS
+OFFSET   TYPE              VALUE 
+100000d8 R_C6000_ABS32     \.bss
+100000d4 R_C6000_ABS32     b
+100000dc R_C6000_ABS32     a
+100000e0 R_C6000_ABS32     \.text\+0x00000008
+100000e4 R_C6000_ABS32     g1
+100000ec R_C6000_ABS32     g1
+100000f0 R_C6000_ABS32     \.neardata\+0x00000004
+
+
Index: ld/testsuite/ld-tic6x/static-app-1.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1.rd
diff -N ld/testsuite/ld-tic6x/static-app-1.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,112 @@
+There are 15 section headers, starting at offset 0x2180:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 00003c 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          0000803c 00103c 0000a0 10   A  3   5  4
+  \[ 3\] \.dynstr           STRTAB          000080dc 0010dc 00001d 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            000080fc 0010fc 000024 0c   A  2   8  4
+  \[ 5\] \.rela\.neardata    RELA            00008120 001120 000030 0c   A  2   9  4
+  \[ 6\] \.dynamic          DYNAMIC         00008150 001150 000090 08  WA  3   0  4
+  \[ 7\] \.text             PROGBITS        10000000 002000 0000c0 00  AX  0   0 32
+  \[ 8\] \.got              PROGBITS        100000c0 0020c0 000020 00  WA  0   0  4
+  \[ 9\] \.neardata         PROGBITS        100000e0 0020e0 000014 00  WA  0   0  4
+  \[10\] \.bss              NOBITS          100000f4 0020f4 000004 00  WA  0   0  4
+  \[11\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 0020f4 000019 00      0   0  1
+  \[12\] \.shstrtab         STRTAB          00000000 00210d 000071 00      0   0  1
+  \[13\] \.symtab           SYMTAB          00000000 0023d8 0001a0 10     14  19  4
+  \[14\] \.strtab           STRTAB          00000000 002578 000060 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x10000000
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x001e0 0x001e0 RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x000f4 0x000f8 RWE 0x1000
+  DYNAMIC        0x001150 0x00008150 0x00008150 0x00090 0x00090 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.neardata \.dynamic 
+   01     \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x1150 contains 13 entries:
+  Tag        Type                         Name/Value
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x80dc
+ 0x00000006 \(SYMTAB\)                     0x803c
+ 0x0000000a \(STRSZ\)                      29 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x00000015 \(DEBUG\)                      0x0
+ 0x70000000 \(C6000_DSBT_BASE\)            0x100000c0
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x0
+ 0x00000007 \(RELA\)                       0x80fc
+ 0x00000008 \(RELASZ\)                     84 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x10fc contains 3 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000d8  00000401 R_C6000_ABS32          100000f4   \.bss \+ 0
+100000d4  00000701 R_C6000_ABS32          100000e8   b \+ 0
+100000dc  00000901 R_C6000_ABS32          100000e0   a \+ 0
+
+Relocation section '\.rela\.neardata' at offset 0x1120 contains 4 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000e0  00000101 R_C6000_ABS32          10000000   \.text \+ 8
+100000e4  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+100000ec  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+100000f0  00000301 R_C6000_ABS32          100000e0   \.neardata \+ 4
+
+Symbol table '\.dynsym' contains 10 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     2: 100000c0     0 SECTION LOCAL  DEFAULT    8 
+     3: 100000e0     0 SECTION LOCAL  DEFAULT    9 
+     4: 100000f4     0 SECTION LOCAL  DEFAULT   10 
+     5: 100000f4     4 NOTYPE  LOCAL  DEFAULT   10 c
+     6: 100000c0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
+     8: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+     9: 100000e0     4 OBJECT  GLOBAL DEFAULT    9 a
+
+Symbol table '\.symtab' contains 26 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 0000803c     0 SECTION LOCAL  DEFAULT    2 
+     3: 000080dc     0 SECTION LOCAL  DEFAULT    3 
+     4: 000080fc     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008120     0 SECTION LOCAL  DEFAULT    5 
+     6: 00008150     0 SECTION LOCAL  DEFAULT    6 
+     7: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     8: 100000c0     0 SECTION LOCAL  DEFAULT    8 
+     9: 100000e0     0 SECTION LOCAL  DEFAULT    9 
+    10: 100000f4     0 SECTION LOCAL  DEFAULT   10 
+    11: 00000000     0 SECTION LOCAL  DEFAULT   11 
+    12: 10000000     0 FUNC    LOCAL  HIDDEN     7 sub1
+    13: 10000080     0 NOTYPE  LOCAL  DEFAULT    7 fish
+    14: 100000ec     8 OBJECT  LOCAL  DEFAULT    9 w
+    15: 00008150     0 OBJECT  LOCAL  DEFAULT    6 _DYNAMIC
+    16: 100000f4     4 NOTYPE  LOCAL  DEFAULT   10 c
+    17: 100000cc     0 OBJECT  LOCAL  DEFAULT    8 _GLOBAL_OFFSET_TABLE_
+    18: 100000c0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    19: 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
+    20: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    21: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+    22: 100000e4     4 OBJECT  GLOBAL DEFAULT    9 g2
+    23: 10000008    52 FUNC    GLOBAL DEFAULT    7 sub0
+    24: 100000e0     4 OBJECT  GLOBAL DEFAULT    9 a
+    25: 10000040    52 FUNC    GLOBAL DEFAULT    7 sub
Index: ld/testsuite/ld-tic6x/static-app-1.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1.sd
diff -N ld/testsuite/ld-tic6x/static-app-1.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,6 @@
+
+tmpdir/static-app-1:     file format elf32-tic6x-le
+
+Contents of section \.got:
+[ \t]*100000c0 00000000 00000000 00000000 00000000 .*
+[ \t]*100000d0 00000000 00000000 f4000010 00000000 .*
Index: ld/testsuite/ld-tic6x/static-app-1b.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1b.dd
diff -N ld/testsuite/ld-tic6x/static-app-1b.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1b.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,56 @@
+
+tmpdir/static-app-1b:     file format elf32-tic6x-be
+
+
+Disassembly of section \.text:
+
+10000000 <sub1>:
+10000000:[ \t]*000c0362[ \t]*b \.S2 b3
+10000004:[ \t]*00008000[ \t]*nop 5
+
+10000008 <sub0>:
+10000008:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+1000000c:[ \t]*01bc62f6[ \t]*stw \.D2T2 b3,\*\+b15\(12\)
+10000010:[ \t]*073c82f6[ \t]*stw \.D2T2 b14,\*\+b15\(16\)
+10000014:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000018:[ \t]*00000812[ \t]*b \.S2 10000040 <sub>
+1000001c:[ \t]*00000112[ \t]*b \.S2 10000008 <sub0>
+10000020:[ \t]*0ffffc12[ \t]*b \.S2 10000000 <sub1>
+10000024:[ \t]*01bc62e6[ \t]*ldw \.D2T2 \*\+b15\(12\),b3
+10000028:[ \t]*073c82e6[ \t]*ldw \.D2T2 \*\+b15\(16\),b14
+1000002c:[ \t]*07800852[ \t]*addk \.S2 16,b15
+10000030:[ \t]*00004000[ \t]*nop 3
+10000034:[ \t]*000c0362[ \t]*b \.S2 b3
+10000038:[ \t]*00008000[ \t]*nop 5
+1000003c:[ \t]*00000000[ \t]*nop 1
+
+10000040 <sub>:
+10000040:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+10000044:[ \t]*023c62f4[ \t]*stw \.D2T1 a4,\*\+b15\(12\)
+10000048:[ \t]*003c62e4[ \t]*ldw \.D2T1 \*\+b15\(12\),a0
+1000004c:[ \t]*00006000[ \t]*nop 4
+10000050:[ \t]*00014940[ \t]*add \.D1 a0,10,a0
+10000054:[ \t]*020008f0[ \t]*or \.D1 0,a0,a4
+10000058:[ \t]*07be0942[ \t]*add \.D2 b15,16,b15
+1000005c:[ \t]*000c0362[ \t]*b \.S2 b3
+10000060:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+10000064:[ \t]*0380056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b7
+10000068:[ \t]*0400066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b8
+1000006c:[ \t]*04800d6e[ \t]*ldw \.D2T2 \*\+b14\(52\),b9
+[ \t]*\.\.\.
+
+10000080 <fish>:
+10000080:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000084:[ \t]*1ffff112[ \t]*callp \.S2 10000008 <sub0>,b3
+10000088:[ \t]*0ffff112[ \t]*b \.S2 10000008 <sub0>
+1000008c:[ \t]*10000012[ \t]*callp \.S2 10000080 <fish>,b3
+10000090:[ \t]*00000012[ \t]*b \.S2 10000080 <fish>
+10000094:[ \t]*0200086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b4
+10000098:[ \t]*02800a6e[ \t]*ldw \.D2T2 \*\+b14\(40\),b5
+1000009c:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+100000a0:[ \t]*0300056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b6
+100000a4:[ \t]*020003a8[ \t]*mvk \.S1 7,a4
+100000a8:[ \t]*02000068[ \t]*mvkh \.S1 0,a4
+100000ac:[ \t]*028002a8[ \t]*mvk \.S1 5,a5
+100000b0:[ \t]*02800068[ \t]*mvkh \.S1 0,a5
+[ \t]*\.\.\.
Index: ld/testsuite/ld-tic6x/static-app-1b.od
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1b.od
diff -N ld/testsuite/ld-tic6x/static-app-1b.od
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1b.od	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,14 @@
+
+tmpdir/static-app-1b:     file format elf32-tic6x-be
+
+DYNAMIC RELOCATION RECORDS
+OFFSET   TYPE              VALUE 
+100000d8 R_C6000_ABS32     \.bss
+100000d4 R_C6000_ABS32     b
+100000dc R_C6000_ABS32     a
+100000e0 R_C6000_ABS32     \.text\+0x00000008
+100000e4 R_C6000_ABS32     g1
+100000ec R_C6000_ABS32     g1
+100000f0 R_C6000_ABS32     \.neardata\+0x00000004
+
+
Index: ld/testsuite/ld-tic6x/static-app-1b.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1b.rd
diff -N ld/testsuite/ld-tic6x/static-app-1b.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1b.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,112 @@
+There are 15 section headers, starting at offset 0x2180:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 00003c 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          0000803c 00103c 0000a0 10   A  3   5  4
+  \[ 3\] \.dynstr           STRTAB          000080dc 0010dc 00001d 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            000080fc 0010fc 000024 0c   A  2   8  4
+  \[ 5\] \.rela\.neardata    RELA            00008120 001120 000030 0c   A  2   9  4
+  \[ 6\] \.dynamic          DYNAMIC         00008150 001150 000090 08  WA  3   0  4
+  \[ 7\] \.text             PROGBITS        10000000 002000 0000c0 00  AX  0   0 32
+  \[ 8\] \.got              PROGBITS        100000c0 0020c0 000020 00  WA  0   0  4
+  \[ 9\] \.neardata         PROGBITS        100000e0 0020e0 000014 00  WA  0   0  4
+  \[10\] \.bss              NOBITS          100000f4 0020f4 000004 00  WA  0   0  4
+  \[11\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 0020f4 000019 00      0   0  1
+  \[12\] \.shstrtab         STRTAB          00000000 00210d 000071 00      0   0  1
+  \[13\] \.symtab           SYMTAB          00000000 0023d8 0001a0 10     14  19  4
+  \[14\] \.strtab           STRTAB          00000000 002578 000060 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x10000000
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x001e0 0x001e0 RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x000f4 0x000f8 RWE 0x1000
+  DYNAMIC        0x001150 0x00008150 0x00008150 0x00090 0x00090 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.neardata \.dynamic 
+   01     \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x1150 contains 13 entries:
+  Tag        Type                         Name/Value
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x80dc
+ 0x00000006 \(SYMTAB\)                     0x803c
+ 0x0000000a \(STRSZ\)                      29 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x00000015 \(DEBUG\)                      0x0
+ 0x70000000 \(C6000_DSBT_BASE\)            0x100000c0
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x0
+ 0x00000007 \(RELA\)                       0x80fc
+ 0x00000008 \(RELASZ\)                     84 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x10fc contains 3 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000d8  00000401 R_C6000_ABS32          100000f4   \.bss \+ 0
+100000d4  00000701 R_C6000_ABS32          100000e8   b \+ 0
+100000dc  00000901 R_C6000_ABS32          100000e0   a \+ 0
+
+Relocation section '\.rela\.neardata' at offset 0x1120 contains 4 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000e0  00000101 R_C6000_ABS32          10000000   \.text \+ 8
+100000e4  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+100000ec  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+100000f0  00000301 R_C6000_ABS32          100000e0   \.neardata \+ 4
+
+Symbol table '\.dynsym' contains 10 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     2: 100000c0     0 SECTION LOCAL  DEFAULT    8 
+     3: 100000e0     0 SECTION LOCAL  DEFAULT    9 
+     4: 100000f4     0 SECTION LOCAL  DEFAULT   10 
+     5: 100000f4     4 NOTYPE  LOCAL  DEFAULT   10 c
+     6: 100000c0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
+     8: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+     9: 100000e0     4 OBJECT  GLOBAL DEFAULT    9 a
+
+Symbol table '\.symtab' contains 26 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 0000803c     0 SECTION LOCAL  DEFAULT    2 
+     3: 000080dc     0 SECTION LOCAL  DEFAULT    3 
+     4: 000080fc     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008120     0 SECTION LOCAL  DEFAULT    5 
+     6: 00008150     0 SECTION LOCAL  DEFAULT    6 
+     7: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     8: 100000c0     0 SECTION LOCAL  DEFAULT    8 
+     9: 100000e0     0 SECTION LOCAL  DEFAULT    9 
+    10: 100000f4     0 SECTION LOCAL  DEFAULT   10 
+    11: 00000000     0 SECTION LOCAL  DEFAULT   11 
+    12: 10000000     0 FUNC    LOCAL  HIDDEN     7 sub1
+    13: 10000080     0 NOTYPE  LOCAL  DEFAULT    7 fish
+    14: 100000ec     8 OBJECT  LOCAL  DEFAULT    9 w
+    15: 00008150     0 OBJECT  LOCAL  DEFAULT    6 _DYNAMIC
+    16: 100000f4     4 NOTYPE  LOCAL  DEFAULT   10 c
+    17: 100000cc     0 OBJECT  LOCAL  DEFAULT    8 _GLOBAL_OFFSET_TABLE_
+    18: 100000c0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    19: 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
+    20: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    21: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+    22: 100000e4     4 OBJECT  GLOBAL DEFAULT    9 g2
+    23: 10000008    52 FUNC    GLOBAL DEFAULT    7 sub0
+    24: 100000e0     4 OBJECT  GLOBAL DEFAULT    9 a
+    25: 10000040    52 FUNC    GLOBAL DEFAULT    7 sub
Index: ld/testsuite/ld-tic6x/static-app-1b.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1b.sd
diff -N ld/testsuite/ld-tic6x/static-app-1b.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1b.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,6 @@
+
+tmpdir/static-app-1b:     file format elf32-tic6x-be
+
+Contents of section \.got:
+[ \t]*100000c0 00000000 00000000 00000000 00000000 .*
+[ \t]*100000d0 00000000 00000000 100000f4 00000000 .*
Index: ld/testsuite/ld-tic6x/static-app-1r.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1r.dd
diff -N ld/testsuite/ld-tic6x/static-app-1r.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1r.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,52 @@
+
+tmpdir/static-app-1r:     file format elf32-tic6x-le
+
+
+Disassembly of section \.text:
+
+10000000 <sub1>:
+10000000:[ \t]*000c0362[ \t]*b \.S2 b3
+10000004:[ \t]*00008000[ \t]*nop 5
+
+10000008 <sub0>:
+10000008:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+1000000c:[ \t]*01bc62f6[ \t]*stw \.D2T2 b3,\*\+b15\(12\)
+10000010:[ \t]*073c82f6[ \t]*stw \.D2T2 b14,\*\+b15\(16\)
+10000014:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000018:[ \t]*00000812[ \t]*b \.S2 10000040 <sub>
+1000001c:[ \t]*00000112[ \t]*b \.S2 10000008 <sub0>
+10000020:[ \t]*0ffffc12[ \t]*b \.S2 10000000 <sub1>
+10000024:[ \t]*01bc62e6[ \t]*ldw \.D2T2 \*\+b15\(12\),b3
+10000028:[ \t]*073c82e6[ \t]*ldw \.D2T2 \*\+b15\(16\),b14
+1000002c:[ \t]*07800852[ \t]*addk \.S2 16,b15
+10000030:[ \t]*00004000[ \t]*nop 3
+10000034:[ \t]*000c0362[ \t]*b \.S2 b3
+10000038:[ \t]*00008000[ \t]*nop 5
+1000003c:[ \t]*00000000[ \t]*nop 1
+
+10000040 <sub>:
+10000040:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+10000044:[ \t]*023c62f4[ \t]*stw \.D2T1 a4,\*\+b15\(12\)
+10000048:[ \t]*003c62e4[ \t]*ldw \.D2T1 \*\+b15\(12\),a0
+1000004c:[ \t]*00006000[ \t]*nop 4
+10000050:[ \t]*00014940[ \t]*add \.D1 a0,10,a0
+10000054:[ \t]*020008f0[ \t]*or \.D1 0,a0,a4
+10000058:[ \t]*07be0942[ \t]*add \.D2 b15,16,b15
+1000005c:[ \t]*000c0362[ \t]*b \.S2 b3
+10000060:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+10000064:[ \t]*0380056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b7
+10000068:[ \t]*0400066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b8
+1000006c:[ \t]*04800b6e[ \t]*ldw \.D2T2 \*\+b14\(44\),b9
+[ \t]*\.\.\.
+
+10000080 <fish>:
+10000080:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000084:[ \t]*1ffff112[ \t]*callp \.S2 10000008 <sub0>,b3
+10000088:[ \t]*0ffff112[ \t]*b \.S2 10000008 <sub0>
+1000008c:[ \t]*10000012[ \t]*callp \.S2 10000080 <fish>,b3
+10000090:[ \t]*00000012[ \t]*b \.S2 10000080 <fish>
+10000094:[ \t]*0200086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b4
+10000098:[ \t]*02800a6e[ \t]*ldw \.D2T2 \*\+b14\(40\),b5
+1000009c:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+100000a0:[ \t]*0300056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b6
+[ \t]*\.\.\.
Index: ld/testsuite/ld-tic6x/static-app-1r.od
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1r.od
diff -N ld/testsuite/ld-tic6x/static-app-1r.od
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1r.od	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,12 @@
+
+tmpdir/static-app-1r:     file format elf32-tic6x-le
+
+DYNAMIC RELOCATION RECORDS
+OFFSET   TYPE              VALUE 
+100000d8 R_C6000_ABS32     \.bss
+100000d4 R_C6000_ABS32     b
+100000dc R_C6000_ABS32     a
+100000e0 R_C6000_ABS32     \.text\+0x00000008
+100000e4 R_C6000_ABS32     g1
+
+
Index: ld/testsuite/ld-tic6x/static-app-1r.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1r.rd
diff -N ld/testsuite/ld-tic6x/static-app-1r.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1r.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,109 @@
+There are 15 section headers, starting at offset 0x2178:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 00003c 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          0000803c 00103c 0000a0 10   A  3   5  4
+  \[ 3\] \.dynstr           STRTAB          000080dc 0010dc 00001d 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            000080fc 0010fc 000024 0c   A  2   8  4
+  \[ 5\] \.rela\.neardata    RELA            00008120 001120 000018 0c   A  2   9  4
+  \[ 6\] \.dynamic          DYNAMIC         00008138 001138 000090 08  WA  3   0  4
+  \[ 7\] \.text             PROGBITS        10000000 002000 0000c0 00  AX  0   0 32
+  \[ 8\] \.got              PROGBITS        100000c0 0020c0 000020 00  WA  0   0  4
+  \[ 9\] \.neardata         PROGBITS        100000e0 0020e0 00000c 00  WA  0   0  4
+  \[10\] \.bss              NOBITS          100000ec 0020ec 000004 00  WA  0   0  4
+  \[11\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 0020ec 000019 00      0   0  1
+  \[12\] \.shstrtab         STRTAB          00000000 002105 000071 00      0   0  1
+  \[13\] \.symtab           SYMTAB          00000000 0023d0 000190 10     14  18  4
+  \[14\] \.strtab           STRTAB          00000000 002560 00005e 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x10000000
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x001c8 0x001c8 RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x000ec 0x000f0 RWE 0x1000
+  DYNAMIC        0x001138 0x00008138 0x00008138 0x00090 0x00090 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.neardata \.dynamic 
+   01     \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x1138 contains 13 entries:
+  Tag        Type                         Name/Value
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x80dc
+ 0x00000006 \(SYMTAB\)                     0x803c
+ 0x0000000a \(STRSZ\)                      29 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x00000015 \(DEBUG\)                      0x0
+ 0x70000000 \(C6000_DSBT_BASE\)            0x100000c0
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x0
+ 0x00000007 \(RELA\)                       0x80fc
+ 0x00000008 \(RELASZ\)                     60 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x10fc contains 3 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000d8  00000401 R_C6000_ABS32          100000ec   \.bss \+ 0
+100000d4  00000701 R_C6000_ABS32          100000e8   b \+ 0
+100000dc  00000901 R_C6000_ABS32          100000e0   a \+ 0
+
+Relocation section '\.rela\.neardata' at offset 0x1120 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000e0  00000101 R_C6000_ABS32          10000000   \.text \+ 8
+100000e4  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+
+Symbol table '\.dynsym' contains 10 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     2: 100000c0     0 SECTION LOCAL  DEFAULT    8 
+     3: 100000e0     0 SECTION LOCAL  DEFAULT    9 
+     4: 100000ec     0 SECTION LOCAL  DEFAULT   10 
+     5: 100000ec     4 NOTYPE  LOCAL  DEFAULT   10 c
+     6: 100000c0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
+     8: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+     9: 100000e0     4 OBJECT  GLOBAL DEFAULT    9 a
+
+Symbol table '\.symtab' contains 25 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 0000803c     0 SECTION LOCAL  DEFAULT    2 
+     3: 000080dc     0 SECTION LOCAL  DEFAULT    3 
+     4: 000080fc     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008120     0 SECTION LOCAL  DEFAULT    5 
+     6: 00008138     0 SECTION LOCAL  DEFAULT    6 
+     7: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     8: 100000c0     0 SECTION LOCAL  DEFAULT    8 
+     9: 100000e0     0 SECTION LOCAL  DEFAULT    9 
+    10: 100000ec     0 SECTION LOCAL  DEFAULT   10 
+    11: 00000000     0 SECTION LOCAL  DEFAULT   11 
+    12: 10000000     0 FUNC    LOCAL  HIDDEN     7 sub1
+    13: 10000080     0 NOTYPE  LOCAL  DEFAULT    7 fish
+    14: 00008138     0 OBJECT  LOCAL  DEFAULT    6 _DYNAMIC
+    15: 100000ec     4 NOTYPE  LOCAL  DEFAULT   10 c
+    16: 100000cc     0 OBJECT  LOCAL  DEFAULT    8 _GLOBAL_OFFSET_TABLE_
+    17: 100000c0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    18: 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
+    19: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    20: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+    21: 100000e4     4 OBJECT  GLOBAL DEFAULT    9 g2
+    22: 10000008    52 FUNC    GLOBAL DEFAULT    7 sub0
+    23: 100000e0     4 OBJECT  GLOBAL DEFAULT    9 a
+    24: 10000040    52 FUNC    GLOBAL DEFAULT    7 sub
Index: ld/testsuite/ld-tic6x/static-app-1r.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1r.sd
diff -N ld/testsuite/ld-tic6x/static-app-1r.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1r.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,6 @@
+
+tmpdir/static-app-1r:     file format elf32-tic6x-le
+
+Contents of section \.got:
+[ \t]*100000c0 00000000 00000000 00000000 00000000 .*
+[ \t]*100000d0 00000000 00000000 ec000010 00000000 .*
Index: ld/testsuite/ld-tic6x/static-app-1rb.dd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1rb.dd
diff -N ld/testsuite/ld-tic6x/static-app-1rb.dd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1rb.dd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,52 @@
+
+tmpdir/static-app-1rb:     file format elf32-tic6x-be
+
+
+Disassembly of section \.text:
+
+10000000 <sub1>:
+10000000:[ \t]*000c0362[ \t]*b \.S2 b3
+10000004:[ \t]*00008000[ \t]*nop 5
+
+10000008 <sub0>:
+10000008:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+1000000c:[ \t]*01bc62f6[ \t]*stw \.D2T2 b3,\*\+b15\(12\)
+10000010:[ \t]*073c82f6[ \t]*stw \.D2T2 b14,\*\+b15\(16\)
+10000014:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000018:[ \t]*00000812[ \t]*b \.S2 10000040 <sub>
+1000001c:[ \t]*00000112[ \t]*b \.S2 10000008 <sub0>
+10000020:[ \t]*0ffffc12[ \t]*b \.S2 10000000 <sub1>
+10000024:[ \t]*01bc62e6[ \t]*ldw \.D2T2 \*\+b15\(12\),b3
+10000028:[ \t]*073c82e6[ \t]*ldw \.D2T2 \*\+b15\(16\),b14
+1000002c:[ \t]*07800852[ \t]*addk \.S2 16,b15
+10000030:[ \t]*00004000[ \t]*nop 3
+10000034:[ \t]*000c0362[ \t]*b \.S2 b3
+10000038:[ \t]*00008000[ \t]*nop 5
+1000003c:[ \t]*00000000[ \t]*nop 1
+
+10000040 <sub>:
+10000040:[ \t]*07be09c2[ \t]*sub \.D2 b15,16,b15
+10000044:[ \t]*023c62f4[ \t]*stw \.D2T1 a4,\*\+b15\(12\)
+10000048:[ \t]*003c62e4[ \t]*ldw \.D2T1 \*\+b15\(12\),a0
+1000004c:[ \t]*00006000[ \t]*nop 4
+10000050:[ \t]*00014940[ \t]*add \.D1 a0,10,a0
+10000054:[ \t]*020008f0[ \t]*or \.D1 0,a0,a4
+10000058:[ \t]*07be0942[ \t]*add \.D2 b15,16,b15
+1000005c:[ \t]*000c0362[ \t]*b \.S2 b3
+10000060:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+10000064:[ \t]*0380056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b7
+10000068:[ \t]*0400066e[ \t]*ldw \.D2T2 \*\+b14\(24\),b8
+1000006c:[ \t]*04800b6e[ \t]*ldw \.D2T2 \*\+b14\(44\),b9
+[ \t]*\.\.\.
+
+10000080 <fish>:
+10000080:[ \t]*0700006e[ \t]*ldw \.D2T2 \*\+b14\(0\),b14
+10000084:[ \t]*1ffff112[ \t]*callp \.S2 10000008 <sub0>,b3
+10000088:[ \t]*0ffff112[ \t]*b \.S2 10000008 <sub0>
+1000008c:[ \t]*10000012[ \t]*callp \.S2 10000080 <fish>,b3
+10000090:[ \t]*00000012[ \t]*b \.S2 10000080 <fish>
+10000094:[ \t]*0200086e[ \t]*ldw \.D2T2 \*\+b14\(32\),b4
+10000098:[ \t]*02800a6e[ \t]*ldw \.D2T2 \*\+b14\(40\),b5
+1000009c:[ \t]*0300076e[ \t]*ldw \.D2T2 \*\+b14\(28\),b6
+100000a0:[ \t]*0300056e[ \t]*ldw \.D2T2 \*\+b14\(20\),b6
+[ \t]*\.\.\.
Index: ld/testsuite/ld-tic6x/static-app-1rb.od
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1rb.od
diff -N ld/testsuite/ld-tic6x/static-app-1rb.od
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1rb.od	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,12 @@
+
+tmpdir/static-app-1rb:     file format elf32-tic6x-be
+
+DYNAMIC RELOCATION RECORDS
+OFFSET   TYPE              VALUE 
+100000d8 R_C6000_ABS32     \.bss
+100000d4 R_C6000_ABS32     b
+100000dc R_C6000_ABS32     a
+100000e0 R_C6000_ABS32     \.text\+0x00000008
+100000e4 R_C6000_ABS32     g1
+
+
Index: ld/testsuite/ld-tic6x/static-app-1rb.rd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1rb.rd
diff -N ld/testsuite/ld-tic6x/static-app-1rb.rd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1rb.rd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,109 @@
+There are 15 section headers, starting at offset 0x2178:
+
+Section Headers:
+  \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
+  \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
+  \[ 1\] \.hash             HASH            00008000 001000 00003c 04   A  2   0  4
+  \[ 2\] \.dynsym           DYNSYM          0000803c 00103c 0000a0 10   A  3   5  4
+  \[ 3\] \.dynstr           STRTAB          000080dc 0010dc 00001d 00   A  0   0  1
+  \[ 4\] \.rela\.got         RELA            000080fc 0010fc 000024 0c   A  2   8  4
+  \[ 5\] \.rela\.neardata    RELA            00008120 001120 000018 0c   A  2   9  4
+  \[ 6\] \.dynamic          DYNAMIC         00008138 001138 000090 08  WA  3   0  4
+  \[ 7\] \.text             PROGBITS        10000000 002000 0000c0 00  AX  0   0 32
+  \[ 8\] \.got              PROGBITS        100000c0 0020c0 000020 00  WA  0   0  4
+  \[ 9\] \.neardata         PROGBITS        100000e0 0020e0 00000c 00  WA  0   0  4
+  \[10\] \.bss              NOBITS          100000ec 0020ec 000004 00  WA  0   0  4
+  \[11\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 0020ec 000019 00      0   0  1
+  \[12\] \.shstrtab         STRTAB          00000000 002105 000071 00      0   0  1
+  \[13\] \.symtab           SYMTAB          00000000 0023d0 000190 10     14  18  4
+  \[14\] \.strtab           STRTAB          00000000 002560 00005e 00      0   0  1
+Key to Flags:
+  W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+  I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+  O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x10000000
+There are 4 program headers, starting at offset 52
+
+Program Headers:
+  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
+  LOAD           0x001000 0x00008000 0x00008000 0x001c8 0x001c8 RW  0x1000
+  LOAD           0x002000 0x10000000 0x10000000 0x000ec 0x000f0 RWE 0x1000
+  DYNAMIC        0x001138 0x00008138 0x00008138 0x00090 0x00090 RW  0x4
+  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+  Segment Sections\.\.\.
+   00     \.hash \.dynsym \.dynstr \.rela\.got \.rela\.neardata \.dynamic 
+   01     \.text \.got \.neardata \.bss 
+   02     \.dynamic 
+   03     
+
+Dynamic section at offset 0x1138 contains 13 entries:
+  Tag        Type                         Name/Value
+ 0x00000004 \(HASH\)                       0x8000
+ 0x00000005 \(STRTAB\)                     0x80dc
+ 0x00000006 \(SYMTAB\)                     0x803c
+ 0x0000000a \(STRSZ\)                      29 \(bytes\)
+ 0x0000000b \(SYMENT\)                     16 \(bytes\)
+ 0x00000015 \(DEBUG\)                      0x0
+ 0x70000000 \(C6000_DSBT_BASE\)            0x100000c0
+ 0x70000001 \(C6000_DSBT_SIZE\)            0x3
+ 0x70000003 \(C6000_DSBT_INDEX\)           0x0
+ 0x00000007 \(RELA\)                       0x80fc
+ 0x00000008 \(RELASZ\)                     60 \(bytes\)
+ 0x00000009 \(RELAENT\)                    12 \(bytes\)
+ 0x00000000 \(NULL\)                       0x0
+
+Relocation section '\.rela\.got' at offset 0x10fc contains 3 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000d8  00000401 R_C6000_ABS32          100000ec   \.bss \+ 0
+100000d4  00000701 R_C6000_ABS32          100000e8   b \+ 0
+100000dc  00000901 R_C6000_ABS32          100000e0   a \+ 0
+
+Relocation section '\.rela\.neardata' at offset 0x1120 contains 2 entries:
+ Offset     Info    Type                Sym\. Value  Symbol's Name \+ Addend
+100000e0  00000101 R_C6000_ABS32          10000000   \.text \+ 8
+100000e4  00000801 R_C6000_ABS32          00000000   g1 \+ 0
+
+Symbol table '\.dynsym' contains 10 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     2: 100000c0     0 SECTION LOCAL  DEFAULT    8 
+     3: 100000e0     0 SECTION LOCAL  DEFAULT    9 
+     4: 100000ec     0 SECTION LOCAL  DEFAULT   10 
+     5: 100000ec     4 NOTYPE  LOCAL  DEFAULT   10 c
+     6: 100000c0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+     7: 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
+     8: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+     9: 100000e0     4 OBJECT  GLOBAL DEFAULT    9 a
+
+Symbol table '\.symtab' contains 25 entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 00008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 0000803c     0 SECTION LOCAL  DEFAULT    2 
+     3: 000080dc     0 SECTION LOCAL  DEFAULT    3 
+     4: 000080fc     0 SECTION LOCAL  DEFAULT    4 
+     5: 00008120     0 SECTION LOCAL  DEFAULT    5 
+     6: 00008138     0 SECTION LOCAL  DEFAULT    6 
+     7: 10000000     0 SECTION LOCAL  DEFAULT    7 
+     8: 100000c0     0 SECTION LOCAL  DEFAULT    8 
+     9: 100000e0     0 SECTION LOCAL  DEFAULT    9 
+    10: 100000ec     0 SECTION LOCAL  DEFAULT   10 
+    11: 00000000     0 SECTION LOCAL  DEFAULT   11 
+    12: 10000000     0 FUNC    LOCAL  HIDDEN     7 sub1
+    13: 10000080     0 NOTYPE  LOCAL  DEFAULT    7 fish
+    14: 00008138     0 OBJECT  LOCAL  DEFAULT    6 _DYNAMIC
+    15: 100000ec     4 NOTYPE  LOCAL  DEFAULT   10 c
+    16: 100000cc     0 OBJECT  LOCAL  DEFAULT    8 _GLOBAL_OFFSET_TABLE_
+    17: 100000c0     0 NOTYPE  LOCAL  DEFAULT  ABS __c6xabi_DSBT_BASE
+    18: 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
+    19: 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
+    20: 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
+    21: 100000e4     4 OBJECT  GLOBAL DEFAULT    9 g2
+    22: 10000008    52 FUNC    GLOBAL DEFAULT    7 sub0
+    23: 100000e0     4 OBJECT  GLOBAL DEFAULT    9 a
+    24: 10000040    52 FUNC    GLOBAL DEFAULT    7 sub
Index: ld/testsuite/ld-tic6x/static-app-1rb.sd
===================================================================
RCS file: ld/testsuite/ld-tic6x/static-app-1rb.sd
diff -N ld/testsuite/ld-tic6x/static-app-1rb.sd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/static-app-1rb.sd	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,6 @@
+
+tmpdir/static-app-1rb:     file format elf32-tic6x-be
+
+Contents of section \.got:
+[ \t]*100000c0 00000000 00000000 00000000 00000000 .*
+[ \t]*100000d0 00000000 00000000 100000ec 00000000 .*
Index: ld/testsuite/ld-tic6x/tic6x.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-tic6x/tic6x.exp,v
retrieving revision 1.1
diff -c -p -d -p -u -r1.1 tic6x.exp
--- ld/testsuite/ld-tic6x/tic6x.exp	25 Mar 2010 21:12:34 -0000	1.1
+++ ld/testsuite/ld-tic6x/tic6x.exp	11 Mar 2011 11:33:39 -0000
@@ -1,7 +1,107 @@
-if { [istarget tic6x-*-*] } {
-    foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.d]] {
-	if { [runtest_file_p $runtests $test] } {
-	    run_dump_test [file rootname $test]
-	}
+if { ! [istarget tic6x-*-*] } {
+    return
+}
+
+foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.d]] {
+    if { [runtest_file_p $runtests $test] } {
+	run_dump_test [file rootname $test]
     }
 }
+
+set shlibtests {
+    {"C6X shared library, LE, RELA"
+     "-shared  -Tdsbt.ld --dsbt-index 2 --dsbt-size=3"
+     "-mdsbt -mpic -mpid=near" {shlib-1.s shlib-2.s}
+     {{readelf -WSsrld shlib-1.rd}
+      {objdump "-drj.plt -j.text" shlib-1.dd}
+      {objdump -sj.got shlib-1.sd}}
+      "libtest.so"}
+    {"C6X nonstatic app using shared library, LE, RELA"
+     "-Tdsbt.ld --dsbt-index 0 --dsbt-size=3 tmpdir/libtest.so"
+     "-mdsbt -mpic -mpid=near" {shlib-app-1.s}
+     {{readelf -WSsrld shlib-app-1.rd}
+      {objdump "-drj.plt -j.text" shlib-app-1.dd}
+      {objdump -sj.got shlib-app-1.sd}
+      {objdump -R shlib-app-1.od}}
+     "shlib-dynapp-1"}
+    {"C6X shared library, LE, REL"
+     "-shared  -Tdsbt.ld --dsbt-index 2 --dsbt-size=3"
+     "-mdsbt -mpic -mpid=near -mgenerate-rel" {shlib-1.s shlib-2.s}
+     {{readelf -WSsrld shlib-1r.rd}
+      {objdump "-drj.plt -j.text" shlib-1r.dd}
+      {objdump -sj.got shlib-1r.sd}}
+      "libtestr.so"}
+    {"C6X nonstatic app using shared library, LE, REL"
+     "-Tdsbt.ld --dsbt-index 0 --dsbt-size=3 tmpdir/libtestr.so"
+     "-mdsbt -mpic -mpid=near -mgenerate-rel" {shlib-app-1r.s}
+     {{readelf -WSsrld shlib-app-1r.rd}
+      {objdump "-drj.plt -j.text" shlib-app-1r.dd}
+      {objdump -sj.got shlib-app-1r.sd}
+      {objdump -R shlib-app-1r.od}}
+     "shlib-dynapp-1r"}
+    {"C6X shared library, BE, RELA"
+     "-shared  -Tdsbt-be.ld --dsbt-index 2 --dsbt-size=3"
+     "-mdsbt -mpic -mpid=near -mbig-endian" {shlib-1.s shlib-2.s}
+     {{readelf -WSsrld shlib-1b.rd}
+      {objdump "-drj.plt -j.text" shlib-1b.dd}
+      {objdump -sj.got shlib-1b.sd}}
+      "libtestb.so"}
+    {"C6X nonstatic app using shared library, BE, RELA"
+     "-Tdsbt-be.ld --dsbt-index 0 --dsbt-size=3 tmpdir/libtestb.so"
+     "-mdsbt -mpic -mpid=near -mbig-endian" {shlib-app-1.s}
+     {{readelf -WSsrld shlib-app-1b.rd}
+      {objdump "-drj.plt -j.text" shlib-app-1b.dd}
+      {objdump -sj.got shlib-app-1b.sd}
+      {objdump -R shlib-app-1b.od}}
+     "shlib-dynapp-1b"}
+    {"C6X shared library, BE, REL"
+     "-shared  -Tdsbt-be.ld --dsbt-index 2 --dsbt-size=3"
+     "-mdsbt -mpic -mpid=near -mgenerate-rel -mbig-endian" {shlib-1.s shlib-2.s}
+     {{readelf -WSsrld shlib-1rb.rd}
+      {objdump "-drj.plt -j.text" shlib-1rb.dd}
+      {objdump -sj.got shlib-1rb.sd}}
+      "libtestrb.so"}
+    {"C6X nonstatic app using shared library, BE, REL"
+     "-Tdsbt-be.ld --dsbt-index 0 --dsbt-size=3 tmpdir/libtestrb.so"
+     "-mdsbt -mpic -mpid=near -mgenerate-rel -mbig-endian" {shlib-app-1r.s}
+     {{readelf -WSsrld shlib-app-1rb.rd}
+      {objdump "-drj.plt -j.text" shlib-app-1rb.dd}
+      {objdump -sj.got shlib-app-1rb.sd}
+      {objdump -R shlib-app-1rb.od}}
+     "shlib-dynapp-1rb"}
+
+    {"C6X static app, LE, RELA"
+     "-Tdsbt.ld --dsbt-index 0 --dsbt-size=3"
+     "-mdsbt -mpic -mpid=near" {shlib-1.s shlib-2.s shlib-app-1.s}
+     {{readelf -WSsrld static-app-1.rd}
+      {objdump "-drj.plt -j.text" static-app-1.dd}
+      {objdump -sj.got static-app-1.sd}
+      {objdump -R static-app-1.od}}
+     "static-app-1"}
+    {"C6X static app, LE, REL"
+     "-Tdsbt.ld --dsbt-index 0 --dsbt-size=3"
+     "-mdsbt -mpic -mpid=near -mgenerate-rel" {shlib-1.s shlib-2.s shlib-app-1r.s}
+     {{readelf -WSsrld static-app-1r.rd}
+      {objdump "-drj.plt -j.text" static-app-1r.dd}
+      {objdump -sj.got static-app-1r.sd}
+      {objdump -R static-app-1r.od}}
+     "static-app-1r"}
+    {"C6X static app, BE, RELA"
+     "-Tdsbt-be.ld --dsbt-index 0 --dsbt-size=3"
+     "-mdsbt -mpic -mpid=near -mbig-endian" {shlib-1.s shlib-2.s shlib-app-1.s}
+     {{readelf -WSsrld static-app-1b.rd}
+      {objdump "-drj.plt -j.text" static-app-1b.dd}
+      {objdump -sj.got static-app-1b.sd}
+      {objdump -R static-app-1b.od}}
+     "static-app-1b"}
+    {"C6X static app, BE, REL"
+     "-Tdsbt-be.ld --dsbt-index 0 --dsbt-size=3"
+     "-mdsbt -mpic -mpid=near -mbig-endian -mgenerate-rel" {shlib-1.s shlib-2.s shlib-app-1r.s}
+     {{readelf -WSsrld static-app-1rb.rd}
+      {objdump "-drj.plt -j.text" static-app-1rb.dd}
+      {objdump -sj.got static-app-1rb.sd}
+      {objdump -R static-app-1rb.od}}
+     "static-app-1rb"}
+}
+
+run_ld_link_tests $shlibtests
Index: ld/testsuite/ld-tic6x/weak-be.d
===================================================================
RCS file: ld/testsuite/ld-tic6x/weak-be.d
diff -N ld/testsuite/ld-tic6x/weak-be.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/weak-be.d	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,16 @@
+#name: C6X branches to weak symbols, big endian
+#as: -mbig-endian
+#ld: -melf32_tic6x_be -Tsbr.ld
+#source: weak.s
+#objdump: -dr
+
+.*: *file format elf32-tic6x-be
+
+
+Disassembly of section \.text:
+10000000 <[^>]*>:
+10000000:[ \t]+000c0362[ \t]+b \.S2 b3
+10000004:[ \t]+a00c0362[ \t]+\[a2\] b \.S2 b3
+10000008:[ \t]+000c0363[ \t]+b \.S2 b3
+1000000c:[ \t]+00800028[ \t]+\|\| mvk \.S1 0,a1
+[ \t]*\.\.\.
Index: ld/testsuite/ld-tic6x/weak.d
===================================================================
RCS file: ld/testsuite/ld-tic6x/weak.d
diff -N ld/testsuite/ld-tic6x/weak.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/weak.d	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,16 @@
+#name: C6X branches to weak symbols, little endian
+#as: -mlittle-endian
+#ld: -melf32_tic6x_le -Tsbr.ld
+#source: weak.s
+#objdump: -dr
+
+.*: *file format elf32-tic6x-le
+
+
+Disassembly of section \.text:
+10000000 <[^>]*>:
+10000000:[ \t]+000c0362[ \t]+b \.S2 b3
+10000004:[ \t]+a00c0362[ \t]+\[a2\] b \.S2 b3
+10000008:[ \t]+000c0363[ \t]+b \.S2 b3
+1000000c:[ \t]+00800028[ \t]+\|\| mvk \.S1 0,a1
+[ \t]*\.\.\.
Index: ld/testsuite/ld-tic6x/weak.s
===================================================================
RCS file: ld/testsuite/ld-tic6x/weak.s
diff -N ld/testsuite/ld-tic6x/weak.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-tic6x/weak.s	11 Mar 2011 11:33:39 -0000
@@ -0,0 +1,6 @@
+	.weak g
+.text
+	b .s2	g
+[a2]	b .s2	g
+	b .s2	g
+||	mvk .s1 0,a1

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2011-03-31 14:40 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-03-11 11:42 Patch: Add c6x-uclinux support Bernd Schmidt
2011-03-28 22:34 ` Joseph S. Myers
2011-03-28 23:18   ` Bernd Schmidt
2011-03-29 16:13     ` Joseph S. Myers
2011-03-29 22:59       ` Bernd Schmidt
2011-03-29 23:42         ` Joseph S. Myers
2011-03-30  8:23           ` Bernd Schmidt
2011-03-30 10:14             ` Joseph S. Myers
2011-03-30 11:12               ` Bernd Schmidt
2011-03-30 11:19                 ` Joseph S. Myers
2011-03-30 18:46                   ` Bernd Schmidt
2011-03-30 19:34                     ` Joseph S. Myers
2011-03-31 14:40                     ` Tristan Gingold
2011-03-31 16:14                       ` Bernd Schmidt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).