* Makefile.am (libbfd.h): Add "Extracted from.." comment.
[deliverable/binutils-gdb.git] / bfd / aix386-core.c
index 10cfb519e07dc86aa6c0b970007fcf7a2e5bf3b7..591397e4a2e4b7bf65f26f12b88504d08e8364b2 100644 (file)
@@ -2,7 +2,7 @@
    This was based on trad-core.c, which was written by John Gilmore of
         Cygnus Support.
    Copyright 1988, 1989, 1991, 1992, 1993, 1994, 1996, 1998, 1999, 2000,
-   2001
+   2001, 2002
    Free Software Foundation, Inc.
    Written by Minh Tran-Le <TRANLE@INTELLICORP.COM>.
    Converted to back end form by Ian Lance Taylor <ian@cygnus.com>.
@@ -108,96 +108,85 @@ aix386_core_file_p (abfd)
        bfd_set_error (bfd_error_wrong_format);
     loser:
       bfd_release (abfd, (char *) mergem);
+      abfd->tdata.any = NULL;
+      bfd_section_list_clear (abfd);
       return 0;
     }
 
   set_tdata (abfd, &mergem->coredata);
   core_hdr (abfd) = core;
 
-  /* Create the sections.  This is raunchy, but bfd_close wants to
-     reclaim them.  */
-  amt = sizeof (asection);
-  core_regsec (abfd) = (asection *) bfd_zalloc (abfd, amt);
+  /* Create the sections.  */
+  core_regsec (abfd) = bfd_make_section_anyway (abfd, ".reg");
   if (core_regsec (abfd) == NULL)
     goto loser;
 
-  core_reg2sec (abfd) = (asection *) bfd_zalloc (abfd, amt);
+  core_regsec (abfd)->flags = SEC_HAS_CONTENTS;
+  core_regsec (abfd)->_raw_size = sizeof (core->cd_regs);
+  core_regsec (abfd)->vma = (bfd_vma) -1;
+
+  /* We'll access the regs afresh in the core file, like any section.  */
+  core_regsec (abfd)->filepos =
+    (file_ptr) offsetof (struct corehdr, cd_regs[0]);
+
+  core_reg2sec (abfd) = bfd_make_section_anyway (abfd, ".reg2");
   if (core_reg2sec (abfd) == NULL)
     /* bfd_release frees everything allocated after it's arg.  */
     goto loser;
 
+  core_reg2sec (abfd)->flags = SEC_HAS_CONTENTS;
+  core_reg2sec (abfd)->_raw_size = sizeof (core->cd_fpregs);
+  core_reg2sec (abfd)->vma = (bfd_vma) -1;
+  core_reg2sec (abfd)->filepos =
+    (file_ptr) offsetof (struct corehdr, cd_fpregs);
+
   for (i = 0, n = 0; (i < MAX_CORE_SEGS) && (core->cd_segs[i].cs_type); i++)
     {
+      const char *sname;
+      flagword flags;
+
       if (core->cd_segs[i].cs_offset == 0)
        continue;
-      core_section (abfd, n) = (asection *) bfd_zalloc (abfd, amt);
-      if (core_section (abfd, n) == NULL)
-       goto loser;
 
       switch (core->cd_segs[i].cs_type)
        {
        case COR_TYPE_DATA:
-         core_section (abfd, n)->name = ".data";
-         core_section (abfd, n)->flags = (SEC_ALLOC + SEC_LOAD +
-                                          SEC_HAS_CONTENTS);
+         sname = ".data";
+         flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
          break;
        case COR_TYPE_STACK:
-         core_section (abfd, n)->name = ".stack";
-         core_section (abfd, n)->flags = (SEC_ALLOC + SEC_LOAD +
-                                          SEC_HAS_CONTENTS);
+         sname = ".stack";
+         flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
          break;
        case COR_TYPE_LIBDATA:
-         core_section (abfd, n)->name = ".libdata";
-         core_section (abfd, n)->flags = (SEC_ALLOC + SEC_HAS_CONTENTS);
+         sname = ".libdata";
+         flags = SEC_ALLOC + SEC_HAS_CONTENTS;
          break;
        case COR_TYPE_WRITE:
-         core_section (abfd, n)->name = ".writeable";
-         core_section (abfd, n)->flags = (SEC_ALLOC + SEC_HAS_CONTENTS);
+         sname = ".writeable";
+         flags = SEC_ALLOC + SEC_HAS_CONTENTS;
          break;
        case COR_TYPE_MSC:
-         core_section (abfd, n)->name = ".misc";
-         core_section (abfd, n)->flags = (SEC_ALLOC + SEC_HAS_CONTENTS);
+         sname = ".misc";
+         flags = SEC_ALLOC + SEC_HAS_CONTENTS;
          break;
        default:
-         core_section (abfd, n)->name = ".unknown";
-         core_section (abfd, n)->flags = (SEC_ALLOC + SEC_HAS_CONTENTS);
+         sname = ".unknown";
+         flags = SEC_ALLOC + SEC_HAS_CONTENTS;
          break;
        }
+      core_section (abfd, n) = bfd_make_section_anyway (abfd, sname);
+      if (core_section (abfd, n) == NULL)
+       goto loser;
+
+      core_section (abfd, n)->flags = flags;
       core_section (abfd, n)->_raw_size = core->cd_segs[i].cs_len;
       core_section (abfd, n)->vma       = core->cd_segs[i].cs_address;
       core_section (abfd, n)->filepos   = core->cd_segs[i].cs_offset;
       core_section (abfd, n)->alignment_power = 2;
-      core_section (abfd, n)->next      = NULL;
-      if (n > 0)
-       core_section (abfd, (n - 1))->next = core_section (abfd, n);
-
-      abfd->section_count = ++n;
+      n++;
     }
 
-  core_regsec (abfd)->name = ".reg";
-  core_reg2sec (abfd)->name = ".reg2";
-
-  core_regsec (abfd)->flags = SEC_HAS_CONTENTS;
-  core_reg2sec (abfd)->flags = SEC_HAS_CONTENTS;
-
-  core_regsec (abfd)->_raw_size = sizeof (core->cd_regs);
-  core_reg2sec (abfd)->_raw_size = sizeof (core->cd_fpregs);
-
-  core_regsec (abfd)->vma = (bfd_vma) -1;
-  core_reg2sec (abfd)->vma = (bfd_vma) -1;
-
-  /* We'll access the regs afresh in the core file, like any section.  */
-  core_regsec (abfd)->filepos =
-    (file_ptr) offsetof (struct corehdr, cd_regs[0]);
-  core_reg2sec (abfd)->filepos =
-    (file_ptr) offsetof (struct corehdr, cd_fpregs);
-
-  /* Add the 2 reg fake sections to abfd.  */
-  abfd->section_count += 2;
-  abfd->sections = core_regsec (abfd);
-  core_regsec (abfd)->next = core_reg2sec (abfd);
-  core_reg2sec (abfd)->next = core_section (abfd, 0);
-
   return abfd->xvec;
 }
 
This page took 0.024805 seconds and 4 git commands to generate.