aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@codesourcery.com>2011-03-31 08:58:28 +0000
committerBernd Schmidt <bernds@codesourcery.com>2011-03-31 08:58:28 +0000
commitac14530735340ebde54e9d536e3a0fd3e82f36db (patch)
tree3b0c55c7d997536e48c444d999138e9bc449df3f
parent53dd76d35f32095e432e4822dbe06f017f7d7069 (diff)
downloadgdb-ac14530735340ebde54e9d536e3a0fd3e82f36db.zip
gdb-ac14530735340ebde54e9d536e3a0fd3e82f36db.tar.gz
gdb-ac14530735340ebde54e9d536e3a0fd3e82f36db.tar.bz2
include/elf/
* tic6x.h (R_C6000_JUMP_SPLOT, R_C6000_EHTYPE, 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, R_C6000_EHTYPE, R_C6000_PCR_H16 and R_C6000_PCR_L16. (elf32_tic6x_link_hash_newfunc, elf32_tic6x_link_hash_table_create, elf32_tic6x_link_hash_table_free, elf32_tic6x_setup, elf32_tic6x_using_dsbt, elf32_tic6x_install_rela, elf32_tic6x_create_dynamic_sections, elf32_tic6x_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, BFD_RELOC_C6000_EHTYPE, BFD_RELOC_C6000_PCR_H16, BFD_RELOC_C6000_PCR_S16): 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. gas/testsuite/ * gas/tic6x/scomm-directive-1.s: New test. * gas/tic6x/scomm-directive-1.d: New test. * gas/tic6x/scomm-directive-2.s: New test. * gas/tic6x/scomm-directive-2.d: New test. * gas/tic6x/scomm-directive-3.s: New test. * gas/tic6x/scomm-directive-3.d: New test. * gas/tic6x/scomm-directive-4.s: New test. * gas/tic6x/scomm-directive-4.d: New test. * gas/tic6x/scomm-directive-5.s: New test. * gas/tic6x/scomm-directive-5.d: New test. * gas/tic6x/scomm-directive-6.s: New test. * gas/tic6x/scomm-directive-6.d: New test. * gas/tic6x/scomm-directive-7.s: New test. * gas/tic6x/scomm-directive-7.d: New test. * gas/tic6x/scomm-directive-8.s: New test. * gas/tic6x/scomm-directive-8.d: New test. 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/ * readelf.c (get_symbol_index_type): Handle SCOM for TIC6X. (dump_relocations): Likewise. binutils/testsuite/ * lib/binutils-common.exp (is_elf_format): Accept tic6x*-*-uclinux*. ld/testsuite/ * ld-scripts/crossref.exp: Add CFLAGS for tic6x*-*-*. * 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/shlib-noindex.rd: New test. * ld-tic6x/shlib-noindex.dd: New test. * ld-tic6x/shlib-noindex.sd: 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. * ld-tic6x/weak-data.d: New test. * ld-tic6x/common.d: New test. * ld-tic6x/common.ld: New test. * ld-tic6x/common.s: New test.
-rw-r--r--bfd/ChangeLog52
-rw-r--r--bfd/bfd-in2.h4
-rw-r--r--bfd/config.bfd2
-rw-r--r--bfd/elf32-tic6x.c1920
-rw-r--r--bfd/elf32-tic6x.h11
-rw-r--r--bfd/libbfd.h4
-rw-r--r--bfd/reloc.c10
-rw-r--r--binutils/ChangeLog5
-rw-r--r--binutils/readelf.c12
-rw-r--r--binutils/testsuite/ChangeLog4
-rw-r--r--binutils/testsuite/lib/binutils-common.exp3
-rw-r--r--gas/ChangeLog11
-rw-r--r--gas/config/tc-tic6x.c177
-rw-r--r--gas/doc/c-tic6x.texi6
-rw-r--r--gas/testsuite/ChangeLog19
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-1.d4
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-1.s2
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-2.d5
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-2.s2
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-3.d4
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-3.s2
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-4.d37
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-4.s8
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-5.d4
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-5.s1
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-6.d4
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-6.s1
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-7.d4
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-7.s1
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-8.d4
-rw-r--r--gas/testsuite/gas/tic6x/scomm-directive-8.s1
-rw-r--r--include/ChangeLog6
-rw-r--r--include/elf/tic6x.h13
-rw-r--r--ld/ChangeLog14
-rw-r--r--ld/emulparams/elf32_tic6x_le.sh25
-rw-r--r--ld/emultempl/tic6xdsbt.em105
-rw-r--r--ld/gen-doc.texi1
-rw-r--r--ld/ld.texinfo30
-rw-r--r--ld/testsuite/ChangeLog84
-rw-r--r--ld/testsuite/ld-elf/sec-to-seg.exp1
-rw-r--r--ld/testsuite/ld-scripts/crossref.exp6
-rw-r--r--ld/testsuite/ld-tic6x/common.d28
-rw-r--r--ld/testsuite/ld-tic6x/common.ld11
-rw-r--r--ld/testsuite/ld-tic6x/common.s2
-rw-r--r--ld/testsuite/ld-tic6x/dsbt-be.ld67
-rw-r--r--ld/testsuite/ld-tic6x/dsbt-index-error.d5
-rw-r--r--ld/testsuite/ld-tic6x/dsbt-index.d14
-rw-r--r--ld/testsuite/ld-tic6x/dsbt-index.s3
-rw-r--r--ld/testsuite/ld-tic6x/dsbt-inrange.ld68
-rw-r--r--ld/testsuite/ld-tic6x/dsbt-overflow.ld68
-rw-r--r--ld/testsuite/ld-tic6x/dsbt.ld65
-rw-r--r--ld/testsuite/ld-tic6x/got-reloc-global-addend-1.d5
-rw-r--r--ld/testsuite/ld-tic6x/got-reloc-global-addend-1.s11
-rw-r--r--ld/testsuite/ld-tic6x/got-reloc-global-addend-2.d5
-rw-r--r--ld/testsuite/ld-tic6x/got-reloc-global-addend-2.s11
-rw-r--r--ld/testsuite/ld-tic6x/got-reloc-global.s11
-rw-r--r--ld/testsuite/ld-tic6x/got-reloc-inrange.d15
-rw-r--r--ld/testsuite/ld-tic6x/got-reloc-local-1.s8
-rw-r--r--ld/testsuite/ld-tic6x/got-reloc-local-2.s8
-rw-r--r--ld/testsuite/ld-tic6x/got-reloc-local-r.d23
-rw-r--r--ld/testsuite/ld-tic6x/got-reloc-overflow.d5
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1.dd67
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1.rd123
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1.s44
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1.sd7
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1b.dd67
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1b.rd123
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1b.sd7
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1r.dd67
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1r.rd123
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1r.sd7
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1rb.dd67
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1rb.rd123
-rw-r--r--ld/testsuite/ld-tic6x/shlib-1rb.sd7
-rw-r--r--ld/testsuite/ld-tic6x/shlib-2.s23
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1.dd40
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1.od13
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1.rd127
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1.s31
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1.sd6
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1b.dd40
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1b.od13
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1b.rd127
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1b.sd6
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1r.dd36
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1r.od11
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1r.rd115
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1r.s19
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1r.sd6
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1rb.dd36
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1rb.od11
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1rb.rd115
-rw-r--r--ld/testsuite/ld-tic6x/shlib-app-1rb.sd6
-rw-r--r--ld/testsuite/ld-tic6x/shlib-noindex.dd67
-rw-r--r--ld/testsuite/ld-tic6x/shlib-noindex.rd130
-rw-r--r--ld/testsuite/ld-tic6x/shlib-noindex.sd7
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1.dd56
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1.od14
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1.rd112
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1.sd6
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1b.dd56
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1b.od14
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1b.rd112
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1b.sd6
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1r.dd52
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1r.od12
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1r.rd109
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1r.sd6
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1rb.dd52
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1rb.od12
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1rb.rd109
-rw-r--r--ld/testsuite/ld-tic6x/static-app-1rb.sd6
-rw-r--r--ld/testsuite/ld-tic6x/tic6x.exp117
-rw-r--r--ld/testsuite/ld-tic6x/weak-be.d19
-rw-r--r--ld/testsuite/ld-tic6x/weak-data.d11
-rw-r--r--ld/testsuite/ld-tic6x/weak.d19
-rw-r--r--ld/testsuite/ld-tic6x/weak.s19
117 files changed, 5748 insertions, 30 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index afc3aa8..49a97359 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,55 @@
+2011-03-31 Bernd Schmidt <bernds@codesourcery.com>
+
+ * 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, R_C6000_EHTYPE,
+ R_C6000_PCR_H16 and R_C6000_PCR_L16.
+ (elf32_tic6x_link_hash_newfunc, elf32_tic6x_link_hash_table_create,
+ elf32_tic6x_link_hash_table_free, elf32_tic6x_setup,
+ elf32_tic6x_using_dsbt, elf32_tic6x_install_rela,
+ elf32_tic6x_create_dynamic_sections, elf32_tic6x_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, BFD_RELOC_C6000_EHTYPE,
+ BFD_RELOC_C6000_PCR_H16, BFD_RELOC_C6000_PCR_S16): Add.
+ * bfd/bfd-in2.h: Regenerate.
+ * bfd/libbfd.h: Regenerate.
+ * config.bfd: Accept tic6x-*-* instead of tic6x-*-elf.
+
2011-03-31 Tristan Gingold <gingold@adacore.com>
* coffcode.h (coff_slurp_symbol_table): Silently discard C_NULL
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 9a470ae..a1ef1c1 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -3774,6 +3774,10 @@ the opcode. */
BFD_RELOC_C6000_DSBT_INDEX,
BFD_RELOC_C6000_PREL31,
BFD_RELOC_C6000_COPY,
+ BFD_RELOC_C6000_JUMP_SLOT,
+ BFD_RELOC_C6000_EHTYPE,
+ BFD_RELOC_C6000_PCR_H16,
+ BFD_RELOC_C6000_PCR_L16,
BFD_RELOC_C6000_ALIGN,
BFD_RELOC_C6000_FPHEAD,
BFD_RELOC_C6000_NOCMP,
diff --git a/bfd/config.bfd b/bfd/config.bfd
index 5e67d6b..76d1927 100644
--- a/bfd/config.bfd
+++ b/bfd/config.bfd
@@ -1505,7 +1505,7 @@ case "${targ}" in
;;
#endif
- tic6x-*-elf)
+ tic6x-*-*)
targ_defvec=bfd_elf32_tic6x_le_vec
targ_selvecs=bfd_elf32_tic6x_be_vec
;;
diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
index 3674a3a..7708e05 100644
--- a/bfd/elf32-tic6x.c
+++ b/bfd/elf32-tic6x.c
@@ -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_howto_table[] =
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_howto_table_rel[] =
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,10 @@ static const tic6x_reloc_map elf32_tic6x_reloc_map[] =
{ 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_EHTYPE, R_C6000_EHTYPE },
+ { BFD_RELOC_C6000_PCR_H16, R_C6000_PCR_H16 },
+ { BFD_RELOC_C6000_PCR_L16, R_C6000_PCR_L16 },
{ BFD_RELOC_C6000_ALIGN, R_C6000_ALIGN },
{ BFD_RELOC_C6000_FPHEAD, R_C6000_FPHEAD },
{ BFD_RELOC_C6000_NOCMP, R_C6000_NOCMP }
@@ -1349,6 +1437,130 @@ elf32_tic6x_set_use_rela_p (bfd *abfd, bfd_boolean use_rela_p)
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
+elf32_tic6x_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 +1573,421 @@ elf32_tic6x_mkobject (bfd *abfd)
return ret;
}
+/* Install relocation RELA into section SRELA, incrementing its
+ reloc_count. */
+
+static void
+elf32_tic6x_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
+elf32_tic6x_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);
+ elf32_tic6x_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;
+ elf32_tic6x_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;
+
+ elf32_tic6x_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;
+
+ elf32_tic6x_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:
+ case R_C6000_SBR_GOT_L16_W:
+ case R_C6000_SBR_GOT_H16_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_C6000_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 +2021,29 @@ elf32_tic6x_rel_relocation_p (bfd *abfd, asection *sec,
< 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 +2054,20 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
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 +2080,7 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
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 +2153,136 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
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_DSBT_INDEX:
+ relocation = elf32_tic6x_hash_table (info)->params.dsbt_index;
+ if (!info->shared || relocation != 0)
+ break;
+
+ /* fall through */
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 || elf32_tic6x_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);
+ }
+
+ elf32_tic6x_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;
@@ -1531,9 +2301,17 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
if (sbh != NULL
&& (sbh->type == bfd_link_hash_defined
|| sbh->type == bfd_link_hash_defweak))
- relocation -= (sbh->u.def.value
- + sbh->u.def.section->output_section->vma
- + sbh->u.def.section->output_offset);
+ {
+ 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))
+ relocation = 0;
+ else
+ relocation -= (sbh->u.def.value
+ + sbh->u.def.section->output_section->vma
+ + sbh->u.def.section->output_offset);
+ }
else
{
(*_bfd_error_handler) (_("%B: SB-relative relocation but "
@@ -1547,7 +2325,122 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
case R_C6000_SBR_GOT_U15_W:
case R_C6000_SBR_GOT_L16_W:
case R_C6000_SBR_GOT_H16_W:
- case R_C6000_DSBT_INDEX:
+ /* 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))
+ elf32_tic6x_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 || elf32_tic6x_using_dsbt (output_bfd))
+ elf32_tic6x_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_PREL31:
/* Shared libraries and exception handling support not
implemented. */
@@ -1658,6 +2551,936 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
return ok;
}
+
+/* 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 (elf32_tic6x_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_DSBT_INDEX:
+ /* We'd like to check for nonzero dsbt_index here, but it's
+ set up only after check_relocs is called. Instead, we
+ store the number of R_C6000_DSBT_INDEX relocs in the
+ pc_count field, and potentially discard the extra space
+ in elf32_tic6x_allocate_dynrelocs. */
+ if (!info->shared)
+ break;
+
+ /* fall through */
+ 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 || elf32_tic6x_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;
+ if (r_type == R_C6000_DSBT_INDEX)
+ p->pc_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 || elf32_tic6x_using_dsbt (htab->obfd))
+ {
+ /* We use the pc_count field to hold the number of
+ R_C6000_DSBT_INDEX relocs. */
+ if (htab->params.dsbt_index != 0)
+ {
+ struct elf_dyn_relocs **pp;
+
+ for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
+ {
+ p->count -= p->pc_count;
+ p->pc_count = 0;
+ if (p->count == 0)
+ *pp = p->next;
+ else
+ pp = &p->next;
+ }
+ }
+
+ 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 || elf32_tic6x_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 (elf32_tic6x_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 +3816,48 @@ elf32_tic6x_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
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
+ && elf32_tic6x_using_dsbt (ibfd) && elf32_tic6x_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 +3866,14 @@ elf32_tic6x_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
#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 +3885,41 @@ elf32_tic6x_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
#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"
diff --git a/bfd/elf32-tic6x.h b/bfd/elf32-tic6x.h
index e8df4e2..be54308 100644
--- a/bfd/elf32-tic6x.h
+++ b/bfd/elf32-tic6x.h
@@ -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_attributes (int, int);
/* 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 *);
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index bdfbdb2..2e7df4f 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -1705,6 +1705,10 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_C6000_DSBT_INDEX",
"BFD_RELOC_C6000_PREL31",
"BFD_RELOC_C6000_COPY",
+ "BFD_RELOC_C6000_JUMP_SLOT",
+ "BFD_RELOC_C6000_EHTYPE",
+ "BFD_RELOC_C6000_PCR_H16",
+ "BFD_RELOC_C6000_PCR_L16",
"BFD_RELOC_C6000_ALIGN",
"BFD_RELOC_C6000_FPHEAD",
"BFD_RELOC_C6000_NOCMP",
diff --git a/bfd/reloc.c b/bfd/reloc.c
index 2e2dccd..202a340 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -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.
@@ -3935,6 +3935,14 @@ ENUMX
ENUMX
BFD_RELOC_C6000_COPY
ENUMX
+ BFD_RELOC_C6000_JUMP_SLOT
+ENUMX
+ BFD_RELOC_C6000_EHTYPE
+ENUMX
+ BFD_RELOC_C6000_PCR_H16
+ENUMX
+ BFD_RELOC_C6000_PCR_L16
+ENUMX
BFD_RELOC_C6000_ALIGN
ENUMX
BFD_RELOC_C6000_FPHEAD
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index de657a4..0a22340 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,8 @@
+2011-03-31 Bernd Schmidt <bernds@codesourcery.com>
+
+ * readelf.c (get_symbol_index_type): Handle SCOM for TIC6X.
+ (dump_relocations): Likewise.
+
2011-03-31 Tristan Gingold <gingold@adacore.com>
* readelf.c (get_ia64_vms_note_type): New function.
diff --git a/binutils/readelf.c b/binutils/readelf.c
index c3e5ffd..c975189 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -1304,8 +1304,10 @@ dump_relocations (FILE * file,
sec_name = "ABS";
else if (psym->st_shndx == SHN_COMMON)
sec_name = "COMMON";
- else if (elf_header.e_machine == EM_MIPS
- && psym->st_shndx == SHN_MIPS_SCOMMON)
+ else if ((elf_header.e_machine == EM_MIPS
+ && psym->st_shndx == SHN_MIPS_SCOMMON)
+ || (elf_header.e_machine == EM_TI_C6000
+ && psym->st_shndx == SHN_TIC6X_SCOMMON))
sec_name = "SCOMMON";
else if (elf_header.e_machine == EM_MIPS
&& psym->st_shndx == SHN_MIPS_SUNDEFINED)
@@ -8482,8 +8484,10 @@ get_symbol_index_type (unsigned int type)
|| elf_header.e_machine == EM_L1OM)
&& type == SHN_X86_64_LCOMMON)
return "LARGE_COM";
- else if (type == SHN_MIPS_SCOMMON
- && elf_header.e_machine == EM_MIPS)
+ else if ((type == SHN_MIPS_SCOMMON
+ && elf_header.e_machine == EM_MIPS)
+ || (type == SHN_TIC6X_SCOMMON
+ && elf_header.e_machine == EM_TI_C6000))
return "SCOM";
else if (type == SHN_MIPS_SUNDEFINED
&& elf_header.e_machine == EM_MIPS)
diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog
index faf6d99..bad1b83 100644
--- a/binutils/testsuite/ChangeLog
+++ b/binutils/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2011-03-31 Bernd Schmidt <bernds@codesourcery.com>
+
+ * lib/binutils-common.exp (is_elf_format): Accept tic6x*-*-uclinux*.
+
2011-01-03 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* lib/binutils-common.exp (regexp_diff): Use "==" instead of "eq".
diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
index 8e2c36f..f9dcfd2 100644
--- a/binutils/testsuite/lib/binutils-common.exp
+++ b/binutils/testsuite/lib/binutils-common.exp
@@ -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*]
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 5e706c1..243ccbd 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,14 @@
+2011-03-31 Bernd Schmidt <bernds@codesourcery.com>
+
+ * 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.
+
2011-03-31 Tristan Gingold <gingold@adacore.com>
* dwarf2dbg.c (DWARF2_VERSION): Define.
diff --git a/gas/config/tc-tic6x.c b/gas/config/tc-tic6x.c
index c937ba5..6ff8006 100644
--- a/gas/config/tc-tic6x.c
+++ b/gas/config/tc-tic6x.c
@@ -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_UNUSED)
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"));
+ ignore_rest_of_line ();
+ return;
+ }
+
+ /* Skip ','. */
+ input_line_pointer++;
+ if ((size = get_absolute_expression ()) < 0)
+ {
+ /* xgettext:c-format */
+ as_warn (_("invalid length for .scomm directive"));
+ 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 (_("alignment is not a positive number"));
+ 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 (_("alignment is 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 (_("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 (_("attempt to redefine `%s' with a different length"),
+ S_GET_NAME (symbolP));
+
+ 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);
+ }
+
+ symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
+
+ 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 ATTRIBUTE_UNUSED, fixS *fixp)
/* 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;
}
diff --git a/gas/doc/c-tic6x.texi b/gas/doc/c-tic6x.texi
index ba0148c..1116275 100644
--- a/gas/doc/c-tic6x.texi
+++ b/gas/doc/c-tic6x.texi
@@ -151,4 +151,10 @@ The @var{tag} is either an attribute number or one of
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
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 51502ee..62fa86d 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,22 @@
+2011-03-31 Bernd Schmidt <bernds@codesourcery.com>
+
+ * gas/tic6x/scomm-directive-1.s: New test.
+ * gas/tic6x/scomm-directive-1.d: New test.
+ * gas/tic6x/scomm-directive-2.s: New test.
+ * gas/tic6x/scomm-directive-2.d: New test.
+ * gas/tic6x/scomm-directive-3.s: New test.
+ * gas/tic6x/scomm-directive-3.d: New test.
+ * gas/tic6x/scomm-directive-4.s: New test.
+ * gas/tic6x/scomm-directive-4.d: New test.
+ * gas/tic6x/scomm-directive-5.s: New test.
+ * gas/tic6x/scomm-directive-5.d: New test.
+ * gas/tic6x/scomm-directive-6.s: New test.
+ * gas/tic6x/scomm-directive-6.d: New test.
+ * gas/tic6x/scomm-directive-7.s: New test.
+ * gas/tic6x/scomm-directive-7.d: New test.
+ * gas/tic6x/scomm-directive-8.s: New test.
+ * gas/tic6x/scomm-directive-8.d: New test.
+
2011-03-29 H.J. Lu <hongjiu.lu@intel.com>
* gas/i386/ilp32/quad.d: Add tests for multiple operands.
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-1.d b/gas/testsuite/gas/tic6x/scomm-directive-1.d
new file mode 100644
index 0000000..afa4496
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-1.d
@@ -0,0 +1,4 @@
+#name: C6X .scomm directive 1
+#as:
+#source: scomm-directive-1.s
+#error: alignment is not a power of 2
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-1.s b/gas/testsuite/gas/tic6x/scomm-directive-1.s
new file mode 100644
index 0000000..91f438a
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-1.s
@@ -0,0 +1,2 @@
+ .comm x,4,4
+ .scomm y,4,5
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-2.d b/gas/testsuite/gas/tic6x/scomm-directive-2.d
new file mode 100644
index 0000000..f8c62fb
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-2.d
@@ -0,0 +1,5 @@
+#name: C6X .scomm directive 2
+#as:
+#source: scomm-directive-2.s
+#error: attempt to re-define symbol
+
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-2.s b/gas/testsuite/gas/tic6x/scomm-directive-2.s
new file mode 100644
index 0000000..c53e787
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-2.s
@@ -0,0 +1,2 @@
+ .scomm x,4,4
+ .scomm x,8,4
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-3.d b/gas/testsuite/gas/tic6x/scomm-directive-3.d
new file mode 100644
index 0000000..ae3304c
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-3.d
@@ -0,0 +1,4 @@
+#name: C6X .scomm directive 3
+#as:
+#source: scomm-directive-3.s
+#error: attempt to re-define symbol
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-3.s b/gas/testsuite/gas/tic6x/scomm-directive-3.s
new file mode 100644
index 0000000..c17f0b5
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-3.s
@@ -0,0 +1,2 @@
+ .comm x,8,4
+ .scomm x,8,4
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-4.d b/gas/testsuite/gas/tic6x/scomm-directive-4.d
new file mode 100644
index 0000000..9eba4fd
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-4.d
@@ -0,0 +1,37 @@
+#name: C6X .scomm directive 4
+#as:
+#source: scomm-directive-4.s
+#readelf: -Ss
+
+There are 8 section headers, starting at offset 0x88:
+
+Section Headers:
+ \[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al
+ \[ 0\] NULL 00000000 000000 000000 00 0 0 0
+ \[ 1\] \.text PROGBITS 00000000 000034 000000 00 AX 0 0 1
+ \[ 2\] \.data PROGBITS 00000000 000034 000000 00 WA 0 0 1
+ \[ 3\] \.bss NOBITS 00000000 000034 000000 00 WA 0 0 1
+ \[ 4\] \.c6xabi\.attribute C6000_ATTRIBUTE 00000000 000034 000013 00 0 0 1
+ \[ 5\] \.shstrtab STRTAB 00000000 000047 00003f 00 0 0 1
+ \[ 6\] \.symtab SYMTAB 00000000 0001c8 0000d0 10 7 5 4
+ \[ 7\] \.strtab STRTAB 00000000 000298 00001d 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\)
+
+Symbol table '\.symtab' contains 13 entries:
+ Num: Value Size Type Bind Vis Ndx Name
+ 0: 00000000 0 NOTYPE LOCAL DEFAULT UND
+ 1: 00000000 0 SECTION LOCAL DEFAULT 1
+ 2: 00000000 0 SECTION LOCAL DEFAULT 2
+ 3: 00000000 0 SECTION LOCAL DEFAULT 3
+ 4: 00000000 0 SECTION LOCAL DEFAULT 4
+ 5: 00000004 4 OBJECT GLOBAL DEFAULT COM x4a
+ 6: 00000004 4 OBJECT GLOBAL DEFAULT SCOM y4a
+ 7: 00000002 4 OBJECT GLOBAL DEFAULT COM x4b
+ 8: 00000002 4 OBJECT GLOBAL DEFAULT SCOM y4b
+ 9: 00000004 2 OBJECT GLOBAL DEFAULT COM x2
+ 10: 00000004 2 OBJECT GLOBAL DEFAULT SCOM y2
+ 11: 00000004 1 OBJECT GLOBAL DEFAULT COM x1
+ 12: 00000004 1 OBJECT GLOBAL DEFAULT SCOM y1
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-4.s b/gas/testsuite/gas/tic6x/scomm-directive-4.s
new file mode 100644
index 0000000..1d2d018
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-4.s
@@ -0,0 +1,8 @@
+ .comm x4a,4,4
+ .scomm y4a,4,4
+ .comm x4b,4,2
+ .scomm y4b,4,2
+ .comm x2,2,4
+ .scomm y2,2,4
+ .comm x1,1,4
+ .scomm y1,1,4
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-5.d b/gas/testsuite/gas/tic6x/scomm-directive-5.d
new file mode 100644
index 0000000..0731e12
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-5.d
@@ -0,0 +1,4 @@
+#name: C6X .scomm directive 5
+#as:
+#source: scomm-directive-5.s
+#error: expected comma after symbol name
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-5.s b/gas/testsuite/gas/tic6x/scomm-directive-5.s
new file mode 100644
index 0000000..2de60ba
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-5.s
@@ -0,0 +1 @@
+ .scomm x
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-6.d b/gas/testsuite/gas/tic6x/scomm-directive-6.d
new file mode 100644
index 0000000..d083039
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-6.d
@@ -0,0 +1,4 @@
+#name: C6X .scomm directive 6
+#as:
+#source: scomm-directive-6.s
+#error: bad or irreducible absolute expression
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-6.s b/gas/testsuite/gas/tic6x/scomm-directive-6.s
new file mode 100644
index 0000000..9171f20
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-6.s
@@ -0,0 +1 @@
+ .scomm x,fish
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-7.d b/gas/testsuite/gas/tic6x/scomm-directive-7.d
new file mode 100644
index 0000000..3cf2803
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-7.d
@@ -0,0 +1,4 @@
+#name: C6X .scomm directive 7
+#as:
+#source: scomm-directive-7.s
+#warning: alignment is not a positive number
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-7.s b/gas/testsuite/gas/tic6x/scomm-directive-7.s
new file mode 100644
index 0000000..711ddd6
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-7.s
@@ -0,0 +1 @@
+ .scomm x,8,-4
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-8.d b/gas/testsuite/gas/tic6x/scomm-directive-8.d
new file mode 100644
index 0000000..c4a6598
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-8.d
@@ -0,0 +1,4 @@
+#name: C6X .scomm directive 8
+#as:
+#source: scomm-directive-8.s
+#warning: invalid length for .scomm directive
diff --git a/gas/testsuite/gas/tic6x/scomm-directive-8.s b/gas/testsuite/gas/tic6x/scomm-directive-8.s
new file mode 100644
index 0000000..5c33e32
--- /dev/null
+++ b/gas/testsuite/gas/tic6x/scomm-directive-8.s
@@ -0,0 +1 @@
+ .scomm x,-8,4
diff --git a/include/ChangeLog b/include/ChangeLog
index de6858b..9ee637f 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,9 @@
+2011-03-31 Bernd Schmidt <bernds@codesourcery.com>
+
+ * tic6x.h (R_C6000_JUMP_SPLOT, R_C6000_EHTYPE,
+ R_C6000_PCR_H16, R_C6000_PCR_L16): New relocs.
+ (SHN_TIC6X_SCOMMON): Define.
+
2011-03-24 Mark Wielaard <mjw@redhat.com>
* dwarf2.h (dwarf_form): Remove deprecated DW_FORM_sig8 define.
diff --git a/include/elf/tic6x.h b/include/elf/tic6x.h
index 88000fa..46f43c8 100644
--- a/include/elf/tic6x.h
+++ b/include/elf/tic6x.h
@@ -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_type)
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_EHTYPE, 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. */
diff --git a/ld/ChangeLog b/ld/ChangeLog
index e41fc13..4fb826d 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,17 @@
+2011-03-31 Bernd Schmidt <bernds@codesourcery.com>
+
+ * 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.
+
2011-03-29 Alan Modra <amodra@gmail.com>
PR ld/12613
diff --git a/ld/emulparams/elf32_tic6x_le.sh b/ld/emulparams/elf32_tic6x_le.sh
index 7a78a2c..335bc0f 100644
--- a/ld/emulparams/elf32_tic6x_le.sh
+++ b/ld/emulparams/elf32_tic6x_le.sh
@@ -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 ${RELOCATING-0} : { *(.fardata${RELOCATING+ .
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)) }'
diff --git a/ld/emultempl/tic6xdsbt.em b/ld/emultempl/tic6xdsbt.em
new file mode 100644
index 0000000..875148e
--- /dev/null
+++ b/ld/emultempl/tic6xdsbt.em
@@ -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
diff --git a/ld/gen-doc.texi b/ld/gen-doc.texi
index 7434edb..5a6bfd5 100644
--- a/ld/gen-doc.texi
+++ b/ld/gen-doc.texi
@@ -4,6 +4,7 @@
@c 2. Specific target machines
@set ARM
+@set C6X
@set H8300
@set HPPA
@set I960
diff --git a/ld/ld.texinfo b/ld/ld.texinfo
index ed79923..800f0d4 100644
--- a/ld/ld.texinfo
+++ b/ld/ld.texinfo
@@ -22,6 +22,7 @@
@set UsesEnvVars
@set GENERIC
@set ARM
+@set C6X
@set H8300
@set HPPA
@set I960
@@ -2612,6 +2613,35 @@ 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. If a shared library is generated with a DSBT index of 0, the
+@code{R_C6000_DSBT_INDEX} relocs are copied into the output file.
+
+@end table
+
+@c man end
+@end ifset
+
@ifset M68HC11
@subsection Options specific to Motorola 68HC11 and 68HC12 targets
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index f90788f..4d41d8c 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,87 @@
+2011-03-31 Bernd Schmidt <bernds@codesourcery.com>
+
+ * ld-scripts/crossref.exp: Add CFLAGS for tic6x*-*-*.
+ * 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/shlib-noindex.rd: New test.
+ * ld-tic6x/shlib-noindex.dd: New test.
+ * ld-tic6x/shlib-noindex.sd: 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.
+ * ld-tic6x/weak-data.d: New test.
+ * ld-tic6x/common.d: New test.
+ * ld-tic6x/common.ld: New test.
+ * ld-tic6x/common.s: New test.
+
2011-03-30 Richard Henderson <rth@redhat.com>
* ld-elf/elf.exp: Force 32-bit start address for alpha.
diff --git a/ld/testsuite/ld-elf/sec-to-seg.exp b/ld/testsuite/ld-elf/sec-to-seg.exp
index cd32e68..43c5ab1 100644
--- a/ld/testsuite/ld-elf/sec-to-seg.exp
+++ b/ld/testsuite/ld-elf/sec-to-seg.exp
@@ -87,7 +87,6 @@ if { [istarget avr-*-*]
|| [istarget moxie-*-*]
|| [istarget msp430-*-*]
|| [istarget mt-*-*]
- || [istarget tic6x-*-*]
} {
set B_test_same_seg 0
} else {
diff --git a/ld/testsuite/ld-scripts/crossref.exp b/ld/testsuite/ld-scripts/crossref.exp
index 98178de..061b5aa 100644
--- a/ld/testsuite/ld-scripts/crossref.exp
+++ b/ld/testsuite/ld-scripts/crossref.exp
@@ -51,6 +51,12 @@ if [istarget mep*-*-elf] {
set CFLAGS "-mtiny=0"
}
+# The .dsbt section and __c6xabi_DSBT_BASE are not defined in our test
+# linker scripts.
+if [istarget tic6x*-*-*] {
+ set CFLAGS "-mno-dsbt -msdata=none"
+}
+
if { ![ld_compile $CC "$srcdir/$subdir/cross1.c" tmpdir/cross1.o] \
|| ![ld_compile $CC "$srcdir/$subdir/cross2.c" tmpdir/cross2.o] } {
unresolved $test1
diff --git a/ld/testsuite/ld-tic6x/common.d b/ld/testsuite/ld-tic6x/common.d
new file mode 100644
index 0000000..68529f8
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/common.d
@@ -0,0 +1,28 @@
+#name: C6X common symbols
+#as: -mlittle-endian
+#ld: -melf32_tic6x_le -Tcommon.ld
+#source: common.s
+#readelf: -Ss
+
+There are 6 section headers, starting at offset 0x7c:
+
+Section Headers:
+ \[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al
+ \[ 0\] NULL 00000000 000000 000000 00 0 0 0
+ \[ 1\] \.far NOBITS 00000080 000080 000008 00 WA 0 0 4
+ \[ 2\] \.bss NOBITS 00000100 000080 000004 00 WA 0 0 4
+ \[ 3\] \.shstrtab STRTAB 00000000 000054 000025 00 0 0 1
+ \[ 4\] \.symtab SYMTAB 00000000 00016c 000050 10 5 3 4
+ \[ 5\] \.strtab STRTAB 00000000 0001bc 000005 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\)
+
+Symbol table '\.symtab' contains 5 entries:
+ Num: Value Size Type Bind Vis Ndx Name
+ 0: 00000000 0 NOTYPE LOCAL DEFAULT UND
+ 1: 00000080 0 SECTION LOCAL DEFAULT 1
+ 2: 00000100 0 SECTION LOCAL DEFAULT 2
+ 3: 00000100 4 OBJECT GLOBAL DEFAULT 2 x
+ 4: 00000080 8 OBJECT GLOBAL DEFAULT 1 y
diff --git a/ld/testsuite/ld-tic6x/common.ld b/ld/testsuite/ld-tic6x/common.ld
new file mode 100644
index 0000000..5597c3f
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/common.ld
@@ -0,0 +1,11 @@
+SECTIONS
+{
+ . = 0x80;
+ .far : { *(.far) *(COMMON) }
+ . = 0x100;
+ .bss : { *(.scommon) }
+
+ . = 0x10000000;
+ .text : { *(.text*) }
+ /DISCARD/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-tic6x/common.s b/ld/testsuite/ld-tic6x/common.s
new file mode 100644
index 0000000..4743066
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/common.s
@@ -0,0 +1,2 @@
+ .scomm x,4,4
+ .comm y,8,4
diff --git a/ld/testsuite/ld-tic6x/dsbt-be.ld b/ld/testsuite/ld-tic6x/dsbt-be.ld
new file mode 100644
index 0000000..2a7795c
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/dsbt-be.ld
@@ -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/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-tic6x/dsbt-index-error.d b/ld/testsuite/ld-tic6x/dsbt-index-error.d
new file mode 100644
index 0000000..5c9f96a
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/dsbt-index-error.d
@@ -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.*
diff --git a/ld/testsuite/ld-tic6x/dsbt-index.d b/ld/testsuite/ld-tic6x/dsbt-index.d
new file mode 100644
index 0000000..cc33c89
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/dsbt-index.d
@@ -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]*\.\.\.
diff --git a/ld/testsuite/ld-tic6x/dsbt-index.s b/ld/testsuite/ld-tic6x/dsbt-index.s
new file mode 100644
index 0000000..16e3b76
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/dsbt-index.s
@@ -0,0 +1,3 @@
+.text
+.nocmp
+ ldw .d2t2 *+B14($DSBT_index(__c6xabi_DSBT_BASE)), B14
diff --git a/ld/testsuite/ld-tic6x/dsbt-inrange.ld b/ld/testsuite/ld-tic6x/dsbt-inrange.ld
new file mode 100644
index 0000000..603f020
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/dsbt-inrange.ld
@@ -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/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-tic6x/dsbt-overflow.ld b/ld/testsuite/ld-tic6x/dsbt-overflow.ld
new file mode 100644
index 0000000..3128a35
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/dsbt-overflow.ld
@@ -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/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-tic6x/dsbt.ld b/ld/testsuite/ld-tic6x/dsbt.ld
new file mode 100644
index 0000000..fd41608
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/dsbt.ld
@@ -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/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-tic6x/got-reloc-global-addend-1.d b/ld/testsuite/ld-tic6x/got-reloc-global-addend-1.d
new file mode 100644
index 0000000..597e74d
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/got-reloc-global-addend-1.d
@@ -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.*
diff --git a/ld/testsuite/ld-tic6x/got-reloc-global-addend-1.s b/ld/testsuite/ld-tic6x/got-reloc-global-addend-1.s
new file mode 100644
index 0000000..9b99805
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/got-reloc-global-addend-1.s
@@ -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:
diff --git a/ld/testsuite/ld-tic6x/got-reloc-global-addend-2.d b/ld/testsuite/ld-tic6x/got-reloc-global-addend-2.d
new file mode 100644
index 0000000..44d6319
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/got-reloc-global-addend-2.d
@@ -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.*
diff --git a/ld/testsuite/ld-tic6x/got-reloc-global-addend-2.s b/ld/testsuite/ld-tic6x/got-reloc-global-addend-2.s
new file mode 100644
index 0000000..507cf84
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/got-reloc-global-addend-2.s
@@ -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:
diff --git a/ld/testsuite/ld-tic6x/got-reloc-global.s b/ld/testsuite/ld-tic6x/got-reloc-global.s
new file mode 100644
index 0000000..054c297
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/got-reloc-global.s
@@ -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:
diff --git a/ld/testsuite/ld-tic6x/got-reloc-inrange.d b/ld/testsuite/ld-tic6x/got-reloc-inrange.d
new file mode 100644
index 0000000..e4fed04
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/got-reloc-inrange.d
@@ -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]+...
diff --git a/ld/testsuite/ld-tic6x/got-reloc-local-1.s b/ld/testsuite/ld-tic6x/got-reloc-local-1.s
new file mode 100644
index 0000000..bb3278e
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/got-reloc-local-1.s
@@ -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
diff --git a/ld/testsuite/ld-tic6x/got-reloc-local-2.s b/ld/testsuite/ld-tic6x/got-reloc-local-2.s
new file mode 100644
index 0000000..81f651b
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/got-reloc-local-2.s
@@ -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
diff --git a/ld/testsuite/ld-tic6x/got-reloc-local-r.d b/ld/testsuite/ld-tic6x/got-reloc-local-r.d
new file mode 100644
index 0000000..de13473
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/got-reloc-local-r.d
@@ -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
+ \.\.\.
diff --git a/ld/testsuite/ld-tic6x/got-reloc-overflow.d b/ld/testsuite/ld-tic6x/got-reloc-overflow.d
new file mode 100644
index 0000000..12063ef
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/got-reloc-overflow.d
@@ -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.*
diff --git a/ld/testsuite/ld-tic6x/shlib-1.dd b/ld/testsuite/ld-tic6x/shlib-1.dd
new file mode 100644
index 0000000..d33887e
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1.dd
@@ -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
+ \.\.\.
diff --git a/ld/testsuite/ld-tic6x/shlib-1.rd b/ld/testsuite/ld-tic6x/shlib-1.rd
new file mode 100644
index 0000000..a0232cd
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1.rd
@@ -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 ABS _DYNAMIC
+ 16: 10000130 4 OBJECT 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
diff --git a/ld/testsuite/ld-tic6x/shlib-1.s b/ld/testsuite/ld-tic6x/shlib-1.s
new file mode 100644
index 0000000..cb065a2
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1.s
@@ -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
diff --git a/ld/testsuite/ld-tic6x/shlib-1.sd b/ld/testsuite/ld-tic6x/shlib-1.sd
new file mode 100644
index 0000000..850e383
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/shlib-1b.dd b/ld/testsuite/ld-tic6x/shlib-1b.dd
new file mode 100644
index 0000000..658da73
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1b.dd
@@ -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
+ \.\.\.
diff --git a/ld/testsuite/ld-tic6x/shlib-1b.rd b/ld/testsuite/ld-tic6x/shlib-1b.rd
new file mode 100644
index 0000000..a0232cd
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1b.rd
@@ -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 ABS _DYNAMIC
+ 16: 10000130 4 OBJECT 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
diff --git a/ld/testsuite/ld-tic6x/shlib-1b.sd b/ld/testsuite/ld-tic6x/shlib-1b.sd
new file mode 100644
index 0000000..e1ee8ed
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1b.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/shlib-1r.dd b/ld/testsuite/ld-tic6x/shlib-1r.dd
new file mode 100644
index 0000000..e20eb74
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1r.dd
@@ -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
+ \.\.\.
diff --git a/ld/testsuite/ld-tic6x/shlib-1r.rd b/ld/testsuite/ld-tic6x/shlib-1r.rd
new file mode 100644
index 0000000..a0232cd
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1r.rd
@@ -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 ABS _DYNAMIC
+ 16: 10000130 4 OBJECT 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
diff --git a/ld/testsuite/ld-tic6x/shlib-1r.sd b/ld/testsuite/ld-tic6x/shlib-1r.sd
new file mode 100644
index 0000000..3b3b839
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1r.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/shlib-1rb.dd b/ld/testsuite/ld-tic6x/shlib-1rb.dd
new file mode 100644
index 0000000..ee1a607
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1rb.dd
@@ -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
+ \.\.\.
diff --git a/ld/testsuite/ld-tic6x/shlib-1rb.rd b/ld/testsuite/ld-tic6x/shlib-1rb.rd
new file mode 100644
index 0000000..a0232cd
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1rb.rd
@@ -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 ABS _DYNAMIC
+ 16: 10000130 4 OBJECT 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
diff --git a/ld/testsuite/ld-tic6x/shlib-1rb.sd b/ld/testsuite/ld-tic6x/shlib-1rb.sd
new file mode 100644
index 0000000..5575ff5
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-1rb.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/shlib-2.s b/ld/testsuite/ld-tic6x/shlib-2.s
new file mode 100644
index 0000000..3d786dd
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-2.s
@@ -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
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1.dd b/ld/testsuite/ld-tic6x/shlib-app-1.dd
new file mode 100644
index 0000000..411d47f
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1.dd
@@ -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]*\.\.\.
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1.od b/ld/testsuite/ld-tic6x/shlib-app-1.od
new file mode 100644
index 0000000..f2f5cab
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1.od
@@ -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
+
+
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1.rd b/ld/testsuite/ld-tic6x/shlib-app-1.rd
new file mode 100644
index 0000000..e1809af
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1.rd
@@ -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
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1.s b/ld/testsuite/ld-tic6x/shlib-app-1.s
new file mode 100644
index 0000000..fe254bb
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1.s
@@ -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
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1.sd b/ld/testsuite/ld-tic6x/shlib-app-1.sd
new file mode 100644
index 0000000..4ed3c75
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1b.dd b/ld/testsuite/ld-tic6x/shlib-app-1b.dd
new file mode 100644
index 0000000..5312ff8
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1b.dd
@@ -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]*\.\.\.
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1b.od b/ld/testsuite/ld-tic6x/shlib-app-1b.od
new file mode 100644
index 0000000..4a9c60b
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1b.od
@@ -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
+
+
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1b.rd b/ld/testsuite/ld-tic6x/shlib-app-1b.rd
new file mode 100644
index 0000000..95547b0
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1b.rd
@@ -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
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1b.sd b/ld/testsuite/ld-tic6x/shlib-app-1b.sd
new file mode 100644
index 0000000..1abc406
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1b.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1r.dd b/ld/testsuite/ld-tic6x/shlib-app-1r.dd
new file mode 100644
index 0000000..3e68bf2
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1r.dd
@@ -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]*\.\.\.
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1r.od b/ld/testsuite/ld-tic6x/shlib-app-1r.od
new file mode 100644
index 0000000..15c2973
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1r.od
@@ -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
+
+
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1r.rd b/ld/testsuite/ld-tic6x/shlib-app-1r.rd
new file mode 100644
index 0000000..566f2f9
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1r.rd
@@ -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
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1r.s b/ld/testsuite/ld-tic6x/shlib-app-1r.s
new file mode 100644
index 0000000..a6de900
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1r.s
@@ -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
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1r.sd b/ld/testsuite/ld-tic6x/shlib-app-1r.sd
new file mode 100644
index 0000000..2a849af
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1r.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1rb.dd b/ld/testsuite/ld-tic6x/shlib-app-1rb.dd
new file mode 100644
index 0000000..ad1f28e
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1rb.dd
@@ -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]*\.\.\.
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1rb.od b/ld/testsuite/ld-tic6x/shlib-app-1rb.od
new file mode 100644
index 0000000..c313ed7
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1rb.od
@@ -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
+
+
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1rb.rd b/ld/testsuite/ld-tic6x/shlib-app-1rb.rd
new file mode 100644
index 0000000..be163d9
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1rb.rd
@@ -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
diff --git a/ld/testsuite/ld-tic6x/shlib-app-1rb.sd b/ld/testsuite/ld-tic6x/shlib-app-1rb.sd
new file mode 100644
index 0000000..60a4e8b
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-app-1rb.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/shlib-noindex.dd b/ld/testsuite/ld-tic6x/shlib-noindex.dd
new file mode 100644
index 0000000..bfdf499
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-noindex.dd
@@ -0,0 +1,67 @@
+
+tmpdir/libtestn\.so: file format elf32-tic6x-le
+
+
+Disassembly of section \.plt:
+
+10000020 <sub0@plt-0x18>:
+10000020: 0100036e ldw \.D2T2 \*\+b14\(12\),b2
+10000024: 0080046e ldw \.D2T2 \*\+b14\(16\),b1
+10000028: 00004000 nop 3
+1000002c: 00080362 b \.S2 b2
+10000030: 00008000 nop 5
+10000034: 00000000 nop 1
+
+10000038 <sub0@plt>:
+10000038: 0100056e ldw \.D2T2 \*\+b14\(20\),b2
+1000003c: 0000002a mvk \.S2 0,b0
+10000040: 0000006a mvkh \.S2 0,b0
+10000044: 00002000 nop 2
+10000048: 00080362 b \.S2 b2
+1000004c: 00008000 nop 5
+
+10000050 <sub@plt>:
+10000050: 0100066e ldw \.D2T2 \*\+b14\(24\),b2
+10000054: 0000062a mvk \.S2 12,b0
+10000058: 0000006a mvkh \.S2 0,b0
+1000005c: 00002000 nop 2
+10000060: 00080362 b \.S2 b2
+10000064: 00008000 nop 5
+ \.\.\.
+
+Disassembly of section \.text:
+
+10000080 <sub1>:
+10000080: 000c0362 b \.S2 b3
+10000084: 00008000 nop 5
+
+10000088 <sub0>:
+10000088: 07be09c2 sub \.D2 b15,16,b15
+1000008c: 01bc62f6 stw \.D2T2 b3,\*\+b15\(12\)
+10000090: 073c82f6 stw \.D2T2 b14,\*\+b15\(16\)
+10000094: 0700006e ldw \.D2T2 \*\+b14\(0\),b14
+10000098: 0ffffa12 b \.S2 10000050 <sub@plt>
+1000009c: 0ffff712 b \.S2 10000038 <sub0@plt>
+100000a0: 0ffffc12 b \.S2 10000080 <sub1>
+100000a4: 01bc62e6 ldw \.D2T2 \*\+b15\(12\),b3
+100000a8: 073c82e6 ldw \.D2T2 \*\+b15\(16\),b14
+100000ac: 07800852 addk \.S2 16,b15
+100000b0: 00004000 nop 3
+100000b4: 000c0362 b \.S2 b3
+100000b8: 00008000 nop 5
+100000bc: 00000000 nop 1
+
+100000c0 <sub>:
+100000c0: 07be09c2 sub \.D2 b15,16,b15
+100000c4: 023c62f4 stw \.D2T1 a4,\*\+b15\(12\)
+100000c8: 003c62e4 ldw \.D2T1 \*\+b15\(12\),a0
+100000cc: 00006000 nop 4
+100000d0: 00014940 add \.D1 a0,10,a0
+100000d4: 020008f0 or \.D1 0,a0,a4
+100000d8: 07be0942 add \.D2 b15,16,b15
+100000dc: 000c0362 b \.S2 b3
+100000e0: 0300096e ldw \.D2T2 \*\+b14\(36\),b6
+100000e4: 0380076e ldw \.D2T2 \*\+b14\(28\),b7
+100000e8: 0400086e ldw \.D2T2 \*\+b14\(32\),b8
+100000ec: 04800c6e ldw \.D2T2 \*\+b14\(48\),b9
+ \.\.\.
diff --git a/ld/testsuite/ld-tic6x/shlib-noindex.rd b/ld/testsuite/ld-tic6x/shlib-noindex.rd
new file mode 100644
index 0000000..e9b57c7
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-noindex.rd
@@ -0,0 +1,130 @@
+There are 18 section headers, starting at offset 0x21cc:
+
+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\.text RELA 00008140 001140 00000c 0c A 2 10 4
+ \[ 5\] \.rela\.got RELA 0000814c 00114c 000024 0c A 2 11 4
+ \[ 6\] \.rela\.neardata RELA 00008170 001170 000018 0c A 2 12 4
+ \[ 7\] \.dynamic DYNAMIC 00008188 001188 0000b0 08 WA 3 0 4
+ \[ 8\] \.rela\.plt RELA 10000000 002000 000018 0c A 2 9 4
+ \[ 9\] \.plt PROGBITS 10000020 002020 000060 18 AX 0 0 32
+ \[10\] \.text PROGBITS 10000080 002080 000080 00 AX 0 0 32
+ \[11\] \.got PROGBITS 10000100 002100 000028 00 WA 0 0 4
+ \[12\] \.neardata PROGBITS 10000128 002128 000008 00 WA 0 0 4
+ \[13\] \.bss NOBITS 10000130 002130 000004 00 WA 0 0 4
+ \[14\] \.c6xabi\.attributes C6000_ATTRIBUTES 00000000 002130 000019 00 0 0 1
+ \[15\] \.shstrtab STRTAB 00000000 002149 000080 00 0 0 1
+ \[16\] \.symtab SYMTAB 00000000 00249c 0001b0 10 17 20 4
+ \[17\] \.strtab STRTAB 00000000 00264c 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 0x00238 0x00238 RW 0x1000
+ LOAD 0x002000 0x10000000 0x10000000 0x00130 0x00134 RWE 0x1000
+ DYNAMIC 0x001188 0x00008188 0x00008188 0x000b0 0x000b0 RW 0x4
+ GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x20000 RWE 0x8
+
+ Section to Segment mapping:
+ Segment Sections\.\.\.
+ 00 \.hash \.dynsym \.dynstr \.rela\.text \.rela\.got \.rela\.neardata \.dynamic
+ 01 \.rela\.plt \.plt \.text \.got \.neardata \.bss
+ 02 \.dynamic
+ 03
+
+Dynamic section at offset 0x1188 contains 17 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\) 0x0
+ 0x00000003 \(PLTGOT\) 0x1000010c
+ 0x00000002 \(PLTRELSZ\) 24 \(bytes\)
+ 0x00000014 \(PLTREL\) RELA
+ 0x00000017 \(JMPREL\) 0x10000000
+ 0x00000007 \(RELA\) 0x8140
+ 0x00000008 \(RELASZ\) 96 \(bytes\)
+ 0x00000009 \(RELAENT\) 12 \(bytes\)
+ 0x00000016 \(TEXTREL\) 0x0
+ 0x00000000 \(NULL\) 0x0
+
+Relocation section '\.rela\.text' at offset 0x1140 contains 1 entries:
+ Offset Info Type Sym\. Value Symbol's Name \+ Addend
+10000094 00000618 R_C6000_DSBT_INDEX 10000100 __c6xabi_DSBT_BASE \+ 0
+
+Relocation section '\.rela\.got' at offset 0x114c 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 0x1170 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 9
+ 2: 10000080 0 SECTION LOCAL DEFAULT 10
+ 3: 10000100 0 SECTION LOCAL DEFAULT 11
+ 4: 10000128 0 SECTION LOCAL DEFAULT 12
+ 5: 10000130 0 SECTION LOCAL DEFAULT 13
+ 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 12 g2
+ 10: 10000088 52 FUNC GLOBAL DEFAULT 10 sub0
+ 11: 10000128 4 OBJECT GLOBAL DEFAULT 12 a
+ 12: 100000c0 52 FUNC GLOBAL DEFAULT 10 sub
+
+Symbol table '\.symtab' contains 27 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: 0000814c 0 SECTION LOCAL DEFAULT 5
+ 6: 00008170 0 SECTION LOCAL DEFAULT 6
+ 7: 00008188 0 SECTION LOCAL DEFAULT 7
+ 8: 10000000 0 SECTION LOCAL DEFAULT 8
+ 9: 10000020 0 SECTION LOCAL DEFAULT 9
+ 10: 10000080 0 SECTION LOCAL DEFAULT 10
+ 11: 10000100 0 SECTION LOCAL DEFAULT 11
+ 12: 10000128 0 SECTION LOCAL DEFAULT 12
+ 13: 10000130 0 SECTION LOCAL DEFAULT 13
+ 14: 00000000 0 SECTION LOCAL DEFAULT 14
+ 15: 10000080 0 FUNC LOCAL HIDDEN 10 sub1
+ 16: 00008188 0 OBJECT LOCAL DEFAULT ABS _DYNAMIC
+ 17: 10000130 4 OBJECT LOCAL DEFAULT 13 c
+ 18: 1000010c 0 OBJECT LOCAL DEFAULT ABS _GLOBAL_OFFSET_TABLE_
+ 19: 10000100 0 NOTYPE LOCAL DEFAULT ABS __c6xabi_DSBT_BASE
+ 20: 00000000 0 NOTYPE WEAK DEFAULT UND b
+ 21: 00020000 0 OBJECT GLOBAL DEFAULT ABS __stacksize
+ 22: 00000000 0 NOTYPE WEAK DEFAULT UND g1
+ 23: 1000012c 4 OBJECT GLOBAL DEFAULT 12 g2
+ 24: 10000088 52 FUNC GLOBAL DEFAULT 10 sub0
+ 25: 10000128 4 OBJECT GLOBAL DEFAULT 12 a
+ 26: 100000c0 52 FUNC GLOBAL DEFAULT 10 sub
diff --git a/ld/testsuite/ld-tic6x/shlib-noindex.sd b/ld/testsuite/ld-tic6x/shlib-noindex.sd
new file mode 100644
index 0000000..1ad767d
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/shlib-noindex.sd
@@ -0,0 +1,7 @@
+
+tmpdir/libtestn\.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 .*
diff --git a/ld/testsuite/ld-tic6x/static-app-1.dd b/ld/testsuite/ld-tic6x/static-app-1.dd
new file mode 100644
index 0000000..f3b1b98
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1.dd
@@ -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]*\.\.\.
diff --git a/ld/testsuite/ld-tic6x/static-app-1.od b/ld/testsuite/ld-tic6x/static-app-1.od
new file mode 100644
index 0000000..d07cd6e
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1.od
@@ -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
+
+
diff --git a/ld/testsuite/ld-tic6x/static-app-1.rd b/ld/testsuite/ld-tic6x/static-app-1.rd
new file mode 100644
index 0000000..cec76d4
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1.rd
@@ -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 OBJECT 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 OBJECT 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
diff --git a/ld/testsuite/ld-tic6x/static-app-1.sd b/ld/testsuite/ld-tic6x/static-app-1.sd
new file mode 100644
index 0000000..2f24f40
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/static-app-1b.dd b/ld/testsuite/ld-tic6x/static-app-1b.dd
new file mode 100644
index 0000000..f6ddda7
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1b.dd
@@ -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]*\.\.\.
diff --git a/ld/testsuite/ld-tic6x/static-app-1b.od b/ld/testsuite/ld-tic6x/static-app-1b.od
new file mode 100644
index 0000000..a35d194
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1b.od
@@ -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
+
+
diff --git a/ld/testsuite/ld-tic6x/static-app-1b.rd b/ld/testsuite/ld-tic6x/static-app-1b.rd
new file mode 100644
index 0000000..cec76d4
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1b.rd
@@ -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 OBJECT 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 OBJECT 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
diff --git a/ld/testsuite/ld-tic6x/static-app-1b.sd b/ld/testsuite/ld-tic6x/static-app-1b.sd
new file mode 100644
index 0000000..69f638c
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1b.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/static-app-1r.dd b/ld/testsuite/ld-tic6x/static-app-1r.dd
new file mode 100644
index 0000000..82b3ecd
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1r.dd
@@ -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]*\.\.\.
diff --git a/ld/testsuite/ld-tic6x/static-app-1r.od b/ld/testsuite/ld-tic6x/static-app-1r.od
new file mode 100644
index 0000000..06f8d50
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1r.od
@@ -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
+
+
diff --git a/ld/testsuite/ld-tic6x/static-app-1r.rd b/ld/testsuite/ld-tic6x/static-app-1r.rd
new file mode 100644
index 0000000..cd8bc4c
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1r.rd
@@ -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 OBJECT 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 OBJECT 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
diff --git a/ld/testsuite/ld-tic6x/static-app-1r.sd b/ld/testsuite/ld-tic6x/static-app-1r.sd
new file mode 100644
index 0000000..e01cd49
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1r.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/static-app-1rb.dd b/ld/testsuite/ld-tic6x/static-app-1rb.dd
new file mode 100644
index 0000000..9e211ca
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1rb.dd
@@ -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]*\.\.\.
diff --git a/ld/testsuite/ld-tic6x/static-app-1rb.od b/ld/testsuite/ld-tic6x/static-app-1rb.od
new file mode 100644
index 0000000..13d4255
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1rb.od
@@ -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
+
+
diff --git a/ld/testsuite/ld-tic6x/static-app-1rb.rd b/ld/testsuite/ld-tic6x/static-app-1rb.rd
new file mode 100644
index 0000000..cd8bc4c
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1rb.rd
@@ -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 OBJECT 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 OBJECT 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
diff --git a/ld/testsuite/ld-tic6x/static-app-1rb.sd b/ld/testsuite/ld-tic6x/static-app-1rb.sd
new file mode 100644
index 0000000..8d7bd0d
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/static-app-1rb.sd
@@ -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 .*
diff --git a/ld/testsuite/ld-tic6x/tic6x.exp b/ld/testsuite/ld-tic6x/tic6x.exp
index 3108a09..9bcb554 100644
--- a/ld/testsuite/ld-tic6x/tic6x.exp
+++ b/ld/testsuite/ld-tic6x/tic6x.exp
@@ -1,7 +1,114 @@
-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 without --dsbt-index"
+ "-shared -Tdsbt.ld --dsbt-size=3"
+ "-mdsbt -mpic -mpid=near" {shlib-1.s shlib-2.s}
+ {{readelf -WSsrld shlib-noindex.rd}
+ {objdump "-drj.plt -j.text" shlib-noindex.dd}
+ {objdump -sj.got shlib-noindex.sd}}
+ "libtestn.so"}
+ {"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
diff --git a/ld/testsuite/ld-tic6x/weak-be.d b/ld/testsuite/ld-tic6x/weak-be.d
new file mode 100644
index 0000000..e2f2f90
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/weak-be.d
@@ -0,0 +1,19 @@
+#name: C6X relocs 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
+10000010:[ \t]+0080006e[ \t]+ldw \.D2T2 \*\+b14\(0\),b1
+10000014:[ \t]+00800028[ \t]+mvk \.S1 0,a1
+10000018:[ \t]+00800068[ \t]+mvkh \.S1 0,a1
+1000001c:[ \t]+00000000[ \t]+nop 1
diff --git a/ld/testsuite/ld-tic6x/weak-data.d b/ld/testsuite/ld-tic6x/weak-data.d
new file mode 100644
index 0000000..0ce96e6
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/weak-data.d
@@ -0,0 +1,11 @@
+#name: C6X ABS relocs to undefined weak symbols
+#as: -mlittle-endian
+#ld: -melf32_tic6x_le -Tsbr.ld
+#source: weak.s
+#objdump: -s -j .data
+
+.*: *file format elf32-tic6x-le
+
+
+Contents of section \.data:
+[ \t]+0+80 00000000 00000000[ \t]+\.*[ \t]*
diff --git a/ld/testsuite/ld-tic6x/weak.d b/ld/testsuite/ld-tic6x/weak.d
new file mode 100644
index 0000000..89f4c98
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/weak.d
@@ -0,0 +1,19 @@
+#name: C6X relocs 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
+10000010:[ \t]+0080006e[ \t]+ldw \.D2T2 \*\+b14\(0\),b1
+10000014:[ \t]+00800028[ \t]+mvk \.S1 0,a1
+10000018:[ \t]+00800068[ \t]+mvkh \.S1 0,a1
+1000001c:[ \t]+00000000[ \t]+nop 1
diff --git a/ld/testsuite/ld-tic6x/weak.s b/ld/testsuite/ld-tic6x/weak.s
new file mode 100644
index 0000000..8f9047a
--- /dev/null
+++ b/ld/testsuite/ld-tic6x/weak.s
@@ -0,0 +1,19 @@
+ .weak g
+ .weak g1
+.text
+ b .s2 g
+[a2] b .s2 g
+ b .s2 g
+|| mvk .s1 0, a1
+ ldw .d2t2 *+B14(g1), B1
+ mvkl .s1 g, a1
+ mvkh .s1 g, a1
+
+ .section .data,"aw",@progbits
+ .align 2
+ .type a, @object
+ .size a, 4
+a:
+ .long g1
+ .short g1
+ .byte g1