| Index: bfd/elf32-m32r.c
|
| diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c
|
| index 37d995d14c362308fa3c95ad5433d530c1da2067..e3e3bb051b5e300b87a6bc69dcb35998c150f24b 100644
|
| --- a/bfd/elf32-m32r.c
|
| +++ b/bfd/elf32-m32r.c
|
| @@ -1,6 +1,6 @@
|
| /* M32R-specific support for 32-bit ELF.
|
| Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
| - 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
|
| + 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
|
|
| This file is part of BFD, the Binary File Descriptor library.
|
|
|
| @@ -1625,9 +1625,9 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info)
|
| if (htab == NULL)
|
| return FALSE;
|
|
|
| - htab->sgot = bfd_get_section_by_name (dynobj, ".got");
|
| - htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
|
| - htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
|
| + htab->sgot = bfd_get_linker_section (dynobj, ".got");
|
| + htab->sgotplt = bfd_get_linker_section (dynobj, ".got.plt");
|
| + htab->srelgot = bfd_get_linker_section (dynobj, ".rela.got");
|
| if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot)
|
| abort ();
|
|
|
| @@ -1661,7 +1661,7 @@ m32r_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
| if (bed->plt_readonly)
|
| pltflags |= SEC_READONLY;
|
|
|
| - s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
|
| + s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags);
|
| htab->splt = s;
|
| if (s == NULL
|
| || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
|
| @@ -1689,9 +1689,10 @@ m32r_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
| return FALSE;
|
| }
|
|
|
| - s = bfd_make_section_with_flags (abfd,
|
| - bed->default_use_rela_p ? ".rela.plt" : ".rel.plt",
|
| - flags | SEC_READONLY);
|
| + s = bfd_make_section_anyway_with_flags (abfd,
|
| + bed->default_use_rela_p
|
| + ? ".rela.plt" : ".rel.plt",
|
| + flags | SEC_READONLY);
|
| htab->srelplt = s;
|
| if (s == NULL
|
| || ! bfd_set_section_alignment (abfd, s, ptralign))
|
| @@ -1701,32 +1702,6 @@ m32r_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
| && ! create_got_section (abfd, info))
|
| return FALSE;
|
|
|
| - {
|
| - const char *secname;
|
| - char *relname;
|
| - flagword secflags;
|
| - asection *sec;
|
| -
|
| - for (sec = abfd->sections; sec; sec = sec->next)
|
| - {
|
| - secflags = bfd_get_section_flags (abfd, sec);
|
| - if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
|
| - || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
|
| - continue;
|
| - secname = bfd_get_section_name (abfd, sec);
|
| - relname = bfd_malloc ((bfd_size_type) strlen (secname) + 6);
|
| - strcpy (relname, ".rela");
|
| - strcat (relname, secname);
|
| - if (bfd_get_section_by_name (abfd, secname))
|
| - continue;
|
| - s = bfd_make_section_with_flags (abfd, relname,
|
| - flags | SEC_READONLY);
|
| - if (s == NULL
|
| - || ! bfd_set_section_alignment (abfd, s, ptralign))
|
| - return FALSE;
|
| - }
|
| - }
|
| -
|
| if (bed->want_dynbss)
|
| {
|
| /* The .dynbss section is a place to put symbols which are defined
|
| @@ -1735,8 +1710,8 @@ m32r_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
| image and use a R_*_COPY reloc to tell the dynamic linker to
|
| initialize them at run time. The linker script puts the .dynbss
|
| section into the .bss section of the final image. */
|
| - s = bfd_make_section_with_flags (abfd, ".dynbss",
|
| - SEC_ALLOC | SEC_LINKER_CREATED);
|
| + s = bfd_make_section_anyway_with_flags (abfd, ".dynbss",
|
| + SEC_ALLOC | SEC_LINKER_CREATED);
|
| htab->sdynbss = s;
|
| if (s == NULL)
|
| return FALSE;
|
| @@ -1753,10 +1728,10 @@ m32r_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
| copy relocs. */
|
| if (! info->shared)
|
| {
|
| - s = bfd_make_section_with_flags (abfd,
|
| - (bed->default_use_rela_p
|
| - ? ".rela.bss" : ".rel.bss"),
|
| - flags | SEC_READONLY);
|
| + s = bfd_make_section_anyway_with_flags (abfd,
|
| + (bed->default_use_rela_p
|
| + ? ".rela.bss" : ".rel.bss"),
|
| + flags | SEC_READONLY);
|
| htab->srelbss = s;
|
| if (s == NULL
|
| || ! bfd_set_section_alignment (abfd, s, ptralign))
|
| @@ -1922,13 +1897,6 @@ m32r_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| return TRUE;
|
| }
|
|
|
| - if (h->size == 0)
|
| - {
|
| - (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
|
| - h->root.root.string);
|
| - return TRUE;
|
| - }
|
| -
|
| /* We must allocate the symbol in our .dynbss section, which will
|
| become part of the .bss section of the executable. There will be
|
| an entry for this symbol in the .dynsym section. The dynamic
|
| @@ -1950,7 +1918,7 @@ m32r_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| to copy the initial value out of the dynamic object and into the
|
| runtime process image. We need to remember the offset into the
|
| .rela.bss section we are going to use. */
|
| - if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
|
| + if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
|
| {
|
| asection *srel;
|
|
|
| @@ -2209,7 +2177,7 @@ m32r_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| /* Set the contents of the .interp section to the interpreter. */
|
| if (info->executable)
|
| {
|
| - 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;
|
| @@ -2620,9 +2588,9 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| }
|
| }
|
|
|
| - if (sec != NULL && elf_discarded_section (sec))
|
| + 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 && !use_rel)
|
| {
|
| @@ -2821,7 +2789,8 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
|
|
| /* We need to generate a R_M32R_RELATIVE reloc
|
| for the dynamic linker. */
|
| - srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
|
| + srelgot = bfd_get_linker_section (dynobj,
|
| + ".rela.got");
|
| BFD_ASSERT (srelgot != NULL);
|
|
|
| outrel.r_offset = (sgot->output_section->vma
|
| @@ -3014,7 +2983,7 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| const char *name;
|
|
|
| BFD_ASSERT (sec != NULL);
|
| - name = bfd_get_section_name (abfd, sec);
|
| + name = bfd_get_section_name (sec->owner, sec);
|
|
|
| if ( strcmp (name, ".sdata") == 0
|
| || strcmp (name, ".sbss") == 0
|
| @@ -3311,8 +3280,7 @@ m32r_elf_finish_dynamic_symbol (bfd *output_bfd,
|
| && (h->root.type == bfd_link_hash_defined
|
| || h->root.type == bfd_link_hash_defweak));
|
|
|
| - s = bfd_get_section_by_name (h->root.u.def.section->owner,
|
| - ".rela.bss");
|
| + s = bfd_get_linker_section (htab->root.dynobj, ".rela.bss");
|
| BFD_ASSERT (s != NULL);
|
|
|
| rela.r_offset = (h->root.u.def.value
|
| @@ -3357,7 +3325,7 @@ m32r_elf_finish_dynamic_sections (bfd *output_bfd,
|
| dynobj = htab->root.dynobj;
|
|
|
| sgot = htab->sgotplt;
|
| - sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
|
| + sdyn = bfd_get_linker_section (dynobj, ".dynamic");
|
|
|
| if (htab->root.dynamic_sections_created)
|
| {
|
|
|