| Index: bfd/elf32-lm32.c
|
| diff --git a/bfd/elf32-lm32.c b/bfd/elf32-lm32.c
|
| index 8d530a4cf31345c404391c4098d752bd8e585d94..4ebe534ddf139aff6ba3f53e6ac1961b1db738ec 100644
|
| --- a/bfd/elf32-lm32.c
|
| +++ b/bfd/elf32-lm32.c
|
| @@ -159,7 +159,7 @@ lm32_elf_link_hash_table_create (bfd *abfd)
|
| struct elf_lm32_link_hash_table *ret;
|
| bfd_size_type amt = sizeof (struct elf_lm32_link_hash_table);
|
|
|
| - ret = bfd_malloc (amt);
|
| + ret = bfd_zmalloc (amt);
|
| if (ret == NULL)
|
| return NULL;
|
|
|
| @@ -172,16 +172,6 @@ lm32_elf_link_hash_table_create (bfd *abfd)
|
| return NULL;
|
| }
|
|
|
| - ret->sgot = NULL;
|
| - ret->sgotplt = NULL;
|
| - ret->srelgot = NULL;
|
| - ret->sfixup32 = NULL;
|
| - ret->splt = NULL;
|
| - ret->srelplt = NULL;
|
| - ret->sdynbss = NULL;
|
| - ret->srelbss = NULL;
|
| - ret->relocs32 = 0;
|
| -
|
| return &ret->root.root;
|
| }
|
|
|
| @@ -785,8 +775,7 @@ _lm32fdpic_osec_to_segment (bfd *output_bfd, asection *osec)
|
| Elf_Internal_Phdr *p;
|
|
|
| /* Find the segment that contains the output_section. */
|
| - for (m = elf_tdata (output_bfd)->segment_map,
|
| - p = elf_tdata (output_bfd)->phdr;
|
| + for (m = elf_seg_map (output_bfd), p = elf_tdata (output_bfd)->phdr;
|
| m != NULL;
|
| m = m->next, p++)
|
| {
|
| @@ -886,12 +875,12 @@ lm32_elf_relocate_section (bfd *output_bfd,
|
| {
|
| /* It's a global symbol. */
|
| bfd_boolean unresolved_reloc;
|
| - bfd_boolean warned;
|
| + bfd_boolean warned, ignored;
|
|
|
| RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
|
| r_symndx, symtab_hdr, sym_hashes,
|
| h, sec, relocation,
|
| - unresolved_reloc, warned);
|
| + unresolved_reloc, warned, ignored);
|
| name = h->root.root.string;
|
| }
|
|
|
| @@ -1316,6 +1305,10 @@ lm32_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;
|
| }
|
|
|
| /* Some relocs require a global offset table. */
|
| @@ -1745,15 +1738,16 @@ lm32_elf_finish_dynamic_symbol (bfd *output_bfd,
|
| }
|
|
|
| /* Mark some specially defined symbols as absolute. */
|
| - if (strcmp (h->root.root.string, "_DYNAMIC") == 0
|
| - || h == htab->root.hgot)
|
| + if (h == htab->root.hdynamic || h == htab->root.hgot)
|
| sym->st_shndx = SHN_ABS;
|
|
|
| return TRUE;
|
| }
|
|
|
| static enum elf_reloc_type_class
|
| -lm32_elf_reloc_type_class (const Elf_Internal_Rela *rela)
|
| +lm32_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))
|
| {
|
| @@ -2616,135 +2610,22 @@ lm32_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
| }
|
|
|
| static bfd_boolean
|
| -lm32_elf_always_size_sections (bfd *output_bfd,
|
| - struct bfd_link_info *info)
|
| +lm32_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
|
| {
|
| if (!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;
|
| - /* This one must NOT be hidden. */
|
| - }
|
| - }
|
| -
|
| - return TRUE;
|
| -}
|
| + if (!bfd_elf_stack_segment_size (output_bfd, info,
|
| + "__stacksize", DEFAULT_STACK_SIZE))
|
| + return FALSE;
|
|
|
| -static bfd_boolean
|
| -lm32_elf_modify_segment_map (bfd *output_bfd,
|
| - struct bfd_link_info *info)
|
| -{
|
| - struct elf_segment_map *m;
|
| -
|
| - /* objcopy and strip preserve what's already there using elf32_lm32fdpic_copy_
|
| - private_bfd_data (). */
|
| - if (! info)
|
| - return TRUE;
|
| -
|
| - for (m = elf_tdata (output_bfd)->segment_map; m != NULL; m = m->next)
|
| - if (m->p_type == PT_GNU_STACK)
|
| - break;
|
| -
|
| - if (m)
|
| - {
|
| asection *sec = bfd_get_section_by_name (output_bfd, ".stack");
|
| - struct elf_link_hash_entry *h;
|
| -
|
| if (sec)
|
| - {
|
| - /* Obtain the pointer to the __stacksize symbol. */
|
| - h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
|
| - FALSE, FALSE, FALSE);
|
| - 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 section size from the symbol value. We
|
| - intentionally ignore the symbol section. */
|
| - if (h->root.type == bfd_link_hash_defined)
|
| - sec->size = h->root.u.def.value;
|
| - else
|
| - sec->size = DEFAULT_STACK_SIZE;
|
| -
|
| - /* Add the stack section to the PT_GNU_STACK segment,
|
| - such that its size and alignment requirements make it
|
| - to the segment. */
|
| - m->sections[m->count] = sec;
|
| - m->count++;
|
| - }
|
| - }
|
| -
|
| - return TRUE;
|
| -}
|
| -
|
| -static bfd_boolean
|
| -lm32_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;
|
| -
|
| - 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;
|
| + sec->size = info->stacksize >= 0 ? info->stacksize : 0;
|
| }
|
|
|
| return TRUE;
|
| }
|
|
|
| -
|
| static bfd_boolean
|
| lm32_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
|
| {
|
| @@ -2823,6 +2704,7 @@ lm32_elf_fdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
|
| #define elf_backend_rela_normal 1
|
| #define elf_backend_object_p lm32_elf_object_p
|
| #define elf_backend_final_write_processing lm32_elf_final_write_processing
|
| +#define elf_backend_stack_align 8
|
| #define elf_backend_can_gc_sections 1
|
| #define elf_backend_can_refcount 1
|
| #define elf_backend_gc_mark_hook lm32_elf_gc_mark_hook
|
| @@ -2858,10 +2740,6 @@ lm32_elf_fdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
|
|
|
| #undef elf_backend_always_size_sections
|
| #define elf_backend_always_size_sections lm32_elf_always_size_sections
|
| -#undef elf_backend_modify_segment_map
|
| -#define elf_backend_modify_segment_map lm32_elf_modify_segment_map
|
| -#undef elf_backend_modify_program_headers
|
| -#define elf_backend_modify_program_headers lm32_elf_modify_program_headers
|
| #undef bfd_elf32_bfd_copy_private_bfd_data
|
| #define bfd_elf32_bfd_copy_private_bfd_data lm32_elf_fdpic_copy_private_bfd_data
|
|
|
|
|