2006-09-05 Bibo Mao <bibo.mao@intel.com>
[deliverable/binutils-gdb.git] / bfd / elf32-i370.c
index d0a28d5b8ade80cca0a268b266f172efab81a2f8..6a013f8165ff85b73e78dcbaf9b5ebaafdae1bac 100644 (file)
@@ -1,6 +1,6 @@
 /* i370-specific support for 32-bit ELF
-   Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005
-   Free Software Foundation, Inc.
+   Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004,
+   2005, 2006 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
    Hacked by Linas Vepstas for i370 linas@linas.org
 
@@ -379,7 +379,7 @@ i370_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
                        Elf_Internal_Shdr *shdr,
                        asection *asect)
 {
-  if ((asect->flags & SEC_EXCLUDE) != 0)
+  if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE)
     shdr->sh_flags |= SHF_EXCLUDE;
 
   if ((asect->flags & SEC_SORT_ENTRIES) != 0)
@@ -486,6 +486,13 @@ 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
@@ -560,7 +567,7 @@ i370_elf_adjust_dynindx (struct elf_link_hash_entry *h, void * cparg)
 
 #ifdef DEBUG
   fprintf (stderr,
-          "i370_elf_adjust_dynindx called, h->dynindx = %d, *cp = %d\n",
+          "i370_elf_adjust_dynindx called, h->dynindx = %ld, *cp = %d\n",
           h->dynindx, *cp);
 #endif
 
@@ -635,7 +642,6 @@ i370_elf_size_dynamic_sections (bfd *output_bfd,
   for (s = dynobj->sections; s != NULL; s = s->next)
     {
       const char *name;
-      bfd_boolean strip;
 
       if ((s->flags & SEC_LINKER_CREATED) == 0)
        continue;
@@ -643,32 +649,15 @@ i370_elf_size_dynamic_sections (bfd *output_bfd,
       /* It's OK to base decisions on the section name, because none
         of the dynobj section names depend upon the input files.  */
       name = bfd_get_section_name (dynobj, s);
-      strip = FALSE;
 
       if (strcmp (name, ".plt") == 0)
        {
-         if (s->size == 0)
-           /* Strip this section if we don't need it; see the
-              comment below.  */
-           strip = TRUE;
-         else
-           /* Remember whether there is a PLT.  */
-           plt = TRUE;
+         /* Remember whether there is a PLT.  */
+         plt = s->size != 0;
        }
       else if (strncmp (name, ".rela", 5) == 0)
        {
-         if (s->size == 0)
-           /* If we don't need this section, strip it from the
-              output file.  This is mostly to handle .rela.bss and
-              .rela.plt.  We must create both sections in
-              create_dynamic_sections, because they must be created
-              before the linker maps input sections to output
-              sections.  The linker does that before
-              adjust_dynamic_symbol is called, and it is that
-              function which decides whether anything needs to go
-              into these sections.  */
-           strip = TRUE;
-         else
+         if (s->size != 0)
            {
              asection *target;
              const char *outname;
@@ -693,24 +682,35 @@ i370_elf_size_dynamic_sections (bfd *output_bfd,
        }
       else if (strcmp (name, ".got") != 0
               && strcmp (name, ".sdata") != 0
-              && strcmp (name, ".sdata2") != 0)
-       /* It's not one of our sections, so don't allocate space.  */
-       continue;
+              && strcmp (name, ".sdata2") != 0
+              && strcmp (name, ".dynbss") != 0
+              && strcmp (name, ".dynsbss") != 0)
+       {
+         /* It's not one of our sections, so don't allocate space.  */
+         continue;
+       }
 
-      if (strip)
+      if (s->size == 0)
        {
-         if (!bfd_section_removed_from_list (s->output_section->owner,
-                                             s->output_section))
-           {
-             bfd_section_list_remove (s->output_section->owner,
-                                      s->output_section);
-             --s->output_section->owner->section_count;
-           }
+         /* If we don't need this section, strip it from the
+            output file.  This is mostly to handle .rela.bss and
+            .rela.plt.  We must create both sections in
+            create_dynamic_sections, because they must be created
+            before the linker maps input sections to output
+            sections.  The linker does that before
+            adjust_dynamic_symbol is called, and it is that
+            function which decides whether anything needs to go
+            into these sections.  */
+         s->flags |= SEC_EXCLUDE;
          continue;
        }
+
+      if ((s->flags & SEC_HAS_CONTENTS) == 0)
+       continue;
+
       /* Allocate memory for the section contents.  */
       s->contents = bfd_zalloc (dynobj, s->size);
-      if (s->contents == NULL && s->size != 0)
+      if (s->contents == NULL)
        return FALSE;
     }
 
@@ -965,7 +965,7 @@ i370_elf_finish_dynamic_sections (bfd *output_bfd,
        }
     }
 
-  if (sgot)
+  if (sgot && sgot->size != 0)
     {
       unsigned char *contents = sgot->contents;
 
@@ -1296,7 +1296,7 @@ i370_elf_relocate_section (bfd *output_bfd,
 #ifdef DEBUG
                          if (indx <= 0)
                            {
-                             printf ("indx=%d section=%s flags=%08x name=%s\n",
+                             printf ("indx=%ld section=%s flags=%08x name=%s\n",
                                      indx, osec->name, osec->flags,
                                      h->root.root.string);
                            }
@@ -1440,19 +1440,9 @@ i370_noop (void)
   return 1;
 }
 
-/* We need to define these at least as no-ops to link glibc ld.so.  */
-
-#define elf_backend_add_symbol_hook \
-  (bfd_boolean (*) \
-     (bfd *, struct bfd_link_info *, Elf_Internal_Sym *, \
-      const char **, flagword *, asection **, bfd_vma *)) i370_noop
 #define elf_backend_finish_dynamic_symbol \
   (bfd_boolean (*) \
      (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, \
       Elf_Internal_Sym *)) i370_noop
-#define elf_backend_additional_program_headers \
-  (int (*) (bfd *)) i370_noop
-#define elf_backend_modify_segment_map \
-  (bfd_boolean (*) (bfd *, struct bfd_link_info *)) i370_noop
 
 #include "elf32-target.h"
This page took 0.038124 seconds and 4 git commands to generate.