X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felfxx-tilegx.c;h=9d8b42e1de0804fd93c7b33694a90f20438e6a70;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=eb12695d027f7c2e29a037704fd247ff61988f44;hpb=2571583aed598dd3f9651b53434e5f177a0e3cf7;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elfxx-tilegx.c b/bfd/elfxx-tilegx.c index eb12695d02..9d8b42e1de 100644 --- a/bfd/elfxx-tilegx.c +++ b/bfd/elfxx-tilegx.c @@ -1,5 +1,5 @@ /* TILE-Gx-specific support for ELF. - Copyright (C) 2011-2017 Free Software Foundation, Inc. + Copyright (C) 2011-2020 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -391,7 +391,7 @@ static reloc_howto_type tilegx_elf_howto_table [] = FALSE, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + TRUE), /* pcrel_offset */ HOWTO (R_TILEGX_JUMPOFF_X1_PLT, /* type */ TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */ @@ -405,17 +405,17 @@ static reloc_howto_type tilegx_elf_howto_table [] = FALSE, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + TRUE), /* pcrel_offset */ #define TILEGX_IMM_HOWTO(name, size, bitsize) \ HOWTO (name, 0, size, bitsize, FALSE, 0, \ - complain_overflow_signed, bfd_elf_generic_reloc, \ - #name, FALSE, 0, -1, FALSE) + complain_overflow_signed, bfd_elf_generic_reloc, \ + #name, FALSE, 0, -1, FALSE) #define TILEGX_UIMM_HOWTO(name, size, bitsize) \ HOWTO (name, 0, size, bitsize, FALSE, 0, \ - complain_overflow_unsigned, bfd_elf_generic_reloc, \ - #name, FALSE, 0, -1, FALSE) + complain_overflow_unsigned, bfd_elf_generic_reloc, \ + #name, FALSE, 0, -1, FALSE) TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X0, 0, 8), TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y0, 0, 8), @@ -436,8 +436,8 @@ static reloc_howto_type tilegx_elf_howto_table [] = #define TILEGX_IMM16_HOWTO(name, rshift) \ HOWTO (name, rshift, 1, 16, FALSE, 0, \ - complain_overflow_dont, bfd_elf_generic_reloc, \ - #name, FALSE, 0, 0xffff, FALSE) + complain_overflow_dont, bfd_elf_generic_reloc, \ + #name, FALSE, 0, 0xffff, FALSE) TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0, 0), TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0, 0), @@ -450,8 +450,8 @@ static reloc_howto_type tilegx_elf_howto_table [] = #define TILEGX_IMM16_HOWTO_LAST(name, rshift) \ HOWTO (name, rshift, 1, 16, FALSE, 0, \ - complain_overflow_signed, bfd_elf_generic_reloc, \ - #name, FALSE, 0, 0xffff, FALSE) + complain_overflow_signed, bfd_elf_generic_reloc, \ + #name, FALSE, 0, 0xffff, FALSE) TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST, 0), TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST, 0), @@ -464,8 +464,8 @@ static reloc_howto_type tilegx_elf_howto_table [] = #define TILEGX_IMM16_HOWTO_PCREL(name, rshift) \ HOWTO (name, rshift, 1, 16, TRUE, 0, \ - complain_overflow_dont, bfd_elf_generic_reloc, \ - #name, FALSE, 0, 0xffff, TRUE) + complain_overflow_dont, bfd_elf_generic_reloc, \ + #name, FALSE, 0, 0xffff, TRUE) TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW0_PCREL, 0), TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW0_PCREL, 0), @@ -478,8 +478,8 @@ static reloc_howto_type tilegx_elf_howto_table [] = #define TILEGX_IMM16_HOWTO_LAST_PCREL(name, rshift) \ HOWTO (name, rshift, 1, 16, TRUE, 0, \ - complain_overflow_signed, bfd_elf_generic_reloc, \ - #name, FALSE, 0, 0xffff, TRUE) + complain_overflow_signed, bfd_elf_generic_reloc, \ + #name, FALSE, 0, 0xffff, TRUE) TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW0_LAST_PCREL, 0), TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW0_LAST_PCREL, 0), @@ -525,8 +525,8 @@ static reloc_howto_type tilegx_elf_howto_table [] = #define TILEGX_IMM16_HOWTO_TLS_IE(name, rshift) \ HOWTO (name, rshift, 1, 16, FALSE, 0, \ - complain_overflow_dont, bfd_elf_generic_reloc, \ - #name, FALSE, 0, 0xffff, TRUE) + complain_overflow_dont, bfd_elf_generic_reloc, \ + #name, FALSE, 0, 0xffff, TRUE) TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X0_HW0_TLS_IE, 0), TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X1_HW0_TLS_IE, 0), @@ -540,8 +540,8 @@ static reloc_howto_type tilegx_elf_howto_table [] = #define TILEGX_IMM16_HOWTO_LAST_TLS_IE(name, rshift) \ HOWTO (name, rshift, 1, 16, FALSE, 0, \ - complain_overflow_signed, bfd_elf_generic_reloc, \ - #name, FALSE, 0, 0xffff, TRUE) + complain_overflow_signed, bfd_elf_generic_reloc, \ + #name, FALSE, 0, 0xffff, TRUE) TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE, 0), TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE, 0), @@ -551,24 +551,24 @@ static reloc_howto_type tilegx_elf_howto_table [] = EMPTY_HOWTO (105), HOWTO(R_TILEGX_TLS_DTPMOD64, 0, 0, 0, FALSE, 0, complain_overflow_dont, - bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD64", - FALSE, 0, 0, TRUE), + bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD64", + FALSE, 0, 0, TRUE), HOWTO(R_TILEGX_TLS_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF64", - FALSE, 0, -1, TRUE), + bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF64", + FALSE, 0, -1, TRUE), HOWTO(R_TILEGX_TLS_TPOFF64, 0, 0, 0, FALSE, 0, complain_overflow_dont, - bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF64", - FALSE, 0, 0, TRUE), + bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF64", + FALSE, 0, 0, TRUE), HOWTO(R_TILEGX_TLS_DTPMOD32, 0, 0, 0, FALSE, 0, complain_overflow_dont, - bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD32", - FALSE, 0, 0, TRUE), + bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD32", + FALSE, 0, 0, TRUE), HOWTO(R_TILEGX_TLS_DTPOFF32, 0, 4, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF32", - FALSE, 0, -1, TRUE), + bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF32", + FALSE, 0, -1, TRUE), HOWTO(R_TILEGX_TLS_TPOFF32, 0, 0, 0, FALSE, 0, complain_overflow_dont, - bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF32", - FALSE, 0, 0, TRUE), + bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF32", + FALSE, 0, 0, TRUE), HOWTO (R_TILEGX_TLS_GD_CALL, /* type */ TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */ @@ -582,7 +582,7 @@ static reloc_howto_type tilegx_elf_howto_table [] = FALSE, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + TRUE), /* pcrel_offset */ TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X0_TLS_GD_ADD, 0, 8), TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X1_TLS_GD_ADD, 0, 8), @@ -599,33 +599,33 @@ static reloc_howto_type tilegx_elf_howto_table2 [] = { /* GNU extension to record C++ vtable hierarchy */ HOWTO (R_TILEGX_GNU_VTINHERIT, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - NULL, /* special_function */ - "R_TILEGX_GNU_VTINHERIT", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ + 0, /* rightshift */ + 4, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + NULL, /* special_function */ + "R_TILEGX_GNU_VTINHERIT", /* name */ + FALSE, /* partial_inplace */ + 0, /* src_mask */ + 0, /* dst_mask */ + FALSE), /* pcrel_offset */ /* GNU extension to record C++ vtable member usage */ - HOWTO (R_TILEGX_GNU_VTENTRY, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - _bfd_elf_rel_vtable_reloc_fn, /* special_function */ - "R_TILEGX_GNU_VTENTRY", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ + HOWTO (R_TILEGX_GNU_VTENTRY, /* type */ + 0, /* rightshift */ + 4, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + _bfd_elf_rel_vtable_reloc_fn, /* special_function */ + "R_TILEGX_GNU_VTENTRY", /* name */ + FALSE, /* partial_inplace */ + 0, /* src_mask */ + 0, /* dst_mask */ + FALSE), /* pcrel_offset */ }; @@ -634,8 +634,8 @@ static reloc_howto_type tilegx_elf_howto_table2 [] = typedef struct tilegx_reloc_map { bfd_reloc_code_real_type bfd_reloc_val; - unsigned int tilegx_reloc_val; - reloc_howto_type * table; + unsigned int tilegx_reloc_val; + reloc_howto_type * table; } reloc_map; static const reloc_map tilegx_reloc_map [] = @@ -644,15 +644,15 @@ static const reloc_map tilegx_reloc_map [] = { bfd, tilegx, tilegx_elf_howto_table }, /* Standard relocations. */ - TH_REMAP (BFD_RELOC_NONE, R_TILEGX_NONE) - TH_REMAP (BFD_RELOC_64, R_TILEGX_64) - TH_REMAP (BFD_RELOC_32, R_TILEGX_32) - TH_REMAP (BFD_RELOC_16, R_TILEGX_16) - TH_REMAP (BFD_RELOC_8, R_TILEGX_8) - TH_REMAP (BFD_RELOC_64_PCREL, R_TILEGX_64_PCREL) - TH_REMAP (BFD_RELOC_32_PCREL, R_TILEGX_32_PCREL) - TH_REMAP (BFD_RELOC_16_PCREL, R_TILEGX_16_PCREL) - TH_REMAP (BFD_RELOC_8_PCREL, R_TILEGX_8_PCREL) + TH_REMAP (BFD_RELOC_NONE, R_TILEGX_NONE) + TH_REMAP (BFD_RELOC_64, R_TILEGX_64) + TH_REMAP (BFD_RELOC_32, R_TILEGX_32) + TH_REMAP (BFD_RELOC_16, R_TILEGX_16) + TH_REMAP (BFD_RELOC_8, R_TILEGX_8) + TH_REMAP (BFD_RELOC_64_PCREL, R_TILEGX_64_PCREL) + TH_REMAP (BFD_RELOC_32_PCREL, R_TILEGX_32_PCREL) + TH_REMAP (BFD_RELOC_16_PCREL, R_TILEGX_16_PCREL) + TH_REMAP (BFD_RELOC_8_PCREL, R_TILEGX_8_PCREL) #define SIMPLE_REMAP(t) TH_REMAP (BFD_RELOC_##t, R_##t) @@ -773,41 +773,18 @@ static const reloc_map tilegx_reloc_map [] = #undef SIMPLE_REMAP #undef TH_REMAP - { BFD_RELOC_VTABLE_INHERIT, R_TILEGX_GNU_VTINHERIT, tilegx_elf_howto_table2 }, - { BFD_RELOC_VTABLE_ENTRY, R_TILEGX_GNU_VTENTRY, tilegx_elf_howto_table2 }, + { BFD_RELOC_VTABLE_INHERIT, R_TILEGX_GNU_VTINHERIT, tilegx_elf_howto_table2 }, + { BFD_RELOC_VTABLE_ENTRY, R_TILEGX_GNU_VTENTRY, tilegx_elf_howto_table2 }, }; -/* The TILE-Gx linker needs to keep track of the number of relocs that it - decides to copy as dynamic relocs in check_relocs for each symbol. - This is so that it can later discard them if they are found to be - unnecessary. We store the information in a field extending the - regular ELF linker hash table. */ - -struct tilegx_elf_dyn_relocs -{ - struct tilegx_elf_dyn_relocs *next; - - /* The input section of the reloc. */ - asection *sec; - - /* Total number of relocs copied for the input section. */ - bfd_size_type count; - - /* Number of pc-relative relocs copied for the input section. */ - bfd_size_type pc_count; -}; - /* TILEGX ELF linker hash entry. */ struct tilegx_elf_link_hash_entry { struct elf_link_hash_entry elf; - /* Track dynamic relocs copied for this symbol. */ - struct tilegx_elf_dyn_relocs *dyn_relocs; - #define GOT_UNKNOWN 0 #define GOT_NORMAL 1 #define GOT_TLS_GD 2 @@ -912,7 +889,7 @@ tilegx_put_word_32 (bfd *abfd, bfd_vma val, void *ptr) } reloc_howto_type * -tilegx_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, +tilegx_reloc_type_lookup (bfd * abfd, bfd_reloc_code_real_type code) { unsigned int i; @@ -928,6 +905,10 @@ tilegx_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, - entry->table[0].type); } + /* xgettext:c-format */ + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), + abfd, (int) code); + bfd_set_error (bfd_error_bad_value); return NULL; } @@ -939,16 +920,16 @@ tilegx_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, for (i = 0; i < (sizeof (tilegx_elf_howto_table) - / sizeof (tilegx_elf_howto_table[0])); + / sizeof (tilegx_elf_howto_table[0])); i++) if (tilegx_elf_howto_table[i].name != NULL - && strcasecmp (tilegx_elf_howto_table[i].name, r_name) == 0) + && strcasecmp (tilegx_elf_howto_table[i].name, r_name) == 0) return &tilegx_elf_howto_table[i]; return NULL; } -void +bfd_boolean tilegx_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, Elf_Internal_Rela *dst) @@ -958,11 +939,19 @@ tilegx_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, if (r_type <= (unsigned int) R_TILEGX_IMM8_Y1_TLS_ADD) cache_ptr->howto = &tilegx_elf_howto_table [r_type]; else if (r_type - R_TILEGX_GNU_VTINHERIT - <= (unsigned int) R_TILEGX_GNU_VTENTRY) + <= ((unsigned int) R_TILEGX_GNU_VTENTRY + - (unsigned int) R_TILEGX_GNU_VTINHERIT)) cache_ptr->howto = &tilegx_elf_howto_table2 [r_type - R_TILEGX_GNU_VTINHERIT]; else - abort (); + { + /* xgettext:c-format */ + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + return TRUE; } typedef tilegx_bundle_bits (*tilegx_create_func)(int); @@ -1093,36 +1082,36 @@ tilegx_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel) /* The procedure linkage table starts with the following header: - ld_add r28, r27, 8 - ld r27, r27 + ld_add r28, r27, 8 + ld r27, r27 { - jr r27 - info 10 ## SP not offset, return PC in LR + jr r27 + info 10 ## SP not offset, return PC in LR } Subsequent entries are the following, jumping to the header at the end: { - moveli r28, <_GLOBAL_OFFSET_TABLE_ - 1f + MY_GOT_OFFSET> - lnk r26 + moveli r28, <_GLOBAL_OFFSET_TABLE_ - 1f + MY_GOT_OFFSET> + lnk r26 } 1: { - moveli r27, <_GLOBAL_OFFSET_TABLE_ - 1b> - shl16insli r28, r28, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET> + moveli r27, <_GLOBAL_OFFSET_TABLE_ - 1b> + shl16insli r28, r28, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET> } { - add r28, r26, r28 - shl16insli r27, r27, <_GLOBAL_OFFSET_TABLE_ - 1b> + add r28, r26, r28 + shl16insli r27, r27, <_GLOBAL_OFFSET_TABLE_ - 1b> } { - add r27, r26, r27 - ld r28, r28 - info 10 ## SP not offset, return PC in LR + add r27, r26, r27 + ld r28, r28 + info 10 ## SP not offset, return PC in LR } { - shl16insli r29, zero, MY_PLT_INDEX - jr r28 + shl16insli r29, zero, MY_PLT_INDEX + jr r28 } This code sequence lets the code at at the start of the PLT determine @@ -1133,26 +1122,26 @@ tilegx_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel) If the offset fits in 16 bits, - lnk r26 + lnk r26 1: { - addli r28, r26, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET> - moveli r27, <_GLOBAL_OFFSET_TABLE_ - 1b> + addli r28, r26, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET> + moveli r27, <_GLOBAL_OFFSET_TABLE_ - 1b> } { - shl16insli r29, zero, MY_PLT_INDEX - ld r28, r28 + shl16insli r29, zero, MY_PLT_INDEX + ld r28, r28 } { - add r27, r26, r27 - jr r28 + add r27, r26, r27 + jr r28 } - info 10 ## SP not offset, return PC in LR + info 10 ## SP not offset, return PC in LR For the purpose of backtracing, the procedure linkage table ends with the following tail entry: - info 10 ## SP not offset, return PC in LR + info 10 ## SP not offset, return PC in LR The 32-bit versions are similar, with ld4s replacing ld, and offsets into the GOT being multiples of 4 instead of 8. @@ -1351,8 +1340,8 @@ link_hash_newfunc (struct bfd_hash_entry *entry, if (entry == NULL) { entry = - bfd_hash_allocate (table, - sizeof (struct tilegx_elf_link_hash_entry)); + bfd_hash_allocate (table, + sizeof (struct tilegx_elf_link_hash_entry)); if (entry == NULL) return entry; } @@ -1364,7 +1353,6 @@ link_hash_newfunc (struct bfd_hash_entry *entry, struct tilegx_elf_link_hash_entry *eh; eh = (struct tilegx_elf_link_hash_entry *) entry; - eh->dyn_relocs = NULL; eh->tls_type = GOT_UNKNOWN; } @@ -1377,7 +1365,7 @@ struct bfd_link_hash_table * tilegx_elf_link_hash_table_create (bfd *abfd) { struct tilegx_elf_link_hash_table *ret; - bfd_size_type amt = sizeof (struct tilegx_elf_link_hash_table); + size_t amt = sizeof (struct tilegx_elf_link_hash_table); ret = (struct tilegx_elf_link_hash_table *) bfd_zmalloc (amt); if (ret == NULL) @@ -1446,13 +1434,13 @@ tilegx_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) (bed->dynamic_sec_flags | SEC_READONLY)); if (s == NULL - || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align)) + || !bfd_set_section_alignment (s, bed->s->log_file_align)) return FALSE; htab->srelgot = s; s = s_got = bfd_make_section_anyway_with_flags (abfd, ".got", flags); if (s == NULL - || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align)) + || !bfd_set_section_alignment (s, bed->s->log_file_align)) return FALSE; htab->sgot = s; @@ -1463,8 +1451,7 @@ tilegx_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) { s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags); if (s == NULL - || !bfd_set_section_alignment (abfd, s, - bed->s->log_file_align)) + || !bfd_set_section_alignment (s, bed->s->log_file_align)) return FALSE; htab->sgotplt = s; @@ -1514,37 +1501,6 @@ tilegx_elf_copy_indirect_symbol (struct bfd_link_info *info, edir = (struct tilegx_elf_link_hash_entry *) dir; eind = (struct tilegx_elf_link_hash_entry *) ind; - if (eind->dyn_relocs != NULL) - { - if (edir->dyn_relocs != NULL) - { - struct tilegx_elf_dyn_relocs **pp; - struct tilegx_elf_dyn_relocs *p; - - /* Add reloc counts against the indirect sym to the direct sym - list. Merge any entries against the same section. */ - for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) - { - struct tilegx_elf_dyn_relocs *q; - - for (q = edir->dyn_relocs; q != NULL; q = q->next) - if (q->sec == p->sec) - { - q->pc_count += p->pc_count; - q->count += p->count; - *pp = p->next; - break; - } - if (q == NULL) - pp = &p->next; - } - *pp = edir->dyn_relocs; - } - - edir->dyn_relocs = eind->dyn_relocs; - eind->dyn_relocs = NULL; - } - if (ind->root.type == bfd_link_hash_indirect && dir->got.refcount <= 0) { @@ -1622,7 +1578,7 @@ static int tilegx_elf_tls_transition (struct bfd_link_info *info, int r_type, int is_local, bfd_boolean disable_le_transition) { - if (bfd_link_pic (info)) + if (!bfd_link_executable (info)) return r_type; if (is_local && !disable_le_transition) @@ -1695,7 +1651,7 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, for (rel = relocs; rel < rel_end; rel++) { unsigned int r_type; - unsigned long r_symndx; + unsigned int r_symndx; struct elf_link_hash_entry *h; int tls_type; @@ -1705,7 +1661,7 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr)) { /* xgettext:c-format */ - _bfd_error_handler (_("%B: bad symbol index: %d"), + _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd, r_symndx); return FALSE; } @@ -1718,10 +1674,6 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *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; - - /* PR15323, ref flags aren't set for references in the same - object. */ - h->root.non_ir_ref = 1; } r_type = tilegx_elf_tls_transition (info, r_type, h == NULL, @@ -1734,7 +1686,7 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE: case R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE: case R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE: - if (bfd_link_pic (info)) + if (!bfd_link_executable (info)) goto r_tilegx_plt32; break; @@ -1746,7 +1698,7 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD: BFD_ASSERT (bfd_link_pic (info)); tls_type = GOT_TLS_GD; - goto have_got_reference; + goto have_got_reference; case R_TILEGX_IMM16_X0_HW0_TLS_IE: case R_TILEGX_IMM16_X1_HW0_TLS_IE: @@ -1754,10 +1706,10 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE: case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE: case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE: - tls_type = GOT_TLS_IE; - if (bfd_link_pic (info)) - info->flags |= DF_STATIC_TLS; - goto have_got_reference; + tls_type = GOT_TLS_IE; + if (!bfd_link_executable (info)) + info->flags |= DF_STATIC_TLS; + goto have_got_reference; case R_TILEGX_IMM16_X0_HW0_GOT: case R_TILEGX_IMM16_X1_HW0_GOT: @@ -1765,13 +1717,13 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_TILEGX_IMM16_X1_HW0_LAST_GOT: case R_TILEGX_IMM16_X0_HW1_LAST_GOT: case R_TILEGX_IMM16_X1_HW1_LAST_GOT: - tls_type = GOT_NORMAL; - /* Fall Through */ + tls_type = GOT_NORMAL; + /* Fall Through */ - have_got_reference: + have_got_reference: /* This symbol requires a global offset table entry. */ { - int old_tls_type; + int old_tls_type; if (h != NULL) { @@ -1795,37 +1747,37 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, if (local_got_refcounts == NULL) return FALSE; elf_local_got_refcounts (abfd) = local_got_refcounts; - _bfd_tilegx_elf_local_got_tls_type (abfd) - = (char *) (local_got_refcounts + symtab_hdr->sh_info); + _bfd_tilegx_elf_local_got_tls_type (abfd) + = (char *) (local_got_refcounts + symtab_hdr->sh_info); } local_got_refcounts[r_symndx] += 1; - old_tls_type = _bfd_tilegx_elf_local_got_tls_type (abfd) [r_symndx]; - } - - /* If a TLS symbol is accessed using IE at least once, - there is no point to use dynamic model for it. */ - if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN - && (old_tls_type != GOT_TLS_GD - || tls_type != GOT_TLS_IE)) - { - if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD) - tls_type = old_tls_type; - else - { + old_tls_type = _bfd_tilegx_elf_local_got_tls_type (abfd) [r_symndx]; + } + + /* If a TLS symbol is accessed using IE at least once, + there is no point to use dynamic model for it. */ + if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN + && (old_tls_type != GOT_TLS_GD + || tls_type != GOT_TLS_IE)) + { + if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD) + tls_type = old_tls_type; + else + { _bfd_error_handler /* xgettext:c-format */ - (_("%B: `%s' accessed both as normal and thread local symbol"), - abfd, h ? h->root.root.string : ""); - return FALSE; - } - } - - if (old_tls_type != tls_type) - { - if (h != NULL) - tilegx_elf_hash_entry (h)->tls_type = tls_type; - else - _bfd_tilegx_elf_local_got_tls_type (abfd) [r_symndx] = tls_type; + (_("%pB: `%s' accessed both as normal and thread local symbol"), + abfd, h ? h->root.root.string : ""); + return FALSE; + } + } + + if (old_tls_type != tls_type) + { + if (h != NULL) + tilegx_elf_hash_entry (h)->tls_type = tls_type; + else + _bfd_tilegx_elf_local_got_tls_type (abfd) [r_symndx] = tls_type; } } @@ -1837,7 +1789,7 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, break; case R_TILEGX_TLS_GD_CALL: - if (bfd_link_pic (info)) + if (!bfd_link_executable (info)) { /* These are basically R_TILEGX_JUMPOFF_X1_PLT relocs against __tls_get_addr. */ @@ -1854,7 +1806,7 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, break; /* Fall through */ - case R_TILEGX_JUMPOFF_X1_PLT: + case R_TILEGX_JUMPOFF_X1_PLT: case R_TILEGX_IMM16_X0_HW0_PLT_PCREL: case R_TILEGX_IMM16_X1_HW0_PLT_PCREL: case R_TILEGX_IMM16_X0_HW1_PLT_PCREL: @@ -1876,16 +1828,16 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, need to generate a procedure linkage table after all. */ if (h != NULL) - { - h->needs_plt = 1; - h->plt.refcount += 1; - } + { + h->needs_plt = 1; + h->plt.refcount += 1; + } break; - case R_TILEGX_64_PCREL: - case R_TILEGX_32_PCREL: - case R_TILEGX_16_PCREL: - case R_TILEGX_8_PCREL: + case R_TILEGX_64_PCREL: + case R_TILEGX_32_PCREL: + case R_TILEGX_16_PCREL: + case R_TILEGX_8_PCREL: case R_TILEGX_IMM16_X0_HW0_PCREL: case R_TILEGX_IMM16_X1_HW0_PCREL: case R_TILEGX_IMM16_X0_HW1_PCREL: @@ -1908,10 +1860,10 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, break; /* Fall through. */ - case R_TILEGX_64: - case R_TILEGX_32: - case R_TILEGX_16: - case R_TILEGX_8: + case R_TILEGX_64: + case R_TILEGX_32: + case R_TILEGX_16: + case R_TILEGX_8: case R_TILEGX_HW0: case R_TILEGX_HW1: case R_TILEGX_HW2: @@ -1919,25 +1871,25 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_TILEGX_HW0_LAST: case R_TILEGX_HW1_LAST: case R_TILEGX_HW2_LAST: - case R_TILEGX_COPY: - case R_TILEGX_GLOB_DAT: - case R_TILEGX_JMP_SLOT: - case R_TILEGX_RELATIVE: - case R_TILEGX_BROFF_X1: - case R_TILEGX_JUMPOFF_X1: - case R_TILEGX_IMM8_X0: - case R_TILEGX_IMM8_Y0: - case R_TILEGX_IMM8_X1: - case R_TILEGX_IMM8_Y1: - case R_TILEGX_DEST_IMM8_X1: - case R_TILEGX_MT_IMM14_X1: - case R_TILEGX_MF_IMM14_X1: - case R_TILEGX_MMSTART_X0: - case R_TILEGX_MMEND_X0: - case R_TILEGX_SHAMT_X0: - case R_TILEGX_SHAMT_X1: - case R_TILEGX_SHAMT_Y0: - case R_TILEGX_SHAMT_Y1: + case R_TILEGX_COPY: + case R_TILEGX_GLOB_DAT: + case R_TILEGX_JMP_SLOT: + case R_TILEGX_RELATIVE: + case R_TILEGX_BROFF_X1: + case R_TILEGX_JUMPOFF_X1: + case R_TILEGX_IMM8_X0: + case R_TILEGX_IMM8_Y0: + case R_TILEGX_IMM8_X1: + case R_TILEGX_IMM8_Y1: + case R_TILEGX_DEST_IMM8_X1: + case R_TILEGX_MT_IMM14_X1: + case R_TILEGX_MF_IMM14_X1: + case R_TILEGX_MMSTART_X0: + case R_TILEGX_MMEND_X0: + case R_TILEGX_SHAMT_X0: + case R_TILEGX_SHAMT_X1: + case R_TILEGX_SHAMT_Y0: + case R_TILEGX_SHAMT_Y1: case R_TILEGX_IMM16_X0_HW0: case R_TILEGX_IMM16_X1_HW0: case R_TILEGX_IMM16_X0_HW1: @@ -1997,8 +1949,8 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, && (h->root.type == bfd_link_hash_defweak || !h->def_regular))) { - struct tilegx_elf_dyn_relocs *p; - struct tilegx_elf_dyn_relocs **head; + struct elf_dyn_relocs *p; + struct elf_dyn_relocs **head; /* When creating a shared object, we must copy these relocs into the output file. We create a reloc @@ -2016,8 +1968,7 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, /* If this is a global symbol, we count the number of relocations we need for this symbol. */ if (h != NULL) - head = - &((struct tilegx_elf_link_hash_entry *) h)->dyn_relocs; + head = &h->dyn_relocs; else { /* Track dynamic relocs needed for local syms too. @@ -2038,14 +1989,14 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, s = sec; vpp = &elf_section_data (s)->local_dynrel; - head = (struct tilegx_elf_dyn_relocs **) vpp; + head = (struct elf_dyn_relocs **) vpp; } p = *head; if (p == NULL || p->sec != sec) { - bfd_size_type amt = sizeof *p; - p = ((struct tilegx_elf_dyn_relocs *) + size_t amt = sizeof *p; + p = ((struct elf_dyn_relocs *) bfd_alloc (htab->elf.dynobj, amt)); if (p == NULL) return FALSE; @@ -2103,6 +2054,8 @@ tilegx_elf_gc_mark_hook (asection *sec, dealing with TLS optimization, ought to be !bfd_link_executable (info). */ if (bfd_link_pic (info)) { + struct bfd_link_hash_entry *bh; + switch (TILEGX_ELF_R_TYPE (rel->r_info)) { case R_TILEGX_TLS_GD_CALL: @@ -2111,12 +2064,18 @@ tilegx_elf_gc_mark_hook (asection *sec, on this reloc, so the real symbol and section will be gc marked when processing the other reloc. That lets us handle __tls_get_addr here. */ - h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr", - FALSE, FALSE, TRUE); + bh = NULL; + if (! _bfd_generic_link_add_one_symbol (info, sec->owner, + "__tls_get_addr", 0, + bfd_und_section_ptr, + 0, NULL, FALSE, + FALSE, &bh)) + return NULL; + h = (struct elf_link_hash_entry *) bh; BFD_ASSERT (h != NULL); h->mark = 1; - if (h->u.weakdef != NULL) - h->u.weakdef->mark = 1; + if (h->is_weakalias) + weakdef (h)->mark = 1; sym = NULL; } } @@ -2124,195 +2083,6 @@ tilegx_elf_gc_mark_hook (asection *sec, return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); } -/* Update the got entry reference counts for the section being removed. */ -bfd_boolean -tilegx_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, - asection *sec, const Elf_Internal_Rela *relocs) -{ - struct tilegx_elf_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 (bfd_link_relocatable (info)) - return TRUE; - - BFD_ASSERT (is_tilegx_elf (abfd) || sec->reloc_count == 0); - - elf_section_data (sec)->local_dynrel = NULL; - - htab = tilegx_elf_hash_table (info); - BFD_ASSERT (htab != 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 = TILEGX_ELF_R_SYMNDX (htab, rel->r_info); - if (r_symndx >= symtab_hdr->sh_info) - { - struct tilegx_elf_link_hash_entry *eh; - struct tilegx_elf_dyn_relocs **pp; - struct tilegx_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 tilegx_elf_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 = TILEGX_ELF_R_TYPE (rel->r_info); - r_type = tilegx_elf_tls_transition (info, r_type, h != NULL, - sec->sec_flg0); - switch (r_type) - { - case R_TILEGX_IMM16_X0_HW0_GOT: - case R_TILEGX_IMM16_X1_HW0_GOT: - case R_TILEGX_IMM16_X0_HW0_LAST_GOT: - case R_TILEGX_IMM16_X1_HW0_LAST_GOT: - case R_TILEGX_IMM16_X0_HW1_LAST_GOT: - case R_TILEGX_IMM16_X1_HW1_LAST_GOT: - case R_TILEGX_IMM16_X0_HW0_TLS_GD: - case R_TILEGX_IMM16_X1_HW0_TLS_GD: - case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD: - case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD: - case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD: - case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD: - case R_TILEGX_IMM16_X0_HW0_TLS_IE: - case R_TILEGX_IMM16_X1_HW0_TLS_IE: - case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE: - case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE: - case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE: - case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE: - if (h != NULL) - { - if (h->got.refcount > 0) - h->got.refcount--; - } - else - { - if (local_got_refcounts && - local_got_refcounts[r_symndx] > 0) - local_got_refcounts[r_symndx]--; - } - break; - - case R_TILEGX_64_PCREL: - case R_TILEGX_32_PCREL: - case R_TILEGX_16_PCREL: - case R_TILEGX_8_PCREL: - case R_TILEGX_IMM16_X0_HW0_PCREL: - case R_TILEGX_IMM16_X1_HW0_PCREL: - case R_TILEGX_IMM16_X0_HW1_PCREL: - case R_TILEGX_IMM16_X1_HW1_PCREL: - case R_TILEGX_IMM16_X0_HW2_PCREL: - case R_TILEGX_IMM16_X1_HW2_PCREL: - case R_TILEGX_IMM16_X0_HW3_PCREL: - case R_TILEGX_IMM16_X1_HW3_PCREL: - case R_TILEGX_IMM16_X0_HW0_LAST_PCREL: - case R_TILEGX_IMM16_X1_HW0_LAST_PCREL: - case R_TILEGX_IMM16_X0_HW1_LAST_PCREL: - case R_TILEGX_IMM16_X1_HW1_LAST_PCREL: - case R_TILEGX_IMM16_X0_HW2_LAST_PCREL: - case R_TILEGX_IMM16_X1_HW2_LAST_PCREL: - if (h != NULL - && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) - break; - /* Fall through. */ - - case R_TILEGX_64: - case R_TILEGX_32: - case R_TILEGX_16: - case R_TILEGX_8: - case R_TILEGX_HW0: - case R_TILEGX_HW1: - case R_TILEGX_HW2: - case R_TILEGX_HW3: - case R_TILEGX_HW0_LAST: - case R_TILEGX_HW1_LAST: - case R_TILEGX_HW2_LAST: - case R_TILEGX_COPY: - case R_TILEGX_GLOB_DAT: - case R_TILEGX_JMP_SLOT: - case R_TILEGX_RELATIVE: - case R_TILEGX_BROFF_X1: - case R_TILEGX_JUMPOFF_X1: - case R_TILEGX_IMM8_X0: - case R_TILEGX_IMM8_Y0: - case R_TILEGX_IMM8_X1: - case R_TILEGX_IMM8_Y1: - case R_TILEGX_DEST_IMM8_X1: - case R_TILEGX_MT_IMM14_X1: - case R_TILEGX_MF_IMM14_X1: - case R_TILEGX_MMSTART_X0: - case R_TILEGX_MMEND_X0: - case R_TILEGX_SHAMT_X0: - case R_TILEGX_SHAMT_X1: - case R_TILEGX_SHAMT_Y0: - case R_TILEGX_SHAMT_Y1: - case R_TILEGX_IMM16_X0_HW0: - case R_TILEGX_IMM16_X1_HW0: - case R_TILEGX_IMM16_X0_HW1: - case R_TILEGX_IMM16_X1_HW1: - case R_TILEGX_IMM16_X0_HW2: - case R_TILEGX_IMM16_X1_HW2: - case R_TILEGX_IMM16_X0_HW3: - case R_TILEGX_IMM16_X1_HW3: - case R_TILEGX_IMM16_X0_HW0_LAST: - case R_TILEGX_IMM16_X1_HW0_LAST: - case R_TILEGX_IMM16_X0_HW1_LAST: - case R_TILEGX_IMM16_X1_HW1_LAST: - case R_TILEGX_IMM16_X0_HW2_LAST: - case R_TILEGX_IMM16_X1_HW2_LAST: - if (bfd_link_pic (info)) - break; - /* Fall through. */ - - case R_TILEGX_JUMPOFF_X1_PLT: - case R_TILEGX_IMM16_X0_HW0_PLT_PCREL: - case R_TILEGX_IMM16_X1_HW0_PLT_PCREL: - case R_TILEGX_IMM16_X0_HW1_PLT_PCREL: - case R_TILEGX_IMM16_X1_HW1_PLT_PCREL: - case R_TILEGX_IMM16_X0_HW2_PLT_PCREL: - case R_TILEGX_IMM16_X1_HW2_PLT_PCREL: - case R_TILEGX_IMM16_X0_HW3_PLT_PCREL: - case R_TILEGX_IMM16_X1_HW3_PLT_PCREL: - case R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL: - case R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL: - case R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL: - case R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL: - case R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL: - case R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL: - if (h != NULL) - { - if (h->plt.refcount > 0) - h->plt.refcount--; - } - 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 @@ -2324,8 +2094,6 @@ tilegx_elf_adjust_dynamic_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h) { struct tilegx_elf_link_hash_table *htab; - struct tilegx_elf_link_hash_entry * eh; - struct tilegx_elf_dyn_relocs *p; bfd *dynobj; asection *s, *srel; @@ -2337,7 +2105,7 @@ tilegx_elf_adjust_dynamic_symbol (struct bfd_link_info *info, /* Make sure we know what is going on here. */ BFD_ASSERT (dynobj != NULL && (h->needs_plt - || h->u.weakdef != NULL + || h->is_weakalias || (h->def_dynamic && h->ref_regular && !h->def_regular))); @@ -2353,11 +2121,11 @@ tilegx_elf_adjust_dynamic_symbol (struct bfd_link_info *info, && h->root.type == bfd_link_hash_undefweak)) { /* This case can occur if we saw a R_TILEGX_JUMPOFF_X1_PLT - 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 - R_TILEGX_JUMPOFF_X1 relocation instead. */ + 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 + R_TILEGX_JUMPOFF_X1 relocation instead. */ h->plt.offset = (bfd_vma) -1; h->needs_plt = 0; } @@ -2370,12 +2138,12 @@ tilegx_elf_adjust_dynamic_symbol (struct bfd_link_info *info, /* 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) + if (h->is_weakalias) { - 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; + struct elf_link_hash_entry *def = weakdef (h); + BFD_ASSERT (def->root.type == bfd_link_hash_defined); + h->root.u.def.section = def->root.u.def.section; + h->root.u.def.value = def->root.u.def.value; return TRUE; } @@ -2401,17 +2169,9 @@ tilegx_elf_adjust_dynamic_symbol (struct bfd_link_info *info, return TRUE; } - eh = (struct tilegx_elf_link_hash_entry *) h; - for (p = eh->dyn_relocs; p != NULL; p = p->next) - { - s = p->sec->output_section; - if (s != NULL && (s->flags & SEC_READONLY) != 0) - break; - } - - /* If we didn't find any dynamic relocs in read-only sections, then + /* If we don't find any dynamic relocs in read-only sections, then we'll be keeping the dynamic relocs and avoiding the copy reloc. */ - if (p == NULL) + if (!_bfd_elf_readonly_dynrelocs (h)) { h->non_got_ref = 0; return TRUE; @@ -2458,8 +2218,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) { struct bfd_link_info *info; struct tilegx_elf_link_hash_table *htab; - struct tilegx_elf_link_hash_entry *eh; - struct tilegx_elf_dyn_relocs *p; + struct elf_dyn_relocs *p; if (h->root.type == bfd_link_hash_indirect) return TRUE; @@ -2490,7 +2249,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) s->size = PLT_ENTRY_SIZE; } - h->plt.offset = s->size - PLT_ENTRY_SIZE + PLT_HEADER_SIZE; + h->plt.offset = s->size - PLT_ENTRY_SIZE + PLT_HEADER_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 @@ -2529,7 +2288,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) requiring no TLS entry. */ if (h->got.refcount > 0 && !htab->disable_le_transition - && !bfd_link_pic (info) + && bfd_link_executable (info) && h->dynindx == -1 && tilegx_elf_hash_entry(h)->tls_type == GOT_TLS_IE) h->got.offset = (bfd_vma) -1; @@ -2553,10 +2312,10 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) s->size += TILEGX_ELF_WORD_BYTES (htab); /* TLS_GD entries need 2 consecutive GOT slots. */ if (tls_type == GOT_TLS_GD) - s->size += TILEGX_ELF_WORD_BYTES (htab); + s->size += TILEGX_ELF_WORD_BYTES (htab); dyn = htab->elf.dynamic_sections_created; /* TLS_IE needs one dynamic relocation, - TLS_GD needs two if local symbol and two if global. */ + TLS_GD needs two if local symbol and two if global. */ if (tls_type == GOT_TLS_GD || tls_type == GOT_TLS_IE) htab->elf.srelgot->size += 2 * TILEGX_ELF_RELA_BYTES (htab); else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, @@ -2567,8 +2326,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) else h->got.offset = (bfd_vma) -1; - eh = (struct tilegx_elf_link_hash_entry *) h; - if (eh->dyn_relocs == NULL) + if (h->dyn_relocs == NULL) return TRUE; /* In the shared -Bsymbolic case, discard space allocated for @@ -2581,9 +2339,9 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) { if (SYMBOL_CALLS_LOCAL (info, h)) { - struct tilegx_elf_dyn_relocs **pp; + struct elf_dyn_relocs **pp; - for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) + for (pp = &h->dyn_relocs; (p = *pp) != NULL; ) { p->count -= p->pc_count; p->pc_count = 0; @@ -2596,11 +2354,12 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) /* Also discard relocs on undefined weak syms with non-default visibility. */ - if (eh->dyn_relocs != NULL + if (h->dyn_relocs != NULL && h->root.type == bfd_link_hash_undefweak) { - if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) - eh->dyn_relocs = NULL; + if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT + || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) + h->dyn_relocs = NULL; /* Make sure undefined weak symbols are output as a dynamic symbol in PIEs. */ @@ -2640,13 +2399,13 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) goto keep; } - eh->dyn_relocs = NULL; + h->dyn_relocs = NULL; keep: ; } /* Finally, allocate space. */ - for (p = eh->dyn_relocs; p != NULL; p = p->next) + for (p = h->dyn_relocs; p != NULL; p = p->next) { asection *sreloc = elf_section_data (p->sec)->sreloc; sreloc->size += p->count * TILEGX_ELF_RELA_BYTES (htab); @@ -2655,32 +2414,6 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) return TRUE; } -/* Find any dynamic relocs that apply to read-only sections. */ - -static bfd_boolean -readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf) -{ - struct tilegx_elf_link_hash_entry *eh; - struct tilegx_elf_dyn_relocs *p; - - eh = (struct tilegx_elf_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; -} - /* Return true if the dynamic symbol for a given section should be omitted when creating a shared library. */ @@ -2695,7 +2428,7 @@ tilegx_elf_omit_section_dynsym (bfd *output_bfd, if (strcmp (p->name, ".got") == 0) return FALSE; - return _bfd_elf_link_omit_section_dynsym (output_bfd, info, p); + return _bfd_elf_omit_section_dynsym_default (output_bfd, info, p); } bfd_boolean @@ -2740,7 +2473,7 @@ tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, for (s = ibfd->sections; s != NULL; s = s->next) { - struct tilegx_elf_dyn_relocs *p; + struct elf_dyn_relocs *p; for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next) { @@ -2757,7 +2490,12 @@ tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, srel = elf_section_data (p->sec)->sreloc; srel->size += p->count * TILEGX_ELF_RELA_BYTES (htab); if ((p->sec->output_section->flags & SEC_READONLY) != 0) - info->flags |= DF_TEXTREL; + { + info->flags |= DF_TEXTREL; + + info->callbacks->minfo (_("%pB: dynamic relocation in read-only section `%pA'\n"), + p->sec->owner, p->sec); + } } } } @@ -2778,11 +2516,11 @@ tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, { *local_got = s->size; s->size += TILEGX_ELF_WORD_BYTES (htab); - if (*local_tls_type == GOT_TLS_GD) - s->size += TILEGX_ELF_WORD_BYTES (htab); - if (bfd_link_pic (info) - || *local_tls_type == GOT_TLS_GD - || *local_tls_type == GOT_TLS_IE) + if (*local_tls_type == GOT_TLS_GD) + s->size += TILEGX_ELF_WORD_BYTES (htab); + if (bfd_link_pic (info) + || *local_tls_type == GOT_TLS_GD + || *local_tls_type == GOT_TLS_IE) srel->size += TILEGX_ELF_RELA_BYTES (htab); } else @@ -2812,7 +2550,7 @@ tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, FALSE, FALSE, FALSE); /* Don't allocate .got.plt section if there are no GOT nor PLT - entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */ + entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */ if ((got == NULL || !got->ref_regular_nonweak) && (htab->elf.sgotplt->size @@ -2916,7 +2654,8 @@ tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, /* 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, readonly_dynrelocs, info); + elf_link_hash_traverse (&htab->elf, + _bfd_elf_maybe_set_textrel, info); if (info->flags & DF_TEXTREL) { @@ -3151,7 +2890,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, const char *name; bfd_vma off; bfd_boolean is_plt = FALSE; - + bfd_boolean resolved_to_zero; bfd_boolean unresolved_reloc; r_type = TILEGX_ELF_R_TYPE (rel->r_info); @@ -3160,15 +2899,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, continue; if ((unsigned int)r_type >= ARRAY_SIZE (tilegx_elf_howto_table)) - { - /* Not clear if we need to check here, but just be paranoid. */ - _bfd_error_handler - /* xgettext:c-format */ - (_("%B: unrecognized relocation (0x%x) in section `%A'"), - input_bfd, r_type, input_section); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } + return _bfd_unrecognized_reloc (input_bfd, input_section, r_type); howto = tilegx_elf_howto_table + r_type; @@ -3219,7 +2950,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, name = (bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name)); if (name == NULL || *name == '\0') - name = bfd_section_name (input_bfd, sec); + name = bfd_section_name (sec); } switch (r_type) @@ -3240,9 +2971,9 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, else if (h != NULL) tls_type = tilegx_elf_hash_entry(h)->tls_type; - is_tls_iele = (! bfd_link_pic (info) || tls_type == GOT_TLS_IE); + is_tls_iele = (bfd_link_executable (info) || tls_type == GOT_TLS_IE); is_tls_le = is_tls_iele && (!input_section->sec_flg0 - && !bfd_link_pic (info) + && bfd_link_executable (info) && (h == NULL || h->dynindx == -1)); if (r_type == R_TILEGX_TLS_GD_CALL) @@ -3387,7 +3118,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, break; case R_TILEGX_TLS_IE_LOAD: if (!input_section->sec_flg0 - && !bfd_link_pic (info) + && bfd_link_executable (info) && (h == NULL || h->dynindx == -1)) { /* IE -> LE */ @@ -3413,6 +3144,9 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, break; } + resolved_to_zero = (h != NULL + && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)); + switch (r_type) { case R_TILEGX_IMM16_X0_HW0_GOT: @@ -3472,7 +3206,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, off = local_got_offsets[r_symndx]; /* The offset must always be a multiple of 8 on 64-bit. - We use the least significant bit to record + We use the least significant bit to record whether we have already processed this entry. */ if ((off & 1) != 0) off &= ~1; @@ -3506,7 +3240,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, relocation = off - got_base; break; - case R_TILEGX_JUMPOFF_X1_PLT: + case R_TILEGX_JUMPOFF_X1_PLT: case R_TILEGX_IMM16_X0_HW0_PLT_PCREL: case R_TILEGX_IMM16_X1_HW0_PLT_PCREL: case R_TILEGX_IMM16_X0_HW1_PLT_PCREL: @@ -3523,7 +3257,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL: /* Relocation is to the entry for this symbol in the procedure linkage table. */ - BFD_ASSERT (h != NULL); + BFD_ASSERT (h != NULL); if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL) { @@ -3539,10 +3273,10 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, unresolved_reloc = FALSE; break; - case R_TILEGX_64_PCREL: - case R_TILEGX_32_PCREL: - case R_TILEGX_16_PCREL: - case R_TILEGX_8_PCREL: + case R_TILEGX_64_PCREL: + case R_TILEGX_32_PCREL: + case R_TILEGX_16_PCREL: + case R_TILEGX_8_PCREL: case R_TILEGX_IMM16_X0_HW0_PCREL: case R_TILEGX_IMM16_X1_HW0_PCREL: case R_TILEGX_IMM16_X0_HW1_PCREL: @@ -3561,10 +3295,10 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) break; /* Fall through. */ - case R_TILEGX_64: - case R_TILEGX_32: - case R_TILEGX_16: - case R_TILEGX_8: + case R_TILEGX_64: + case R_TILEGX_32: + case R_TILEGX_16: + case R_TILEGX_8: case R_TILEGX_HW0: case R_TILEGX_HW1: case R_TILEGX_HW2: @@ -3572,25 +3306,25 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_TILEGX_HW0_LAST: case R_TILEGX_HW1_LAST: case R_TILEGX_HW2_LAST: - case R_TILEGX_COPY: - case R_TILEGX_GLOB_DAT: - case R_TILEGX_JMP_SLOT: - case R_TILEGX_RELATIVE: - case R_TILEGX_BROFF_X1: - case R_TILEGX_JUMPOFF_X1: - case R_TILEGX_IMM8_X0: - case R_TILEGX_IMM8_Y0: - case R_TILEGX_IMM8_X1: - case R_TILEGX_IMM8_Y1: - case R_TILEGX_DEST_IMM8_X1: - case R_TILEGX_MT_IMM14_X1: - case R_TILEGX_MF_IMM14_X1: - case R_TILEGX_MMSTART_X0: - case R_TILEGX_MMEND_X0: - case R_TILEGX_SHAMT_X0: - case R_TILEGX_SHAMT_X1: - case R_TILEGX_SHAMT_Y0: - case R_TILEGX_SHAMT_Y1: + case R_TILEGX_COPY: + case R_TILEGX_GLOB_DAT: + case R_TILEGX_JMP_SLOT: + case R_TILEGX_RELATIVE: + case R_TILEGX_BROFF_X1: + case R_TILEGX_JUMPOFF_X1: + case R_TILEGX_IMM8_X0: + case R_TILEGX_IMM8_Y0: + case R_TILEGX_IMM8_X1: + case R_TILEGX_IMM8_Y1: + case R_TILEGX_DEST_IMM8_X1: + case R_TILEGX_MT_IMM14_X1: + case R_TILEGX_MF_IMM14_X1: + case R_TILEGX_MMSTART_X0: + case R_TILEGX_MMEND_X0: + case R_TILEGX_SHAMT_X0: + case R_TILEGX_SHAMT_X1: + case R_TILEGX_SHAMT_Y0: + case R_TILEGX_SHAMT_Y1: case R_TILEGX_IMM16_X0_HW0: case R_TILEGX_IMM16_X1_HW0: case R_TILEGX_IMM16_X0_HW1: @@ -3610,7 +3344,8 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if ((bfd_link_pic (info) && (h == NULL - || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + && !resolved_to_zero) || h->root.type != bfd_link_hash_undefweak) && (! howto->pc_relative || !SYMBOL_CALLS_LOCAL (info, h))) @@ -3646,10 +3381,10 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, switch (r_type) { - case R_TILEGX_64_PCREL: - case R_TILEGX_32_PCREL: - case R_TILEGX_16_PCREL: - case R_TILEGX_8_PCREL: + case R_TILEGX_64_PCREL: + case R_TILEGX_32_PCREL: + case R_TILEGX_16_PCREL: + case R_TILEGX_8_PCREL: /* If the symbol is not dynamic, we should not keep a dynamic relocation. But an .rela.* slot has been allocated for it, output R_TILEGX_NONE. @@ -3723,7 +3458,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, { BFD_FAIL (); _bfd_error_handler - (_("%B: probably compiled without -fPIC?"), + (_("%pB: probably compiled without -fPIC?"), input_bfd); bfd_set_error (bfd_error_bad_value); return FALSE; @@ -3744,13 +3479,13 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } break; - case R_TILEGX_IMM16_X0_HW0_TLS_LE: - case R_TILEGX_IMM16_X1_HW0_TLS_LE: - case R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE: - case R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE: - case R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE: - case R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE: - if (bfd_link_pic (info)) + case R_TILEGX_IMM16_X0_HW0_TLS_LE: + case R_TILEGX_IMM16_X1_HW0_TLS_LE: + case R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE: + case R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE: + case R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE: + case R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE: + if (!bfd_link_executable (info)) { Elf_Internal_Rela outrel; bfd_boolean skip; @@ -3781,28 +3516,28 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, relocation = tpoff (info, relocation); break; - case R_TILEGX_IMM16_X0_HW0_TLS_GD: - case R_TILEGX_IMM16_X1_HW0_TLS_GD: - case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD: - case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD: - case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD: - case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD: - case R_TILEGX_IMM16_X0_HW0_TLS_IE: - case R_TILEGX_IMM16_X1_HW0_TLS_IE: - case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE: - case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE: - case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE: - case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE: + case R_TILEGX_IMM16_X0_HW0_TLS_GD: + case R_TILEGX_IMM16_X1_HW0_TLS_GD: + case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD: + case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD: + case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD: + case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD: + case R_TILEGX_IMM16_X0_HW0_TLS_IE: + case R_TILEGX_IMM16_X1_HW0_TLS_IE: + case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE: + case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE: + case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE: + case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE: r_type = tilegx_elf_tls_transition (info, r_type, h == NULL, input_section->sec_flg0); - tls_type = GOT_UNKNOWN; + tls_type = GOT_UNKNOWN; if (h == NULL && local_got_offsets) tls_type = _bfd_tilegx_elf_local_got_tls_type (input_bfd) [r_symndx]; else if (h != NULL) { tls_type = tilegx_elf_hash_entry(h)->tls_type; - if (!bfd_link_pic (info) + if (bfd_link_executable (info) && h->dynindx == -1 && tls_type == GOT_TLS_IE) r_type = (!input_section->sec_flg0 @@ -3852,8 +3587,8 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (h != NULL) { - bfd_boolean dyn; - dyn = htab->elf.dynamic_sections_created; + bfd_boolean dyn; + dyn = htab->elf.dynamic_sections_created; if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), @@ -3866,15 +3601,15 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } /* The GOT entries have not been initialized yet. Do it - now, and emit any relocations. */ + now, and emit any relocations. */ if ((bfd_link_pic (info) || indx != 0) && (h == NULL || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT || h->root.type != bfd_link_hash_undefweak)) need_relocs = TRUE; - switch (r_type) - { + switch (r_type) + { case R_TILEGX_IMM16_X0_HW0_TLS_IE: case R_TILEGX_IMM16_X1_HW0_TLS_IE: case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE: @@ -3884,20 +3619,20 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (need_relocs) { TILEGX_ELF_PUT_WORD (htab, output_bfd, 0, htab->elf.sgot->contents + off); - outrel.r_offset = (htab->elf.sgot->output_section->vma + outrel.r_offset = (htab->elf.sgot->output_section->vma + htab->elf.sgot->output_offset + off); - outrel.r_addend = 0; + outrel.r_addend = 0; if (indx == 0) - outrel.r_addend = relocation - dtpoff_base (info); + outrel.r_addend = relocation - dtpoff_base (info); outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx, TILEGX_ELF_TPOFF_RELOC (htab)); tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel); - } else { + } else { TILEGX_ELF_PUT_WORD (htab, output_bfd, tpoff (info, relocation), htab->elf.sgot->contents + off); - } - break; + } + break; case R_TILEGX_IMM16_X0_HW0_TLS_GD: case R_TILEGX_IMM16_X1_HW0_TLS_GD: @@ -3906,40 +3641,40 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD: case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD: if (need_relocs) { - outrel.r_offset = (htab->elf.sgot->output_section->vma + outrel.r_offset = (htab->elf.sgot->output_section->vma + htab->elf.sgot->output_offset + off); - outrel.r_addend = 0; - outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx, + outrel.r_addend = 0; + outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx, TILEGX_ELF_DTPMOD_RELOC (htab)); TILEGX_ELF_PUT_WORD (htab, output_bfd, 0, htab->elf.sgot->contents + off); - tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel); + tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel); if (indx == 0) - { - BFD_ASSERT (! unresolved_reloc); + { + BFD_ASSERT (! unresolved_reloc); TILEGX_ELF_PUT_WORD (htab, output_bfd, relocation - dtpoff_base (info), (htab->elf.sgot->contents + off + TILEGX_ELF_WORD_BYTES (htab))); - } + } else - { + { TILEGX_ELF_PUT_WORD (htab, output_bfd, 0, (htab->elf.sgot->contents + off + TILEGX_ELF_WORD_BYTES (htab))); - outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx, + outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx, TILEGX_ELF_DTPOFF_RELOC (htab)); - outrel.r_offset += TILEGX_ELF_WORD_BYTES (htab); - tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel); - } - } + outrel.r_offset += TILEGX_ELF_WORD_BYTES (htab); + tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel); + } + } else { /* If we are not emitting relocations for a - general dynamic reference, then we must be in a - static link or an executable link with the - symbol binding locally. Mark it as belonging - to module 1, the executable. */ + general dynamic reference, then we must be in a + static link or an executable link with the + symbol binding locally. Mark it as belonging + to module 1, the executable. */ TILEGX_ELF_PUT_WORD (htab, output_bfd, 1, htab->elf.sgot->contents + off ); TILEGX_ELF_PUT_WORD (htab, output_bfd, @@ -3947,8 +3682,8 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, htab->elf.sgot->contents + off + TILEGX_ELF_WORD_BYTES (htab)); } - break; - } + break; + } } if (off >= (bfd_vma) -2) @@ -3973,10 +3708,11 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, rel->r_offset) != (bfd_vma) -1) _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"), + (_("%pB(%pA+%#" PRIx64 "): " + "unresolvable %s relocation against symbol `%s'"), input_bfd, input_section, - (long) rel->r_offset, + (uint64_t) rel->r_offset, howto->name, h->root.root.string); @@ -3986,49 +3722,49 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, create_func = reloc_to_create_func[r_type]; if (create_func == NULL) { - r = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, - relocation, rel->r_addend); + r = _bfd_final_link_relocate (howto, input_bfd, input_section, + contents, rel->r_offset, + relocation, rel->r_addend); } else { - if (howto->pc_relative) - { - relocation -= - input_section->output_section->vma + input_section->output_offset; - if (howto->pcrel_offset) - relocation -= rel->r_offset; - } - - bfd_byte *data; - - /* Add the relocation addend if any to the final target value */ - relocation += rel->r_addend; - - /* Do basic range checking */ - r = bfd_check_overflow (howto->complain_on_overflow, - howto->bitsize, - howto->rightshift, - TILEGX_ELF_WORD_BYTES (htab) * 8, - relocation); - - /* - * Write the relocated value out into the raw section data. - * Don't put a relocation out in the .rela section. - */ - tilegx_bundle_bits mask = create_func(-1); - tilegx_bundle_bits value = create_func(relocation >> howto->rightshift); - - /* Only touch bytes while the mask is not 0, so we - don't write to out of bounds memory if this is actually - a 16-bit switch instruction. */ - for (data = contents + rel->r_offset; mask != 0; data++) - { - bfd_byte byte_mask = (bfd_byte)mask; - *data = (*data & ~byte_mask) | ((bfd_byte)value & byte_mask); - mask >>= 8; - value >>= 8; - } + if (howto->pc_relative) + { + relocation -= + input_section->output_section->vma + input_section->output_offset; + if (howto->pcrel_offset) + relocation -= rel->r_offset; + } + + bfd_byte *data; + + /* Add the relocation addend if any to the final target value */ + relocation += rel->r_addend; + + /* Do basic range checking */ + r = bfd_check_overflow (howto->complain_on_overflow, + howto->bitsize, + howto->rightshift, + TILEGX_ELF_WORD_BYTES (htab) * 8, + relocation); + + /* + * Write the relocated value out into the raw section data. + * Don't put a relocation out in the .rela section. + */ + tilegx_bundle_bits mask = create_func(-1); + tilegx_bundle_bits value = create_func(relocation >> howto->rightshift); + + /* Only touch bytes while the mask is not 0, so we + don't write to out of bounds memory if this is actually + a 16-bit switch instruction. */ + for (data = contents + rel->r_offset; mask != 0; data++) + { + bfd_byte byte_mask = (bfd_byte)mask; + *data = (*data & ~byte_mask) | ((bfd_byte)value & byte_mask); + mask >>= 8; + value >>= 8; + } } if (r != bfd_reloc_ok) @@ -4198,7 +3934,7 @@ tilegx_elf_finish_dynamic_symbol (bfd *output_bfd, /* This symbols needs a copy reloc. Set it up. */ BFD_ASSERT (h->dynindx != -1); - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss; @@ -4293,7 +4029,7 @@ tilegx_elf_finish_dynamic_sections (bfd *output_bfd, ret = tilegx_finish_dyn (output_bfd, info, dynobj, sdyn, splt); - if (ret != TRUE) + if (!ret) return ret; /* Fill in the head and tail entries in the procedure linkage table. */ @@ -4313,10 +4049,10 @@ tilegx_elf_finish_dynamic_sections (bfd *output_bfd, entry size. */ pad_size = PLT_ENTRY_SIZE - PLT_HEADER_SIZE - PLT_TAIL_SIZE; memset (splt->contents + splt->size - pad_size, 0, pad_size); - } - elf_section_data (splt->output_section)->this_hdr.sh_entsize - = PLT_ENTRY_SIZE; + elf_section_data (splt->output_section)->this_hdr.sh_entsize + = PLT_ENTRY_SIZE; + } } if (htab->elf.sgotplt) @@ -4324,7 +4060,7 @@ tilegx_elf_finish_dynamic_sections (bfd *output_bfd, if (bfd_is_abs_section (htab->elf.sgotplt->output_section)) { _bfd_error_handler - (_("discarded output section: `%A'"), htab->elf.sgotplt); + (_("discarded output section: `%pA'"), htab->elf.sgotplt); return FALSE; } @@ -4337,10 +4073,10 @@ tilegx_elf_finish_dynamic_sections (bfd *output_bfd, TILEGX_ELF_PUT_WORD (htab, output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE (htab)); - } - elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize = - GOT_ENTRY_SIZE (htab); + elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize = + GOT_ENTRY_SIZE (htab); + } } if (htab->elf.sgot) @@ -4354,10 +4090,10 @@ tilegx_elf_finish_dynamic_sections (bfd *output_bfd, 0); TILEGX_ELF_PUT_WORD (htab, output_bfd, val, htab->elf.sgot->contents); - } - elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = - GOT_ENTRY_SIZE (htab); + elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = + GOT_ENTRY_SIZE (htab); + } } return TRUE; @@ -4433,7 +4169,7 @@ _bfd_tilegx_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) { _bfd_error_handler /* xgettext:c-format */ - (_("%B: Cannot link together %s and %s objects."), + (_("%pB: cannot link together %s and %s objects"), ibfd, targ1, targ2); bfd_set_error (bfd_error_bad_value); return FALSE;