X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-i370.c;h=f8e825fba549edc39b33aa20c3b49621c2c2c2b2;hb=5430098f1807e084fe4ff5057040d68435f3d8a2;hp=2022aaffcaf973c0f91cde0cff7f18a093594815;hpb=dbaa2011452c7ce7ca612c6298964452dce179eb;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-i370.c b/bfd/elf32-i370.c index 2022aaffca..f8e825fba5 100644 --- a/bfd/elf32-i370.c +++ b/bfd/elf32-i370.c @@ -1,6 +1,5 @@ /* i370-specific support for 32-bit ELF - Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008, 2010, 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 1994-2017 Free Software Foundation, Inc. Written by Ian Lance Taylor, Cygnus Support. Hacked by Linas Vepstas for i370 linas@linas.org @@ -41,11 +40,11 @@ static reloc_howto_type i370_elf_howto_raw[] = /* This reloc does nothing. */ HOWTO (R_I370_NONE, /* type */ 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ + 3, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ + complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_I370_NONE", /* name */ FALSE, /* partial_inplace */ @@ -295,12 +294,22 @@ i370_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, Elf_Internal_Rela *dst) { + unsigned int r_type; + if (!i370_elf_howto_table[ R_I370_ADDR31 ]) /* Initialize howto table. */ i370_elf_howto_init (); - BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_I370_max); - cache_ptr->howto = i370_elf_howto_table[ELF32_R_TYPE (dst->r_info)]; + r_type = ELF32_R_TYPE (dst->r_info); + if (r_type >= R_I370_max) + { + /* xgettext:c-format */ + _bfd_error_handler (_("%B: unrecognised I370 reloc number: %d"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + r_type = R_I370_NONE; + } + cache_ptr->howto = i370_elf_howto_table[r_type]; } /* Hack alert -- the following several routines look generic to me ... @@ -322,8 +331,9 @@ i370_elf_set_private_flags (bfd *abfd, flagword flags) object file when linking. */ static bfd_boolean -i370_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd) +i370_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) { + bfd *obfd = info->output_bfd; flagword old_flags; flagword new_flags; @@ -344,8 +354,9 @@ i370_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd) else /* Incompatible flags. */ { - (*_bfd_error_handler) - ("%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)", + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"), ibfd, (long) new_flags, (long) old_flags); bfd_set_error (bfd_error_bad_value); @@ -420,23 +431,23 @@ i370_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED); - s = bfd_make_section_with_flags (abfd, ".dynsbss", - SEC_ALLOC | SEC_LINKER_CREATED); + s = bfd_make_section_anyway_with_flags (abfd, ".dynsbss", + SEC_ALLOC | SEC_LINKER_CREATED); if (s == NULL) return FALSE; - if (! info->shared) + if (! bfd_link_pic (info)) { - s = bfd_make_section_with_flags (abfd, ".rela.sbss", - flags | SEC_READONLY); + s = bfd_make_section_anyway_with_flags (abfd, ".rela.sbss", + flags | SEC_READONLY); if (s == NULL || ! bfd_set_section_alignment (abfd, s, 2)) return FALSE; } /* XXX beats me, seem to need a rela.text ... */ - s = bfd_make_section_with_flags (abfd, ".rela.text", - flags | SEC_READONLY); + s = bfd_make_section_anyway_with_flags (abfd, ".rela.text", + flags | SEC_READONLY); if (s == NULL || ! bfd_set_section_alignment (abfd, s, 2)) return FALSE; @@ -472,7 +483,7 @@ i370_elf_adjust_dynamic_symbol (struct bfd_link_info *info, && h->ref_regular && !h->def_regular))); - s = bfd_get_section_by_name (dynobj, ".rela.text"); + s = bfd_get_linker_section (dynobj, ".rela.text"); BFD_ASSERT (s != NULL); s->size += sizeof (Elf32_External_Rela); @@ -495,7 +506,7 @@ i370_elf_adjust_dynamic_symbol (struct bfd_link_info *info, only references to the symbol are via the global offset table. For such cases we need not do anything here; the relocations will be handled correctly by relocate_section. */ - if (info->shared) + if (bfd_link_pic (info)) return TRUE; /* We must allocate the symbol in our .dynbss section, which will @@ -513,9 +524,9 @@ i370_elf_adjust_dynamic_symbol (struct bfd_link_info *info, only if there were actually SDAREL relocs for that symbol. */ if (h->size <= elf_gp_size (dynobj)) - s = bfd_get_section_by_name (dynobj, ".dynsbss"); + s = bfd_get_linker_section (dynobj, ".dynsbss"); else - s = bfd_get_section_by_name (dynobj, ".dynbss"); + s = bfd_get_linker_section (dynobj, ".dynbss"); BFD_ASSERT (s != NULL); /* We must generate a R_I370_COPY reloc to tell the dynamic linker to @@ -527,15 +538,15 @@ i370_elf_adjust_dynamic_symbol (struct bfd_link_info *info, asection *srel; if (h->size <= elf_gp_size (dynobj)) - srel = bfd_get_section_by_name (dynobj, ".rela.sbss"); + srel = bfd_get_linker_section (dynobj, ".rela.sbss"); else - srel = bfd_get_section_by_name (dynobj, ".rela.bss"); + srel = bfd_get_linker_section (dynobj, ".rela.bss"); BFD_ASSERT (srel != NULL); srel->size += sizeof (Elf32_External_Rela); h->needs_copy = 1; } - return _bfd_elf_adjust_dynamic_copy (h, s); + return _bfd_elf_adjust_dynamic_copy (info, h, s); } /* Increment the index of a dynamic symbol by a given amount. Called @@ -586,9 +597,9 @@ i370_elf_size_dynamic_sections (bfd *output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (info->executable) + if (bfd_link_executable (info) && !info->nointerp) { - s = bfd_get_section_by_name (dynobj, ".interp"); + s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); s->size = sizeof ELF_DYNAMIC_INTERPRETER; s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; @@ -608,7 +619,7 @@ i370_elf_size_dynamic_sections (bfd *output_bfd, for (p = rela_sections; *p != NULL; p++) { - s = bfd_get_section_by_name (dynobj, *p); + s = bfd_get_linker_section (dynobj, *p); if (s != NULL) s->size = 0; } @@ -705,7 +716,7 @@ i370_elf_size_dynamic_sections (bfd *output_bfd, #define add_dynamic_entry(TAG, VAL) \ _bfd_elf_add_dynamic_entry (info, TAG, VAL) - if (!info->shared) + if (!bfd_link_pic (info)) { if (!add_dynamic_entry (DT_DEBUG, 0)) return FALSE; @@ -747,7 +758,7 @@ i370_elf_size_dynamic_sections (bfd *output_bfd, locations in linker-created sections that do not have externally-visible names. Instead, we should work out precisely which sections relocations are targeted at. */ - if (info->shared) + if (bfd_link_pic (info)) { int c; @@ -796,7 +807,7 @@ i370_elf_check_relocs (bfd *abfd, const Elf_Internal_Rela *rel_end; asection *sreloc; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; #ifdef DEBUG @@ -825,9 +836,13 @@ i370_elf_check_relocs (bfd *abfd, 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; } - if (info->shared) + if (bfd_link_pic (info)) { #ifdef DEBUG fprintf (stderr, @@ -869,20 +884,20 @@ i370_elf_finish_dynamic_sections (bfd *output_bfd, { asection *sdyn; bfd *dynobj = elf_hash_table (info)->dynobj; - asection *sgot = bfd_get_section_by_name (dynobj, ".got"); + asection *sgot = elf_hash_table (info)->sgot; #ifdef DEBUG fprintf (stderr, "i370_elf_finish_dynamic_sections called\n"); #endif - sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); + sdyn = bfd_get_linker_section (dynobj, ".dynamic"); if (elf_hash_table (info)->dynamic_sections_created) { asection *splt; Elf32_External_Dyn *dyncon, *dynconend; - splt = bfd_get_section_by_name (dynobj, ".plt"); + splt = elf_hash_table (info)->splt; BFD_ASSERT (splt != NULL && sdyn != NULL); dyncon = (Elf32_External_Dyn *) sdyn->contents; @@ -890,35 +905,39 @@ i370_elf_finish_dynamic_sections (bfd *output_bfd, for (; dyncon < dynconend; dyncon++) { Elf_Internal_Dyn dyn; - const char *name; + asection *s; bfd_boolean size; bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); switch (dyn.d_tag) { - case DT_PLTGOT: name = ".plt"; size = FALSE; break; - case DT_PLTRELSZ: name = ".rela.plt"; size = TRUE; break; - case DT_JMPREL: name = ".rela.plt"; size = FALSE; break; - default: name = NULL; size = FALSE; break; + case DT_PLTGOT: + s = elf_hash_table (info)->splt; + size = FALSE; + break; + case DT_PLTRELSZ: + s = elf_hash_table (info)->srelplt; + size = TRUE; + break; + case DT_JMPREL: + s = elf_hash_table (info)->srelplt; + size = FALSE; + break; + default: + continue; } - if (name != NULL) + if (s == NULL) + dyn.d_un.d_val = 0; + else { - asection *s; - - s = bfd_get_section_by_name (output_bfd, name); - if (s == NULL) - dyn.d_un.d_val = 0; + if (!size) + dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; else - { - if (! size) - dyn.d_un.d_ptr = s->vma; - else - dyn.d_un.d_val = s->size; - } - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); + dyn.d_un.d_val = s->size; } + bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); } } @@ -936,7 +955,7 @@ i370_elf_finish_dynamic_sections (bfd *output_bfd, elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4; } - if (info->shared) + if (bfd_link_pic (info)) { asection *sdynsym; asection *s; @@ -945,7 +964,7 @@ i370_elf_finish_dynamic_sections (bfd *output_bfd, /* Set up the section symbols for the output sections. */ - sdynsym = bfd_get_section_by_name (dynobj, ".dynsym"); + sdynsym = bfd_get_linker_section (dynobj, ".dynsym"); BFD_ASSERT (sdynsym != NULL); sym.st_size = 0; @@ -1037,7 +1056,7 @@ i370_elf_relocate_section (bfd *output_bfd, _bfd_error_handler ("i370_elf_relocate_section called for %B section %A, %ld relocations%s", input_bfd, input_section, (long) input_section->reloc_count, - (info->relocatable) ? " (relocatable)" : ""); + (bfd_link_relocatable (info)) ? " (relocatable)" : ""); #endif if (!i370_elf_howto_table[ R_I370_ADDR31 ]) @@ -1062,9 +1081,9 @@ i370_elf_relocate_section (bfd *output_bfd, if ((unsigned) r_type >= (unsigned) R_I370_max || !i370_elf_howto_table[(int)r_type]) { - (*_bfd_error_handler) ("%B: unknown relocation type %d", - input_bfd, - (int) r_type); + /* xgettext:c-format */ + _bfd_error_handler (_("%B: unknown relocation type %d"), + input_bfd, (int) r_type); bfd_set_error (bfd_error_bad_value); ret = FALSE; @@ -1087,6 +1106,12 @@ i370_elf_relocate_section (bfd *output_bfd, else { h = sym_hashes[r_symndx - symtab_hdr->sh_info]; + + if (info->wrap_hash != NULL + && (input_section->flags & SEC_DEBUGGING) != 0) + h = ((struct elf_link_hash_entry *) + unwrap_hash_lookup (info, input_bfd, &h->root)); + 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; @@ -1095,7 +1120,7 @@ i370_elf_relocate_section (bfd *output_bfd, || h->root.type == bfd_link_hash_defweak) { sec = h->root.u.def.section; - if (info->shared + if (bfd_link_pic (info) && ((! info->symbolic && h->dynindx != -1) || !h->def_regular) && (input_section->flags & SEC_ALLOC) != 0 @@ -1117,32 +1142,30 @@ i370_elf_relocate_section (bfd *output_bfd, else if (info->unresolved_syms_in_objects == RM_IGNORE && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) ; - else if (!info->relocatable) + else if (!bfd_link_relocatable (info)) { - if ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, - input_section, rel->r_offset, - (info->unresolved_syms_in_objects == RM_GENERATE_ERROR - || ELF_ST_VISIBILITY (h->other)))) - { - ret = FALSE; - continue; - } + (*info->callbacks->undefined_symbol) + (info, h->root.root.string, input_bfd, + input_section, rel->r_offset, + (info->unresolved_syms_in_objects == RM_GENERATE_ERROR + || ELF_ST_VISIBILITY (h->other))); + ret = FALSE; + continue; } } if (sec != NULL && discarded_section (sec)) RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, - rel, relend, howto, contents); + rel, 1, relend, howto, 0, contents); - if (info->relocatable) + if (bfd_link_relocatable (info)) continue; switch ((int) r_type) { default: - (*_bfd_error_handler) - ("%B: unknown relocation type %d for symbol %s", + _bfd_error_handler + (_("%B: unknown relocation type %d for symbol %s"), input_bfd, (int) r_type, sym_name); bfd_set_error (bfd_error_bad_value); @@ -1166,7 +1189,7 @@ i370_elf_relocate_section (bfd *output_bfd, object. */ case (int) R_I370_ADDR31: case (int) R_I370_ADDR16: - if (info->shared + if (bfd_link_pic (info) && r_symndx != STN_UNDEF) { Elf_Internal_Rela outrel; @@ -1282,8 +1305,9 @@ i370_elf_relocate_section (bfd *output_bfd, case (int) R_I370_COPY: case (int) R_I370_RELATIVE: - (*_bfd_error_handler) - ("%B: Relocation %s is not yet supported for symbol %s.", + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: Relocation %s is not yet supported for symbol %s."), input_bfd, i370_elf_howto_table[(int) r_type]->name, sym_name); @@ -1353,7 +1377,7 @@ i370_elf_relocate_section (bfd *output_bfd, return ret; } -#define TARGET_BIG_SYM bfd_elf32_i370_vec +#define TARGET_BIG_SYM i370_elf32_vec #define TARGET_BIG_NAME "elf32-i370" #define ELF_ARCH bfd_arch_i370 #define ELF_MACHINE_CODE EM_S370 @@ -1384,7 +1408,6 @@ i370_elf_relocate_section (bfd *output_bfd, #define elf_backend_section_from_shdr i370_elf_section_from_shdr #define elf_backend_adjust_dynamic_symbol i370_elf_adjust_dynamic_symbol #define elf_backend_check_relocs i370_elf_check_relocs -#define elf_backend_post_process_headers _bfd_elf_set_osabi static int i370_noop (void)