X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-score.c;h=98170df793eb0a0cd5100ae66618254b70316192;hb=086554e8e6b222518f12acab34e6cc7b5af7fde7;hp=3223d46100179c708302296c7089423be5074a6c;hpb=8a5da09b9e326a19e78b20a1021a5148ea0484b0;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-score.c b/bfd/elf32-score.c index 3223d46100..98170df793 100644 --- a/bfd/elf32-score.c +++ b/bfd/elf32-score.c @@ -1,5 +1,5 @@ /* 32-bit ELF support for S+core. - Copyright (C) 2006-2014 Free Software Foundation, Inc. + Copyright (C) 2006-2017 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 */ @@ -1429,7 +1429,8 @@ 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_anyway_with_flags (abfd, ".got", flags); - if (s == NULL + elf_hash_table (info)->sgot = s; + if (s == NULL || ! bfd_set_section_alignment (abfd, s, 4)) return FALSE; @@ -1446,8 +1447,9 @@ score_elf_create_got_section (bfd *abfd, h->non_elf = 0; h->def_regular = 1; h->type = STT_OBJECT; + elf_hash_table (info)->hgot = h; - 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); @@ -1515,7 +1517,7 @@ score_elf_create_local_got_entry (bfd *abfd, { (*loc)->gotidx = -1; /* We didn't allocate enough space in the GOT. */ - (*_bfd_error_handler) + _bfd_error_handler (_("not enough GOT space for local GOT entries")); bfd_set_error (bfd_error_bad_value); return NULL; @@ -2003,7 +2005,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; @@ -2067,7 +2069,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))) { @@ -2118,7 +2120,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 @@ -2165,7 +2167,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) @@ -2241,7 +2243,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); @@ -2413,7 +2415,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); @@ -2464,7 +2466,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) { @@ -2661,18 +2663,17 @@ 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; } } @@ -2681,7 +2682,7 @@ s3_bfd_score_elf_relocate_section (bfd *output_bfd, 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, @@ -2718,16 +2719,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: @@ -2749,12 +2748,11 @@ s3_bfd_score_elf_relocate_section (bfd *output_bfd, default: msg = _("internal error: unknown error"); - /* fall through */ + /* 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; } } @@ -2783,7 +2781,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; @@ -2829,7 +2827,9 @@ s3_bfd_score_elf_check_relocs (bfd *abfd, } else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr)) { - (*_bfd_error_handler) (_("%s: Malformed reloc detected for section %s"), abfd, name); + _bfd_error_handler + /* xgettext:c-format */ + (_("%s: Malformed reloc detected for section %s"), abfd, name); bfd_set_error (bfd_error_bad_value); return FALSE; } @@ -2864,7 +2864,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: @@ -2883,7 +2885,8 @@ s3_bfd_score_elf_check_relocs (bfd *abfd, case R_SCORE_CALL15: if (h == NULL) { - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B: CALL15 reloc at 0x%lx not against global symbol"), abfd, (unsigned long) rel->r_offset); bfd_set_error (bfd_error_bad_value); @@ -2907,7 +2910,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 +2920,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 +3112,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)) { @@ -3199,7 +3203,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,7 +3270,7 @@ 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_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); @@ -3451,7 +3455,7 @@ s3_bfd_score_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) return FALSE; } - if (!info->shared) + if (!bfd_link_pic (info)) { const char *name; @@ -3615,21 +3619,18 @@ 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 = elf_hash_table (info)->sgot; + dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; break; case DT_SCORE_BASE_ADDRESS: @@ -3657,14 +3658,13 @@ s3_bfd_score_elf_finish_dynamic_sections (bfd *output_bfd, } /* In case if we don't have global got symbols we default to setting DT_SCORE_GOTSYM to the same value as - DT_SCORE_SYMTABNO, so we just fall through. */ + DT_SCORE_SYMTABNO. */ + /* Fall through. */ 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; @@ -4021,12 +4021,13 @@ s3_elf32_score_print_private_bfd_data (bfd *abfd, void * ptr) } static bfd_boolean -s3_elf32_score_merge_private_bfd_data (bfd *ibfd, bfd *obfd) +s3_elf32_score_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) { + bfd *obfd = info->output_bfd; flagword in_flags; flagword out_flags; - if (!_bfd_generic_verify_endian_match (ibfd, obfd)) + if (!_bfd_generic_verify_endian_match (ibfd, info)) return FALSE; in_flags = elf_elfheader (ibfd)->e_flags; @@ -4054,9 +4055,8 @@ s3_elf32_score_merge_private_bfd_data (bfd *ibfd, bfd *obfd) } if (((in_flags & EF_SCORE_PIC) != 0) != ((out_flags & EF_SCORE_PIC) != 0)) - { - (*_bfd_error_handler) (_("%B: warning: linking PIC files with non-PIC files"), ibfd); - } + _bfd_error_handler + (_("%B: warning: linking PIC files with non-PIC files"), ibfd); /* FIXME: Maybe dependency fix compatibility should be checked here. */ @@ -4396,12 +4396,12 @@ elf32_score_print_private_bfd_data (bfd *abfd, void * ptr) } static bfd_boolean -elf32_score_merge_private_bfd_data (bfd *ibfd, bfd *obfd) +elf32_score_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) { - if (bfd_get_mach (obfd) == bfd_mach_score3) - return s3_elf32_score_merge_private_bfd_data (ibfd, obfd); + if (bfd_get_mach (info->output_bfd) == bfd_mach_score3) + return s3_elf32_score_merge_private_bfd_data (ibfd, info); else - return s7_elf32_score_merge_private_bfd_data (ibfd, obfd); + return s7_elf32_score_merge_private_bfd_data (ibfd, info); } static bfd_boolean