| Index: bfd/elf64-sh64.c
|
| diff --git a/bfd/elf64-sh64.c b/bfd/elf64-sh64.c
|
| index 920247726763975d5bebcaf9b07686a0bae35841..ce5436d0d948668ba489b96753db55e515cb376e 100644
|
| --- a/bfd/elf64-sh64.c
|
| +++ b/bfd/elf64-sh64.c
|
| @@ -1,6 +1,6 @@
|
| /* SuperH SH64-specific support for 64-bit ELF
|
| Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
| - 2010, 2011 Free Software Foundation, Inc.
|
| + 2010, 2011, 2012 Free Software Foundation, Inc.
|
|
|
| This file is part of BFD, the Binary File Descriptor library.
|
|
|
| @@ -1514,7 +1514,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
|
| input_bfd, input_section, rel->r_offset));
|
|
|
| - if (sec != NULL && elf_discarded_section (sec))
|
| + if (sec != NULL && discarded_section (sec))
|
| /* Handled below. */
|
| ;
|
| else if (info->relocatable)
|
| @@ -1661,9 +1661,9 @@ sh_elf64_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)
|
| continue;
|
| @@ -1797,7 +1797,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| offset table extension for the procedure linkage table. */
|
| if (sgotplt == NULL)
|
| {
|
| - sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
|
| + sgotplt = bfd_get_linker_section (dynobj, ".got.plt");
|
| BFD_ASSERT (sgotplt != NULL);
|
| }
|
|
|
| @@ -1820,7 +1820,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| offset table. */
|
| if (sgot == NULL)
|
| {
|
| - sgot = bfd_get_section_by_name (dynobj, ".got");
|
| + sgot = bfd_get_linker_section (dynobj, ".got");
|
| BFD_ASSERT (sgot != NULL);
|
| }
|
|
|
| @@ -1914,7 +1914,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| Elf_Internal_Rela outrel;
|
| bfd_byte *loc;
|
|
|
| - s = bfd_get_section_by_name (dynobj, ".rela.got");
|
| + s = bfd_get_linker_section (dynobj, ".rela.got");
|
| BFD_ASSERT (s != NULL);
|
|
|
| outrel.r_offset = (sgot->output_section->vma
|
| @@ -1949,7 +1949,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
|
|
| if (sgot == NULL)
|
| {
|
| - sgot = bfd_get_section_by_name (dynobj, ".got");
|
| + sgot = bfd_get_linker_section (dynobj, ".got");
|
| BFD_ASSERT (sgot != NULL);
|
| }
|
|
|
| @@ -1974,7 +1974,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
|
|
| if (sgot == NULL)
|
| {
|
| - sgot = bfd_get_section_by_name (dynobj, ".got");
|
| + sgot = bfd_get_linker_section (dynobj, ".got");
|
| BFD_ASSERT (sgot != NULL);
|
| }
|
|
|
| @@ -2012,7 +2012,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
|
|
| if (splt == NULL)
|
| {
|
| - splt = bfd_get_section_by_name (dynobj, ".plt");
|
| + splt = bfd_get_linker_section (dynobj, ".plt");
|
| BFD_ASSERT (splt != NULL);
|
| }
|
|
|
| @@ -2490,24 +2490,22 @@ sh_elf64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|
|
| if (sgot == NULL)
|
| {
|
| - sgot = bfd_get_section_by_name (dynobj, ".got");
|
| + sgot = bfd_get_linker_section (dynobj, ".got");
|
| BFD_ASSERT (sgot != NULL);
|
| }
|
|
|
| if (srelgot == NULL
|
| && (h != NULL || info->shared))
|
| {
|
| - srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
|
| + srelgot = bfd_get_linker_section (dynobj, ".rela.got");
|
| if (srelgot == NULL)
|
| {
|
| - srelgot = bfd_make_section_with_flags (dynobj,
|
| - ".rela.got",
|
| - (SEC_ALLOC
|
| - | SEC_LOAD
|
| - | SEC_HAS_CONTENTS
|
| - | SEC_IN_MEMORY
|
| - | SEC_LINKER_CREATED
|
| - | SEC_READONLY));
|
| + flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
|
| + | SEC_IN_MEMORY | SEC_LINKER_CREATED
|
| + | SEC_READONLY);
|
| + srelgot = bfd_make_section_anyway_with_flags (dynobj,
|
| + ".rela.got",
|
| + flags);
|
| if (srelgot == NULL
|
| || ! bfd_set_section_alignment (dynobj, srelgot, 2))
|
| return FALSE;
|
| @@ -3159,7 +3157,7 @@ sh64_elf64_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);
|
| if (s == NULL
|
| || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
|
| return FALSE;
|
| @@ -3186,9 +3184,10 @@ sh64_elf64_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);
|
| if (s == NULL
|
| || ! bfd_set_section_alignment (abfd, s, ptralign))
|
| return FALSE;
|
| @@ -3196,30 +3195,6 @@ sh64_elf64_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
| if (! _bfd_elf_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 = (char *) bfd_malloc (strlen (secname) + 6);
|
| - strcpy (relname, ".rela");
|
| - strcat (relname, secname);
|
| - 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
|
| @@ -3228,8 +3203,8 @@ sh64_elf64_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);
|
| if (s == NULL)
|
| return FALSE;
|
|
|
| @@ -3246,10 +3221,10 @@ sh64_elf64_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);
|
| if (s == NULL
|
| || ! bfd_set_section_alignment (abfd, s, ptralign))
|
| return FALSE;
|
| @@ -3308,7 +3283,7 @@ sh64_elf64_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| return FALSE;
|
| }
|
|
|
| - s = bfd_get_section_by_name (dynobj, ".plt");
|
| + s = bfd_get_linker_section (dynobj, ".plt");
|
| BFD_ASSERT (s != NULL);
|
|
|
| /* If this is the first .plt entry, make room for the special
|
| @@ -3336,13 +3311,13 @@ sh64_elf64_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| /* We also need to make an entry in the .got.plt section, which
|
| will be placed in the .got section by the linker script. */
|
|
|
| - s = bfd_get_section_by_name (dynobj, ".got.plt");
|
| + s = bfd_get_linker_section (dynobj, ".got.plt");
|
| BFD_ASSERT (s != NULL);
|
| s->size += 8;
|
|
|
| /* We also need to make an entry in the .rela.plt section. */
|
|
|
| - s = bfd_get_section_by_name (dynobj, ".rela.plt");
|
| + s = bfd_get_linker_section (dynobj, ".rela.plt");
|
| BFD_ASSERT (s != NULL);
|
| s->size += sizeof (Elf64_External_Rela);
|
|
|
| @@ -3376,13 +3351,6 @@ sh64_elf64_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| if (!h->non_got_ref)
|
| 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
|
| @@ -3393,18 +3361,18 @@ sh64_elf64_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| both the dynamic object and the regular object will refer to the
|
| same memory location for the variable. */
|
|
|
| - s = bfd_get_section_by_name (dynobj, ".dynbss");
|
| + s = bfd_get_linker_section (dynobj, ".dynbss");
|
| BFD_ASSERT (s != NULL);
|
|
|
| /* We must generate a R_SH_COPY reloc to tell the dynamic linker 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;
|
|
|
| - srel = bfd_get_section_by_name (dynobj, ".rela.bss");
|
| + srel = bfd_get_linker_section (dynobj, ".rela.bss");
|
| BFD_ASSERT (srel != NULL);
|
| srel->size += sizeof (Elf64_External_Rela);
|
| h->needs_copy = 1;
|
| @@ -3456,7 +3424,7 @@ sh64_elf64_size_dynamic_sections (bfd *output_bfd,
|
| /* 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;
|
| @@ -3469,7 +3437,7 @@ sh64_elf64_size_dynamic_sections (bfd *output_bfd,
|
| not actually use these entries. Reset the size of .rela.got,
|
| which will cause it to get stripped from the output file
|
| below. */
|
| - s = bfd_get_section_by_name (dynobj, ".rela.got");
|
| + s = bfd_get_linker_section (dynobj, ".rela.got");
|
| if (s != NULL)
|
| s->size = 0;
|
| }
|
| @@ -3638,9 +3606,9 @@ sh64_elf64_finish_dynamic_symbol (bfd *output_bfd,
|
|
|
| BFD_ASSERT (h->dynindx != -1);
|
|
|
| - splt = bfd_get_section_by_name (dynobj, ".plt");
|
| - sgot = bfd_get_section_by_name (dynobj, ".got.plt");
|
| - srel = bfd_get_section_by_name (dynobj, ".rela.plt");
|
| + splt = bfd_get_linker_section (dynobj, ".plt");
|
| + sgot = bfd_get_linker_section (dynobj, ".got.plt");
|
| + srel = bfd_get_linker_section (dynobj, ".rela.plt");
|
| BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
|
|
|
| /* Get the index in the procedure linkage table which
|
| @@ -3741,8 +3709,8 @@ sh64_elf64_finish_dynamic_symbol (bfd *output_bfd,
|
| /* This symbol has an entry in the global offset table. Set it
|
| up. */
|
|
|
| - sgot = bfd_get_section_by_name (dynobj, ".got");
|
| - srel = bfd_get_section_by_name (dynobj, ".rela.got");
|
| + sgot = bfd_get_linker_section (dynobj, ".got");
|
| + srel = bfd_get_linker_section (dynobj, ".rela.got");
|
| BFD_ASSERT (sgot != NULL && srel != NULL);
|
|
|
| rel.r_offset = (sgot->output_section->vma
|
| @@ -3787,8 +3755,7 @@ sh64_elf64_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 (dynobj, ".rela.bss");
|
| BFD_ASSERT (s != NULL);
|
|
|
| rel.r_offset = (h->root.u.def.value
|
| @@ -3821,9 +3788,9 @@ sh64_elf64_finish_dynamic_sections (bfd *output_bfd,
|
|
|
| dynobj = elf_hash_table (info)->dynobj;
|
|
|
| - sgot = bfd_get_section_by_name (dynobj, ".got.plt");
|
| + sgot = bfd_get_linker_section (dynobj, ".got.plt");
|
| BFD_ASSERT (sgot != NULL);
|
| - sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
|
| + sdyn = bfd_get_linker_section (dynobj, ".dynamic");
|
|
|
| if (elf_hash_table (info)->dynamic_sections_created)
|
| {
|
| @@ -3906,7 +3873,7 @@ sh64_elf64_finish_dynamic_sections (bfd *output_bfd,
|
| }
|
|
|
| /* Fill in the first entry in the procedure linkage table. */
|
| - splt = bfd_get_section_by_name (dynobj, ".plt");
|
| + splt = bfd_get_linker_section (dynobj, ".plt");
|
| if (splt && splt->size > 0)
|
| {
|
| if (info->shared)
|
|
|