X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-score.c;h=2e9dd9a2e8fdb1e16d4793c1aadd8cffd94002a6;hb=0c117286270e8166022900f4e5fef89719ccd2dc;hp=3223d46100179c708302296c7089423be5074a6c;hpb=8a5da09b9e326a19e78b20a1021a5148ea0484b0;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-score.c b/bfd/elf32-score.c index 3223d46100..2e9dd9a2e8 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-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 */ @@ -1447,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); @@ -2003,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; @@ -2067,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))) { @@ -2118,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 @@ -2165,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) @@ -2241,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); @@ -2413,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); @@ -2464,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) { @@ -2661,18 +2661,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 +2680,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 +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: @@ -2752,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; } } @@ -2783,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; @@ -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)) { @@ -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,7 +3265,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 +3450,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 +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: @@ -3662,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;