Fix xcoff linker's ordering of pad sections
authorTom Rix <trix@redhat.com>
Thu, 3 Jan 2002 22:06:38 +0000 (22:06 +0000)
committerTom Rix <trix@redhat.com>
Thu, 3 Jan 2002 22:06:38 +0000 (22:06 +0000)
bfd/ChangeLog
bfd/xcofflink.c

index b5b8212418f600ac974c37ef10604db50678cff9..0f4c1dc5fac529d02cd61202cfafddccd8a012c0 100644 (file)
@@ -1,3 +1,8 @@
+2002-01-03  Tom Rix  <trix@redhat.com>
+
+       * xcofflink.c (_bfd_xcoff_bfd_final_link): Update .pad section ordering
+       for recent bfd_make_section_anyway change.
+
 2002-01-03  Nick Clifton  <nickc@cambridge.redhat.com>
 
        * elf32-arm.h (elf32_arm_final_link_relocate): Handle
index e27f648d048994455cdac0d6000f0614565b242e..199576989262ce59dd857c6944b0b48c369d9fd2 100644 (file)
@@ -3656,14 +3656,15 @@ _bfd_xcoff_bfd_final_link (abfd, info)
        {
          boolean saw_contents;
          int indx;
-         asection **op;
+         asection **op, **prev;
          file_ptr sofar;
-
+         
          /* Insert .pad sections before every section which has
              contents and is loaded, if it is preceded by some other
              section which has contents and is loaded.  */
          saw_contents = true;
-         for (op = &abfd->sections; *op != NULL; op = &(*op)->next)
+         for (op = &abfd->sections, prev = NULL; 
+              *op != NULL; prev = op, op = &(*op)->next)
            {
              if (strcmp ((*op)->name, ".pad") == 0)
                saw_contents = false;
@@ -3674,20 +3675,39 @@ _bfd_xcoff_bfd_final_link (abfd, info)
                    saw_contents = true;
                  else
                    {
-                     asection *n, *hold;
-
+                     asection *n, *hold, **st;
+                     
+                     /* Create a pad section and place it before the section
+                        that needs padding.  This requires unlinking and 
+                        relinking the bfd's sections list. 
+                        
+                        sections = S1
+                        .          S1.next = S2
+                        .          S2.next = S3
+                        .          S3.next = NULL
+                        section_tail = &S3.next */
+                     
                      hold = *op;
-                     *op = NULL;
+                     st = abfd->section_tail;
+                     
                      n = bfd_make_section_anyway (abfd, ".pad");
-                     BFD_ASSERT (*op == n);
-                     n->next = hold;
                      n->flags = SEC_HAS_CONTENTS;
-                     n->alignment_power = 0;
+                     n->alignment_power = 0; 
+                     
+                     if (NULL == prev) 
+                       abfd->sections = n;
+                     else
+                       (*prev)->next = n;
+                     
+                     n->next = hold;
+                     *st = NULL;
+                     abfd->section_tail = st;
+
                      saw_contents = false;
                    }
                }
            }
-
+         
          /* Reset the section indices after inserting the new
              sections.  */
          indx = 0;
@@ -3958,17 +3978,6 @@ _bfd_xcoff_bfd_final_link (abfd, info)
        goto error_return;
     }
 
-  /* init-fini */
-  if (info->init_function || info->fini_function)
-    {
-      struct xcoff_link_hash_entry *hrtinit;
-
-      hrtinit = xcoff_link_hash_lookup (xcoff_hash_table (info),
-                                       "__rtinit",
-                                       false, false, true);
-    }
-
-
   /* Write out all the global symbols which do not come from XCOFF
      input files.  */
   xcoff_link_hash_traverse (xcoff_hash_table (info),