| Index: bfd/elf32-i370.c
|
| diff --git a/bfd/elf32-i370.c b/bfd/elf32-i370.c
|
| index 808292703313f8c3d4da447d4fca0f580fab8bd5..5998db755a6290f2151ba666c4ab76e0e4707331 100644
|
| --- a/bfd/elf32-i370.c
|
| +++ b/bfd/elf32-i370.c
|
| @@ -1,6 +1,6 @@
|
| /* i370-specific support for 32-bit ELF
|
| Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004,
|
| - 2005, 2006, 2007, 2008, 2010, 2011 Free Software Foundation, Inc.
|
| + 2005, 2006, 2007, 2008, 2010, 2011, 2012 Free Software Foundation, Inc.
|
| Written by Ian Lance Taylor, Cygnus Support.
|
| Hacked by Linas Vepstas for i370 linas@linas.org
|
|
|
| @@ -420,23 +420,23 @@ i370_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
| flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
|
| | SEC_LINKER_CREATED);
|
|
|
| - s = bfd_make_section_with_flags (abfd, ".dynsbss",
|
| - SEC_ALLOC | SEC_LINKER_CREATED);
|
| + s = bfd_make_section_anyway_with_flags (abfd, ".dynsbss",
|
| + SEC_ALLOC | SEC_LINKER_CREATED);
|
| if (s == NULL)
|
| return FALSE;
|
|
|
| if (! info->shared)
|
| {
|
| - s = bfd_make_section_with_flags (abfd, ".rela.sbss",
|
| - flags | SEC_READONLY);
|
| + s = bfd_make_section_anyway_with_flags (abfd, ".rela.sbss",
|
| + flags | SEC_READONLY);
|
| if (s == NULL
|
| || ! bfd_set_section_alignment (abfd, s, 2))
|
| return FALSE;
|
| }
|
|
|
| /* XXX beats me, seem to need a rela.text ... */
|
| - s = bfd_make_section_with_flags (abfd, ".rela.text",
|
| - flags | SEC_READONLY);
|
| + s = bfd_make_section_anyway_with_flags (abfd, ".rela.text",
|
| + flags | SEC_READONLY);
|
| if (s == NULL
|
| || ! bfd_set_section_alignment (abfd, s, 2))
|
| return FALSE;
|
| @@ -472,7 +472,7 @@ i370_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| && h->ref_regular
|
| && !h->def_regular)));
|
|
|
| - s = bfd_get_section_by_name (dynobj, ".rela.text");
|
| + s = bfd_get_linker_section (dynobj, ".rela.text");
|
| BFD_ASSERT (s != NULL);
|
| s->size += sizeof (Elf32_External_Rela);
|
|
|
| @@ -498,13 +498,6 @@ i370_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| if (info->shared)
|
| 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
|
| @@ -520,23 +513,23 @@ i370_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| only if there were actually SDAREL relocs for that symbol. */
|
|
|
| if (h->size <= elf_gp_size (dynobj))
|
| - s = bfd_get_section_by_name (dynobj, ".dynsbss");
|
| + s = bfd_get_linker_section (dynobj, ".dynsbss");
|
| else
|
| - s = bfd_get_section_by_name (dynobj, ".dynbss");
|
| + s = bfd_get_linker_section (dynobj, ".dynbss");
|
| BFD_ASSERT (s != NULL);
|
|
|
| /* We must generate a R_I370_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;
|
|
|
| if (h->size <= elf_gp_size (dynobj))
|
| - srel = bfd_get_section_by_name (dynobj, ".rela.sbss");
|
| + srel = bfd_get_linker_section (dynobj, ".rela.sbss");
|
| else
|
| - srel = bfd_get_section_by_name (dynobj, ".rela.bss");
|
| + srel = bfd_get_linker_section (dynobj, ".rela.bss");
|
| BFD_ASSERT (srel != NULL);
|
| srel->size += sizeof (Elf32_External_Rela);
|
| h->needs_copy = 1;
|
| @@ -595,7 +588,7 @@ i370_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;
|
| @@ -615,7 +608,7 @@ i370_elf_size_dynamic_sections (bfd *output_bfd,
|
|
|
| for (p = rela_sections; *p != NULL; p++)
|
| {
|
| - s = bfd_get_section_by_name (dynobj, *p);
|
| + s = bfd_get_linker_section (dynobj, *p);
|
| if (s != NULL)
|
| s->size = 0;
|
| }
|
| @@ -876,20 +869,20 @@ i370_elf_finish_dynamic_sections (bfd *output_bfd,
|
| {
|
| asection *sdyn;
|
| bfd *dynobj = elf_hash_table (info)->dynobj;
|
| - asection *sgot = bfd_get_section_by_name (dynobj, ".got");
|
| + asection *sgot = bfd_get_linker_section (dynobj, ".got");
|
|
|
| #ifdef DEBUG
|
| fprintf (stderr, "i370_elf_finish_dynamic_sections called\n");
|
| #endif
|
|
|
| - sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
|
| + sdyn = bfd_get_linker_section (dynobj, ".dynamic");
|
|
|
| if (elf_hash_table (info)->dynamic_sections_created)
|
| {
|
| asection *splt;
|
| Elf32_External_Dyn *dyncon, *dynconend;
|
|
|
| - splt = bfd_get_section_by_name (dynobj, ".plt");
|
| + splt = bfd_get_linker_section (dynobj, ".plt");
|
| BFD_ASSERT (splt != NULL && sdyn != NULL);
|
|
|
| dyncon = (Elf32_External_Dyn *) sdyn->contents;
|
| @@ -952,7 +945,7 @@ i370_elf_finish_dynamic_sections (bfd *output_bfd,
|
|
|
| /* Set up the section symbols for the output sections. */
|
|
|
| - sdynsym = bfd_get_section_by_name (dynobj, ".dynsym");
|
| + sdynsym = bfd_get_linker_section (dynobj, ".dynsym");
|
| BFD_ASSERT (sdynsym != NULL);
|
|
|
| sym.st_size = 0;
|
| @@ -1138,9 +1131,9 @@ i370_elf_relocate_section (bfd *output_bfd,
|
| }
|
| }
|
|
|
| - 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;
|
|
|