diff options
author | Bernd Schmidt <bernds@codesourcery.com> | 2011-03-31 08:58:28 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@codesourcery.com> | 2011-03-31 08:58:28 +0000 |
commit | ac14530735340ebde54e9d536e3a0fd3e82f36db (patch) | |
tree | 3b0c55c7d997536e48c444d999138e9bc449df3f | |
parent | 53dd76d35f32095e432e4822dbe06f017f7d7069 (diff) | |
download | gdb-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.
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, ¶ms); + } + + 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 |