| Index: bfd/elf32-sh.c
|
| diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c
|
| index cbd00aa64043de5eef249b8d78a7f622f8d0fdd9..86fe1b3377e8e1bb9c85e8c5d9ea1fd9a665cdc5 100644
|
| --- a/bfd/elf32-sh.c
|
| +++ b/bfd/elf32-sh.c
|
| @@ -1,6 +1,6 @@
|
| /* Renesas / SuperH SH specific support for 32-bit ELF
|
| Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
| - 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
| + 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
|
| Free Software Foundation, Inc.
|
| Contributed by Ian Lance Taylor, Cygnus Support.
|
|
|
| @@ -2549,7 +2549,7 @@ sh_elf_link_hash_table_create (bfd *abfd)
|
| struct elf_sh_link_hash_table *ret;
|
| bfd_size_type amt = sizeof (struct elf_sh_link_hash_table);
|
|
|
| - ret = (struct elf_sh_link_hash_table *) bfd_malloc (amt);
|
| + ret = (struct elf_sh_link_hash_table *) bfd_zmalloc (amt);
|
| if (ret == (struct elf_sh_link_hash_table *) NULL)
|
| return NULL;
|
|
|
| @@ -2562,17 +2562,6 @@ sh_elf_link_hash_table_create (bfd *abfd)
|
| return NULL;
|
| }
|
|
|
| - ret->sgot = NULL;
|
| - ret->sgotplt = NULL;
|
| - ret->srelgot = NULL;
|
| - ret->splt = NULL;
|
| - ret->srelplt = NULL;
|
| - ret->sdynbss = NULL;
|
| - ret->srelbss = NULL;
|
| - ret->srelplt2 = NULL;
|
| - ret->sym_cache.abfd = NULL;
|
| - ret->tls_ldm_got.refcount = 0;
|
| - ret->plt_info = NULL;
|
| ret->vxworks_p = vxworks_object_p (abfd);
|
| ret->fdpic_p = fdpic_object_p (abfd);
|
|
|
| @@ -3314,86 +3303,13 @@ sh_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
|
| {
|
| sh_elf_hash_table (info)->plt_info = get_plt_info (output_bfd, info->shared);
|
|
|
| - if (sh_elf_hash_table (info)->fdpic_p && !info->relocatable)
|
| - {
|
| - struct elf_link_hash_entry *h;
|
| -
|
| - /* Force a PT_GNU_STACK segment to be created. */
|
| - if (! elf_tdata (output_bfd)->stack_flags)
|
| - elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
|
| -
|
| - /* Define __stacksize if it's not defined yet. */
|
| - h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
|
| - FALSE, FALSE, FALSE);
|
| - if (! h || h->root.type != bfd_link_hash_defined
|
| - || h->type != STT_OBJECT
|
| - || !h->def_regular)
|
| - {
|
| - struct bfd_link_hash_entry *bh = NULL;
|
| -
|
| - if (!(_bfd_generic_link_add_one_symbol
|
| - (info, output_bfd, "__stacksize",
|
| - BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
|
| - (const char *) NULL, FALSE,
|
| - get_elf_backend_data (output_bfd)->collect, &bh)))
|
| - return FALSE;
|
| -
|
| - h = (struct elf_link_hash_entry *) bh;
|
| - h->def_regular = 1;
|
| - h->type = STT_OBJECT;
|
| - }
|
| - }
|
| - return TRUE;
|
| -}
|
| -
|
| -#if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
|
| -
|
| -static bfd_boolean
|
| -sh_elf_modify_program_headers (bfd *output_bfd, struct bfd_link_info *info)
|
| -{
|
| - struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
|
| - struct elf_segment_map *m;
|
| - Elf_Internal_Phdr *p;
|
| -
|
| - /* objcopy and strip preserve what's already there using
|
| - sh_elf_copy_private_bfd_data (). */
|
| - if (! info)
|
| - return TRUE;
|
| -
|
| - for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
|
| - if (m->p_type == PT_GNU_STACK)
|
| - break;
|
| -
|
| - if (m)
|
| - {
|
| - struct elf_link_hash_entry *h;
|
| -
|
| - /* Obtain the pointer to the __stacksize symbol. */
|
| - h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
|
| - FALSE, FALSE, FALSE);
|
| - if (h)
|
| - {
|
| - 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;
|
| - BFD_ASSERT (h->root.type == bfd_link_hash_defined);
|
| - }
|
| -
|
| - /* Set the header p_memsz from the symbol value. We
|
| - intentionally ignore the symbol section. */
|
| - if (h && h->root.type == bfd_link_hash_defined)
|
| - p->p_memsz = h->root.u.def.value;
|
| - else
|
| - p->p_memsz = DEFAULT_STACK_SIZE;
|
| -
|
| - p->p_align = 8;
|
| - }
|
| -
|
| + if (sh_elf_hash_table (info)->fdpic_p && !info->relocatable
|
| + && !bfd_elf_stack_segment_size (output_bfd, info,
|
| + "__stacksize", DEFAULT_STACK_SIZE))
|
| + return FALSE;
|
| return TRUE;
|
| }
|
|
|
| -#endif
|
| -
|
| /* Set the sizes of the dynamic sections. */
|
|
|
| static bfd_boolean
|
| @@ -4306,7 +4222,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
| ((*_bfd_error_handler)
|
| (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
|
| input_section->owner,
|
| - (unsigned long) rel->r_offset, howto->name,
|
| + (unsigned long) rel->r_offset, howto->name,
|
| (unsigned long) relocation));
|
| bfd_set_error (bfd_error_bad_value);
|
| return FALSE;
|
| @@ -4321,7 +4237,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
| ((*_bfd_error_handler)
|
| (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
|
| input_section->owner,
|
| - (unsigned long) rel->r_offset, howto->name,
|
| + (unsigned long) rel->r_offset, howto->name,
|
| (unsigned long) relocation));
|
| bfd_set_error (bfd_error_bad_value);
|
| return FALSE;
|
| @@ -4509,6 +4425,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|
|
| check_segment[0] = check_segment[1] = -1;
|
| }
|
| + /* We don't want warnings for non-NULL tests on undefined weak
|
| + symbols. */
|
| + else if (r_type == R_SH_REL32
|
| + && h
|
| + && h->root.type == bfd_link_hash_undefweak)
|
| + check_segment[0] = check_segment[1] = -1;
|
| goto final_link_relocate;
|
|
|
| case R_SH_GOTPLT32:
|
| @@ -6006,9 +5928,9 @@ sh_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
| eind->datalabel_got.refcount = 0;
|
| #endif
|
| edir->funcdesc.refcount += eind->funcdesc.refcount;
|
| - eind->funcdesc.refcount = 0;
|
| + eind->funcdesc.refcount = 0;
|
| edir->abs_funcdesc_refcount += eind->abs_funcdesc_refcount;
|
| - eind->abs_funcdesc_refcount = 0;
|
| + eind->abs_funcdesc_refcount = 0;
|
|
|
| if (ind->root.type == bfd_link_hash_indirect
|
| && dir->got.refcount <= 0)
|
| @@ -6109,6 +6031,10 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
|
| #endif
|
| 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 = sh_elf_optimized_tls_reloc (info, r_type, h == NULL);
|
| @@ -6628,7 +6554,7 @@ sh_elf_set_mach_from_flags (bfd *abfd)
|
|
|
| if (sh_ef_bfd_table[flags] == 0)
|
| return FALSE;
|
| -
|
| +
|
| bfd_default_set_arch_mach (abfd, bfd_arch_sh, sh_ef_bfd_table[flags]);
|
|
|
| return TRUE;
|
| @@ -6644,11 +6570,11 @@ int
|
| sh_elf_get_flags_from_mach (unsigned long mach)
|
| {
|
| int i = ARRAY_SIZE (sh_ef_bfd_table) - 1;
|
| -
|
| +
|
| for (; i>0; i--)
|
| if (sh_ef_bfd_table[i] == mach)
|
| return i;
|
| -
|
| +
|
| /* shouldn't get here */
|
| BFD_FAIL();
|
|
|
| @@ -6683,38 +6609,6 @@ sh_elf_copy_private_data (bfd * ibfd, bfd * obfd)
|
| if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd))
|
| return TRUE;
|
|
|
| - /* Copy the stack size. */
|
| - if (elf_tdata (ibfd)->phdr && elf_tdata (obfd)->phdr
|
| - && fdpic_object_p (ibfd) && fdpic_object_p (obfd))
|
| - {
|
| - unsigned i;
|
| -
|
| - for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
|
| - if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
|
| - {
|
| - Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
|
| -
|
| - for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
|
| - if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
|
| - {
|
| - memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
|
| -
|
| - /* Rewrite the phdrs, since we're only called after they
|
| - were first written. */
|
| - if (bfd_seek (obfd,
|
| - (bfd_signed_vma) get_elf_backend_data (obfd)
|
| - ->s->sizeof_ehdr, SEEK_SET) != 0
|
| - || get_elf_backend_data (obfd)->s
|
| - ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
|
| - elf_elfheader (obfd)->e_phnum) != 0)
|
| - return FALSE;
|
| - break;
|
| - }
|
| -
|
| - break;
|
| - }
|
| - }
|
| -
|
| return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
|
| }
|
| #endif /* not sh_elf_copy_private_data */
|
| @@ -7157,7 +7051,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
|
| /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. On VxWorks,
|
| _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
|
| ".got" section. */
|
| - if (strcmp (h->root.root.string, "_DYNAMIC") == 0
|
| + if (h == htab->root.hdynamic
|
| || (!htab->vxworks_p && h == htab->root.hgot))
|
| sym->st_shndx = SHN_ABS;
|
|
|
| @@ -7350,7 +7244,7 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
|
|
|
| if (sgotplt && sgotplt->size > 0)
|
| elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
|
| -
|
| +
|
| /* At the very end of the .rofixup section is a pointer to the GOT. */
|
| if (htab->fdpic_p && htab->srofixup != NULL)
|
| {
|
| @@ -7377,7 +7271,9 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
|
| }
|
|
|
| static enum elf_reloc_type_class
|
| -sh_elf_reloc_type_class (const Elf_Internal_Rela *rela)
|
| +sh_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
|
| + const asection *rel_sec ATTRIBUTE_UNUSED,
|
| + const Elf_Internal_Rela *rela)
|
| {
|
| switch ((int) ELF32_R_TYPE (rela->r_info))
|
| {
|
| @@ -7408,10 +7304,10 @@ elf32_shlin_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
|
|
|
| case 168: /* Linux/SH */
|
| /* pr_cursig */
|
| - elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
|
| + elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
|
|
|
| /* pr_pid */
|
| - elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
|
| + elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
|
|
|
| /* pr_reg */
|
| offset = 72;
|
| @@ -7434,9 +7330,9 @@ elf32_shlin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
|
| return FALSE;
|
|
|
| case 124: /* Linux/SH elf_prpsinfo */
|
| - elf_tdata (abfd)->core_program
|
| + elf_tdata (abfd)->core->program
|
| = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
|
| - elf_tdata (abfd)->core_command
|
| + elf_tdata (abfd)->core->command
|
| = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
|
| }
|
|
|
| @@ -7445,7 +7341,7 @@ elf32_shlin_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] == ' ')
|
| @@ -7456,7 +7352,7 @@ elf32_shlin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
|
| }
|
| #endif /* not SH_TARGET_ALREADY_DEFINED */
|
|
|
| -
|
| +
|
| /* Return address for Ith PLT stub in section PLT, for relocation REL
|
| or (bfd_vma) -1 if it should not be included. */
|
|
|
| @@ -7587,6 +7483,7 @@ sh_elf_encode_eh_address (bfd *abfd,
|
| #define elf_backend_encode_eh_address \
|
| sh_elf_encode_eh_address
|
|
|
| +#define elf_backend_stack_align 8
|
| #define elf_backend_can_gc_sections 1
|
| #define elf_backend_can_refcount 1
|
| #define elf_backend_want_got_plt 1
|
| @@ -7649,9 +7546,6 @@ sh_elf_encode_eh_address (bfd *abfd,
|
| #define TARGET_LITTLE_SYM bfd_elf32_shfd_vec
|
| #undef TARGET_LITTLE_NAME
|
| #define TARGET_LITTLE_NAME "elf32-sh-fdpic"
|
| -#undef elf_backend_modify_program_headers
|
| -#define elf_backend_modify_program_headers \
|
| - sh_elf_modify_program_headers
|
|
|
| #undef elf32_bed
|
| #define elf32_bed elf32_sh_fd_bed
|
|
|