X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-score.c;h=2e9dd9a2e8fdb1e16d4793c1aadd8cffd94002a6;hb=1a72702bb30ec3f94627cfcae684823b413f20b9;hp=fec177af07106992b6f3fa5515080a32bda19527;hpb=cf35638d431e230d51d54550e8a249e730264ea5;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-score.c b/bfd/elf32-score.c index fec177af07..2e9dd9a2e8 100644 --- a/bfd/elf32-score.c +++ b/bfd/elf32-score.c @@ -1,5 +1,5 @@ /* 32-bit ELF support for S+core. - Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2006-2016 Free Software Foundation, Inc. Contributed by Brain.lin (brain.lin@sunplusct.com) Mei Ligang (ligang@sunnorth.com.cn) @@ -645,7 +645,7 @@ static reloc_howto_type elf32_score_howto_table[] = /* No relocation. */ HOWTO (R_SCORE_NONE, /* type */ 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ + 3, /* size (0 = byte, 1 = short, 2 = long) */ 0, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ @@ -1037,9 +1037,6 @@ score_elf_sort_hash_table_f (struct score_elf_link_hash_entry *h, void *data) { struct score_elf_hash_sort_data *hsd = data; - if (h->root.root.type == bfd_link_hash_warning) - h = (struct score_elf_link_hash_entry *) h->root.root.u.i.link; - /* Symbols without dynamic symbol table entries aren't interesting at all. */ if (h->root.dynindx == -1) return TRUE; @@ -1068,7 +1065,7 @@ score_elf_sort_hash_table_f (struct score_elf_link_hash_entry *h, void *data) static asection * score_elf_got_section (bfd *abfd, bfd_boolean maybe_excluded) { - asection *sgot = bfd_get_section_by_name (abfd, ".got"); + asection *sgot = bfd_get_linker_section (abfd, ".got"); if (sgot == NULL || (! maybe_excluded && (sgot->flags & SEC_EXCLUDE) != 0)) return NULL; @@ -1249,16 +1246,16 @@ score_elf_rel_dyn_section (bfd *dynobj, bfd_boolean create_p) static const char dname[] = ".rel.dyn"; asection *sreloc; - sreloc = bfd_get_section_by_name (dynobj, dname); + sreloc = bfd_get_linker_section (dynobj, dname); if (sreloc == NULL && create_p) { - sreloc = bfd_make_section_with_flags (dynobj, dname, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_LINKER_CREATED - | SEC_READONLY)); + sreloc = bfd_make_section_anyway_with_flags (dynobj, dname, + (SEC_ALLOC + | SEC_LOAD + | SEC_HAS_CONTENTS + | SEC_IN_MEMORY + | SEC_LINKER_CREATED + | SEC_READONLY)); if (sreloc == NULL || ! bfd_set_section_alignment (dynobj, sreloc, SCORE_ELF_LOG_FILE_ALIGN (dynobj))) @@ -1431,7 +1428,7 @@ score_elf_create_got_section (bfd *abfd, /* We have to use an alignment of 2**4 here because this is hardcoded in the function stub generation and in the linker script. */ - s = bfd_make_section_with_flags (abfd, ".got", flags); + s = bfd_make_section_anyway_with_flags (abfd, ".got", flags); if (s == NULL || ! bfd_set_section_alignment (abfd, s, 4)) return FALSE; @@ -1450,7 +1447,7 @@ score_elf_create_got_section (bfd *abfd, h->def_regular = 1; h->type = STT_OBJECT; - if (info->shared && ! bfd_elf_link_record_dynamic_symbol (info, h)) + if (bfd_link_pic (info) && ! bfd_elf_link_record_dynamic_symbol (info, h)) return FALSE; amt = sizeof (struct score_got_info); @@ -2006,7 +2003,7 @@ score_elf_final_link_relocate (reloc_howto_type *howto, elf_gp (output_bfd) = (bh->u.def.value + bh->u.def.section->output_section->vma + bh->u.def.section->output_offset); - else if (info->relocatable) + else if (bfd_link_relocatable (info)) { bfd_vma lo = -1; @@ -2070,7 +2067,7 @@ score_elf_final_link_relocate (reloc_howto_type *howto, g = score_elf_global_got_index (elf_hash_table (info)->dynobj, (struct elf_link_hash_entry *) h); if ((! elf_hash_table (info)->dynamic_sections_created - || (info->shared + || (bfd_link_pic (info) && (info->symbolic || h->root.dynindx == -1) && h->root.def_regular))) { @@ -2121,7 +2118,7 @@ score_elf_final_link_relocate (reloc_howto_type *howto, case R_SCORE_ABS32: case R_SCORE_REL32: - if ((info->shared + if ((bfd_link_pic (info) || (elf_hash_table (info)->dynamic_sections_created && h != NULL && h->root.def_dynamic @@ -2168,7 +2165,7 @@ score_elf_final_link_relocate (reloc_howto_type *howto, if ((offset & 0x1000000) != 0) offset |= 0xfe000000; value += offset; - abs_value = abs (value - rel_addr); + abs_value = value - rel_addr; if ((abs_value & 0xfe000000) != 0) return bfd_reloc_overflow; addend = (addend & ~howto->src_mask) @@ -2244,7 +2241,7 @@ score_elf_final_link_relocate (reloc_howto_type *howto, if ((offset & 0x800) != 0) /* Offset is negative. */ offset |= 0xfffff000; value += offset; - abs_value = abs (value - rel_addr); + abs_value = value - rel_addr; if ((abs_value & 0xfffff000) != 0) return bfd_reloc_overflow; addend = (addend & ~howto->src_mask) | (value & howto->src_mask); @@ -2416,7 +2413,7 @@ s3_bfd_score_elf_relocate_section (bfd *output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { bfd_size_type dynsecsymcount = 0; - if (info->shared) + if (bfd_link_pic (info)) { asection * p; const struct elf_backend_data *bed = get_elf_backend_data (output_bfd); @@ -2467,7 +2464,7 @@ s3_bfd_score_elf_relocate_section (bfd *output_bfd, + sym->st_value); name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec); - if (!info->relocatable + if (!bfd_link_relocatable (info) && (sec->flags & SEC_MERGE) && ELF_ST_TYPE (sym->st_info) == STT_SECTION) { @@ -2607,6 +2604,12 @@ s3_bfd_score_elf_relocate_section (bfd *output_bfd, /* For global symbols we look up the symbol in the hash-table. */ h = ((struct score_elf_link_hash_entry *) elf_sym_hashes (input_bfd) [r_symndx - extsymoff]); + + if (info->wrap_hash != NULL + && (input_section->flags & SEC_DEBUGGING) != 0) + h = ((struct score_elf_link_hash_entry *) + unwrap_hash_lookup (info, input_bfd, &h->root.root)); + /* Find the real hash-table entry for this symbol. */ while (h->root.root.type == bfd_link_hash_indirect || h->root.root.type == bfd_link_hash_warning) @@ -2658,34 +2661,26 @@ s3_bfd_score_elf_relocate_section (bfd *output_bfd, /* If this is a dynamic link, we should have created a _DYNAMIC_LINK symbol in s3_bfd_score_elf_create_dynamic_sections. Otherwise, we should define the symbol with a value of 0. */ - BFD_ASSERT (! info->shared); + BFD_ASSERT (! bfd_link_pic (info)); BFD_ASSERT (bfd_get_section_by_name (output_bfd, ".dynamic") == NULL); relocation = 0; } - else if (!info->relocatable) + else if (!bfd_link_relocatable (info)) { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.root.string, input_bfd, - input_section, rel->r_offset, - (info->unresolved_syms_in_objects == RM_GENERATE_ERROR) - || ELF_ST_VISIBILITY (h->root.other)))) - return bfd_reloc_undefined; + (*info->callbacks->undefined_symbol) + (info, h->root.root.root.string, input_bfd, + input_section, rel->r_offset, + (info->unresolved_syms_in_objects == RM_GENERATE_ERROR) + || ELF_ST_VISIBILITY (h->root.other)); relocation = 0; } } - if (sec != NULL && elf_discarded_section (sec)) - { - /* For relocs against symbols from removed linkonce sections, - or sections discarded by a linker script, we just want the - section contents zeroed. Avoid any special processing. */ - _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset); - rel->r_info = 0; - rel->r_addend = 0; - continue; - } + if (sec != NULL && discarded_section (sec)) + RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, + rel, 1, relend, howto, 0, contents); - if (info->relocatable) + if (bfd_link_relocatable (info)) { /* This is a relocatable link. We don't have to change anything, unless the reloc is against a section symbol, @@ -2722,16 +2717,14 @@ s3_bfd_score_elf_relocate_section (bfd *output_bfd, /* If the overflowing reloc was to an undefined symbol, we have already printed one error message and there is no point complaining again. */ - if (((!h) || (h->root.root.type != bfd_link_hash_undefined)) - && (!((*info->callbacks->reloc_overflow) - (info, NULL, name, howto->name, (bfd_vma) 0, - input_bfd, input_section, rel->r_offset)))) - return FALSE; + if (!h || h->root.root.type != bfd_link_hash_undefined) + (*info->callbacks->reloc_overflow) + (info, NULL, name, howto->name, (bfd_vma) 0, + input_bfd, input_section, rel->r_offset); break; case bfd_reloc_undefined: - if (!((*info->callbacks->undefined_symbol) - (info, name, input_bfd, input_section, rel->r_offset, TRUE))) - return FALSE; + (*info->callbacks->undefined_symbol) + (info, name, input_bfd, input_section, rel->r_offset, TRUE); break; case bfd_reloc_outofrange: @@ -2756,9 +2749,8 @@ s3_bfd_score_elf_relocate_section (bfd *output_bfd, /* fall through */ common_error: - if (!((*info->callbacks->warning) - (info, msg, name, input_bfd, input_section, rel->r_offset))) - return FALSE; + (*info->callbacks->warning) (info, msg, name, input_bfd, + input_section, rel->r_offset); break; } } @@ -2787,7 +2779,7 @@ s3_bfd_score_elf_check_relocs (bfd *abfd, asection *sreloc; const struct elf_backend_data *bed; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; dynobj = elf_hash_table (info)->dynobj; @@ -2846,6 +2838,10 @@ s3_bfd_score_elf_check_relocs (bfd *abfd, { while (h->root.type == bfd_link_hash_indirect) 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; } } @@ -2864,7 +2860,9 @@ s3_bfd_score_elf_check_relocs (bfd *abfd, break; case R_SCORE_ABS32: case R_SCORE_REL32: - if (dynobj == NULL && (info->shared || h != NULL) && (sec->flags & SEC_ALLOC) != 0) + if (dynobj == NULL + && (bfd_link_pic (info) || h != NULL) + && (sec->flags & SEC_ALLOC) != 0) elf_hash_table (info)->dynobj = dynobj = abfd; break; default: @@ -2907,7 +2905,8 @@ s3_bfd_score_elf_check_relocs (bfd *abfd, break; case R_SCORE_ABS32: case R_SCORE_REL32: - if ((info->shared || h != NULL) && (sec->flags & SEC_ALLOC) != 0) + if ((bfd_link_pic (info) || h != NULL) + && (sec->flags & SEC_ALLOC) != 0) { if (sreloc == NULL) { @@ -2916,7 +2915,7 @@ s3_bfd_score_elf_check_relocs (bfd *abfd, return FALSE; } #define SCORE_READONLY_SECTION (SEC_ALLOC | SEC_LOAD | SEC_READONLY) - if (info->shared) + if (bfd_link_pic (info)) { /* When creating a shared object, we must copy these reloc types into the output file as R_SCORE_REL32 relocs. We make room for this reloc @@ -3108,7 +3107,7 @@ s3_bfd_score_elf_adjust_dynamic_symbol (struct bfd_link_info *info, any R_SCORE_ABS32 or R_SCORE_REL32 relocs against it into the output file. */ hscore = (struct score_elf_link_hash_entry *)h; - if (!info->relocatable + if (!bfd_link_relocatable (info) && hscore->possibly_dynamic_relocs != 0 && (h->root.type == bfd_link_hash_defweak || !h->def_regular)) { @@ -3132,7 +3131,7 @@ s3_bfd_score_elf_adjust_dynamic_symbol (struct bfd_link_info *info, if (!h->def_regular) { /* We need .stub section. */ - s = bfd_get_section_by_name (dynobj, SCORE_ELF_STUB_SECTION_NAME); + s = bfd_get_linker_section (dynobj, SCORE_ELF_STUB_SECTION_NAME); BFD_ASSERT (s != NULL); h->root.u.def.section = s; @@ -3199,7 +3198,7 @@ s3_bfd_score_elf_always_size_sections (bfd *output_bfd, /* Calculate the total loadable size of the output. That will give us the maximum number of GOT_PAGE entries required. */ - for (sub = info->input_bfds; sub; sub = sub->link_next) + for (sub = info->input_bfds; sub; sub = sub->link.next) { asection *subsection; @@ -3266,9 +3265,9 @@ s3_bfd_score_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *i if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (!info->shared) + if (!bfd_link_pic (info) && !info->nointerp) { - s = bfd_get_section_by_name (dynobj, ".interp"); + s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); s->size = strlen (ELF_DYNAMIC_INTERPRETER) + 1; s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER; @@ -3426,7 +3425,7 @@ s3_bfd_score_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) | SEC_LINKER_CREATED | SEC_READONLY); /* ABI requests the .dynamic section to be read only. */ - s = bfd_get_section_by_name (abfd, ".dynamic"); + s = bfd_get_linker_section (abfd, ".dynamic"); if (s != NULL) { if (!bfd_set_section_flags (abfd, s, flags)) @@ -3441,17 +3440,17 @@ s3_bfd_score_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) return FALSE; /* Create .stub section. */ - if (bfd_get_section_by_name (abfd, SCORE_ELF_STUB_SECTION_NAME) == NULL) + if (bfd_get_linker_section (abfd, SCORE_ELF_STUB_SECTION_NAME) == NULL) { - s = bfd_make_section_with_flags (abfd, SCORE_ELF_STUB_SECTION_NAME, - flags | SEC_CODE); + s = bfd_make_section_anyway_with_flags (abfd, SCORE_ELF_STUB_SECTION_NAME, + flags | SEC_CODE); if (s == NULL || !bfd_set_section_alignment (abfd, s, 2)) return FALSE; } - if (!info->shared) + if (!bfd_link_pic (info)) { const char *name; @@ -3498,7 +3497,7 @@ s3_bfd_score_elf_finish_dynamic_symbol (bfd *output_bfd, /* This symbol has a stub. Set it up. */ BFD_ASSERT (h->dynindx != -1); - s = bfd_get_section_by_name (dynobj, SCORE_ELF_STUB_SECTION_NAME); + s = bfd_get_linker_section (dynobj, SCORE_ELF_STUB_SECTION_NAME); BFD_ASSERT (s != NULL); /* FIXME: Can h->dynindex be more than 64K? */ @@ -3546,7 +3545,8 @@ s3_bfd_score_elf_finish_dynamic_symbol (bfd *output_bfd, /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ name = h->root.root.string; - if (strcmp (name, "_DYNAMIC") == 0 || strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0) + if (h == elf_hash_table (info)->hdynamic + || h == elf_hash_table (info)->hgot) sym->st_shndx = SHN_ABS; else if (strcmp (name, "_DYNAMIC_LINK") == 0) { @@ -3577,7 +3577,7 @@ s3_bfd_score_elf_finish_dynamic_sections (bfd *output_bfd, dynobj = elf_hash_table (info)->dynobj; - sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); + sdyn = bfd_get_linker_section (dynobj, ".dynamic"); sgot = score_elf_got_section (dynobj, FALSE); if (sgot == NULL) @@ -3614,21 +3614,19 @@ s3_bfd_score_elf_finish_dynamic_sections (bfd *output_bfd, switch (dyn.d_tag) { case DT_RELENT: - s = score_elf_rel_dyn_section (dynobj, FALSE); - BFD_ASSERT (s != NULL); dyn.d_un.d_val = SCORE_ELF_REL_SIZE (dynobj); break; case DT_STRSZ: /* Rewrite DT_STRSZ. */ - dyn.d_un.d_val = _bfd_elf_strtab_size (elf_hash_table (info)->dynstr); - break; + dyn.d_un.d_val + = _bfd_elf_strtab_size (elf_hash_table (info)->dynstr); + break; case DT_PLTGOT: name = ".got"; - s = bfd_get_section_by_name (output_bfd, name); - BFD_ASSERT (s != NULL); - dyn.d_un.d_ptr = s->vma; + s = bfd_get_linker_section (dynobj, name); + dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; break; case DT_SCORE_BASE_ADDRESS: @@ -3661,9 +3659,7 @@ s3_bfd_score_elf_finish_dynamic_sections (bfd *output_bfd, case DT_SCORE_SYMTABNO: name = ".dynsym"; elemsize = SCORE_ELF_SYM_SIZE (output_bfd); - s = bfd_get_section_by_name (output_bfd, name); - BFD_ASSERT (s != NULL); - + s = bfd_get_linker_section (dynobj, name); dyn.d_un.d_val = s->size / elemsize; break; @@ -3914,10 +3910,12 @@ s3_bfd_score_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) case 148: /* Linux/Score 32-bit. */ /* pr_cursig */ - elf_tdata (abfd)->core_signal = score_bfd_get_16 (abfd, note->descdata + 12); + elf_tdata (abfd)->core->signal + = score_bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_lwpid = score_bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core->lwpid + = score_bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; @@ -3927,7 +3925,8 @@ s3_bfd_score_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) } /* Make a ".reg/999" section. */ - return _bfd_elfcore_make_pseudosection (abfd, ".reg", raw_size, note->descpos + offset); + return _bfd_elfcore_make_pseudosection (abfd, ".reg", raw_size, + note->descpos + offset); } static bfd_boolean @@ -3939,8 +3938,10 @@ s3_bfd_score_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return FALSE; case 124: /* Linux/Score elf_prpsinfo. */ - elf_tdata (abfd)->core_program = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); - elf_tdata (abfd)->core_command = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); + elf_tdata (abfd)->core->program + = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); + elf_tdata (abfd)->core->command + = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); } /* Note that for some reason, a spurious space is tacked @@ -3948,7 +3949,7 @@ s3_bfd_score_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) implementations, so strip it off if it exists. */ { - char *command = elf_tdata (abfd)->core_command; + char *command = elf_tdata (abfd)->core->command; int n = strlen (command); if (0 < n && command[n - 1] == ' ') @@ -4365,7 +4366,7 @@ elf32_score_link_hash_table_create (bfd *abfd) struct elf_link_hash_table *ret; bfd_size_type amt = sizeof (struct elf_link_hash_table); - ret = (struct elf_link_hash_table *) bfd_malloc (amt); + ret = (struct elf_link_hash_table *) bfd_zmalloc (amt); if (ret == NULL) return NULL; @@ -4446,9 +4447,9 @@ _bfd_score_elf_common_definition (Elf_Internal_Sym *sym) #define USE_REL 1 -#define TARGET_LITTLE_SYM bfd_elf32_littlescore_vec +#define TARGET_LITTLE_SYM score_elf32_le_vec #define TARGET_LITTLE_NAME "elf32-littlescore" -#define TARGET_BIG_SYM bfd_elf32_bigscore_vec +#define TARGET_BIG_SYM score_elf32_be_vec #define TARGET_BIG_NAME "elf32-bigscore" #define ELF_ARCH bfd_arch_score #define ELF_MACHINE_CODE EM_SCORE