| Index: bfd/elf32-lm32.c
|
| diff --git a/bfd/elf32-lm32.c b/bfd/elf32-lm32.c
|
| index 07add20c478aa22b52983acbceada4b176e660a0..8d530a4cf31345c404391c4098d752bd8e585d94 100644
|
| --- a/bfd/elf32-lm32.c
|
| +++ b/bfd/elf32-lm32.c
|
| @@ -1,5 +1,5 @@
|
| /* Lattice Mico32-specific support for 32-bit ELF
|
| - Copyright 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
|
| + Copyright 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
| Contributed by Jon Beniston <jon@beniston.com>
|
|
|
| This file is part of BFD, the Binary File Descriptor library.
|
| @@ -19,8 +19,8 @@
|
| Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
| MA 02110-1301, USA. */
|
|
|
| -#include "bfd.h"
|
| #include "sysdep.h"
|
| +#include "bfd.h"
|
| #include "libbfd.h"
|
| #include "elf-bfd.h"
|
| #include "elf/lm32.h"
|
| @@ -217,8 +217,8 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info)
|
| asection *s;
|
|
|
| /* This function may be called more than once. */
|
| - s = bfd_get_section_by_name (dynobj, ".got");
|
| - if (s != NULL && (s->flags & SEC_LINKER_CREATED) != 0)
|
| + s = bfd_get_linker_section (dynobj, ".got");
|
| + if (s != NULL)
|
| return TRUE;
|
|
|
| htab = lm32_elf_hash_table (info);
|
| @@ -228,9 +228,9 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info)
|
| if (! _bfd_elf_create_got_section (dynobj, info))
|
| 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 ();
|
|
|
| @@ -250,16 +250,18 @@ create_rofixup_section (bfd *dynobj, struct bfd_link_info *info)
|
| return FALSE;
|
|
|
| /* Fixup section for R_LM32_32 relocs. */
|
| - lm32fdpic_fixup32_section (info) = bfd_make_section_with_flags (dynobj,
|
| - ".rofixup",
|
| - (SEC_ALLOC
|
| - | SEC_LOAD
|
| - | SEC_HAS_CONTENTS
|
| - | SEC_IN_MEMORY
|
| - | SEC_LINKER_CREATED
|
| - | SEC_READONLY));
|
| + lm32fdpic_fixup32_section (info)
|
| + = bfd_make_section_anyway_with_flags (dynobj,
|
| + ".rofixup",
|
| + (SEC_ALLOC
|
| + | SEC_LOAD
|
| + | SEC_HAS_CONTENTS
|
| + | SEC_IN_MEMORY
|
| + | SEC_LINKER_CREATED
|
| + | SEC_READONLY));
|
| if (lm32fdpic_fixup32_section (info) == NULL
|
| - || ! bfd_set_section_alignment (dynobj, lm32fdpic_fixup32_section (info), 2))
|
| + || ! bfd_set_section_alignment (dynobj,
|
| + lm32fdpic_fixup32_section (info), 2))
|
| return FALSE;
|
|
|
| return TRUE;
|
| @@ -893,9 +895,9 @@ lm32_elf_relocate_section (bfd *output_bfd,
|
| name = h->root.root.string;
|
| }
|
|
|
| - 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)
|
| {
|
| @@ -1031,7 +1033,8 @@ lm32_elf_relocate_section (bfd *output_bfd,
|
|
|
| /* We need to generate a R_LM32_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
|
| @@ -1346,7 +1349,7 @@ lm32_elf_check_relocs (bfd *abfd,
|
| /* Create .rofixup section */
|
| if (htab->sfixup32 == NULL)
|
| {
|
| - if (! create_rofixup_section (abfd, info))
|
| + if (! create_rofixup_section (dynobj, info))
|
| return FALSE;
|
| }
|
| break;
|
| @@ -1356,7 +1359,9 @@ lm32_elf_check_relocs (bfd *abfd,
|
| /* Create .rofixup section. */
|
| if (htab->sfixup32 == NULL)
|
| {
|
| - if (! create_rofixup_section (abfd, info))
|
| + if (dynobj == NULL)
|
| + htab->root.dynobj = dynobj = abfd;
|
| + if (! create_rofixup_section (dynobj, info))
|
| return FALSE;
|
| }
|
| break;
|
| @@ -1427,7 +1432,7 @@ lm32_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)
|
| {
|
| @@ -1725,8 +1730,7 @@ lm32_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
|
| @@ -1863,13 +1867,6 @@ lm32_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
|
| @@ -1891,7 +1888,7 @@ lm32_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;
|
|
|
| @@ -2146,7 +2143,7 @@ lm32_elf_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;
|
| @@ -2372,7 +2369,7 @@ lm32_elf_size_dynamic_sections (bfd *output_bfd,
|
| /* Don't generate entries for weak symbols. */
|
| if (!h || (h && h->root.type != bfd_link_hash_undefweak))
|
| {
|
| - if (!elf_discarded_section (s) && !((bfd_get_section_flags (ibfd, s) & SEC_ALLOC) == 0))
|
| + if (!discarded_section (s) && !((bfd_get_section_flags (ibfd, s) & SEC_ALLOC) == 0))
|
| {
|
| switch (ELF32_R_TYPE (internal_relocs->r_info))
|
| {
|
| @@ -2394,7 +2391,7 @@ lm32_elf_size_dynamic_sections (bfd *output_bfd,
|
| if (!strcmp (current->name, h->root.root.string))
|
| break;
|
| }
|
| - if (!current && !elf_discarded_section (s) && (bfd_get_section_flags (ibfd, s) & SEC_ALLOC))
|
| + if (!current && !discarded_section (s) && (bfd_get_section_flags (ibfd, s) & SEC_ALLOC))
|
| {
|
| /* Will this have an entry in the GOT. */
|
| if (ELF32_R_TYPE (internal_relocs->r_info) == R_LM32_16_GOT)
|
| @@ -2490,7 +2487,7 @@ lm32_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))
|
| @@ -2518,9 +2515,10 @@ lm32_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))
|
| @@ -2530,32 +2528,6 @@ lm32_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
|
| @@ -2564,8 +2536,8 @@ lm32_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;
|
| @@ -2582,10 +2554,10 @@ lm32_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))
|
|
|