]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - bfd/elfcore.h
* config/sh/tm-sh.h (BELIEVE_PCC_PROMOTION): Define, so that
[thirdparty/binutils-gdb.git] / bfd / elfcore.h
index 7e4403d78d2aed8e10dbf2e53db1e6a46c2eecb0..ab8b79fe132b017822b6b47c52ce4496eb30d2ca 100644 (file)
@@ -1,5 +1,5 @@
 /* ELF core file support for BFD.
-   Copyright  1995 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 
 This file is part of BFD, the Binary File Descriptor library.
 
@@ -19,28 +19,53 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 /* Core file support */
 
 #ifdef HAVE_SYS_PROCFS_H               /* Some core file support requires host /proc files */
+#include <signal.h>
 #include <sys/procfs.h>
+
+/* Solaris includes the field pr_who that indicates the thread number within
+   the process.  */
+
+#ifdef PIOCOPENLWP
+#define get_thread(STATUS) ((((prstatus_t *)(STATUS))->pr_who << 16) \
+                           | ((prstatus_t *)(STATUS))->pr_pid)
+#else
+#define get_thread(STATUS) (((prstatus_t *)(STATUS))->pr_pid)
+#endif
 #else
 #define bfd_prstatus(abfd, descdata, descsz, filepos) true
 #define bfd_fpregset(abfd, descdata, descsz, filepos) true
 #define bfd_prpsinfo(abfd, descdata, descsz, filepos) true
+#define get_thread(STATUS) (1)
 #endif
 
 #ifdef HAVE_SYS_PROCFS_H
 
+static int did_reg;
+static int did_reg2;
+
 static boolean
-bfd_prstatus (abfd, descdata, descsz, filepos)
+bfd_prstatus (abfd, descdata, descsz, filepos, thread)
      bfd *abfd;
      char *descdata;
      int descsz;
      long filepos;
+     int thread;
 {
   asection *newsect;
   prstatus_t *status = (prstatus_t *) 0;
 
   if (descsz == sizeof (prstatus_t))
     {
-      newsect = bfd_make_section (abfd, ".reg");
+      char secname[100];
+      char *p;
+
+      sprintf (secname, ".reg/%d", thread);
+      p = bfd_alloc (abfd, strlen (secname) + 1);
+      if (!p)
+       return false;
+      strcpy (p, secname);
+      
+      newsect = bfd_make_section (abfd, p);
       if (newsect == NULL)
        return false;
       newsect->_raw_size = sizeof (status->pr_reg);
@@ -51,6 +76,19 @@ bfd_prstatus (abfd, descdata, descsz, filepos)
        {
          memcpy (core_prstatus (abfd), descdata, descsz);
        }
+
+      if (!did_reg++)
+       {
+         asection *regsect;
+
+         regsect = bfd_make_section (abfd, ".reg");
+         if (regsect == NULL)
+           return false;
+         regsect->_raw_size = newsect->_raw_size;
+         regsect->filepos = newsect->filepos;
+         regsect->flags = newsect->flags;
+         regsect->alignment_power = newsect->alignment_power;
+       }
     }
   return true;
 }
@@ -74,21 +112,44 @@ bfd_prpsinfo (abfd, descdata, descsz, filepos)
 }
 
 static boolean
-bfd_fpregset (abfd, descdata, descsz, filepos)
+bfd_fpregset (abfd, descdata, descsz, filepos, thread)
      bfd *abfd;
      char *descdata;
      int descsz;
      long filepos;
+     int thread;
 {
   asection *newsect;
+  char secname[100];
+  char *p;
 
-  newsect = bfd_make_section (abfd, ".reg2");
+  sprintf (secname, ".reg2/%d", thread);
+  p = bfd_alloc (abfd, strlen (secname) + 1);
+  if (!p)
+    return false;
+  strcpy (p, secname);
+
+  newsect = bfd_make_section (abfd, p);
   if (newsect == NULL)
     return false;
   newsect->_raw_size = descsz;
   newsect->filepos = filepos;
   newsect->flags = SEC_HAS_CONTENTS;
   newsect->alignment_power = 2;
+
+  if (!did_reg2++)
+    {
+      asection *regsect;
+
+      regsect = bfd_make_section (abfd, ".reg2");
+      if (regsect == NULL)
+       return false;
+      regsect->_raw_size = newsect->_raw_size;
+      regsect->filepos = newsect->filepos;
+      regsect->flags = newsect->flags;
+      regsect->alignment_power = newsect->alignment_power;
+    }
+
   return true;
 }
 
@@ -236,9 +297,13 @@ elf_corefile_note (abfd, hdr)
   char *sectname;              /* Name to use for new section */
   long filepos;                        /* File offset to descriptor data */
   asection *newsect;
+  int thread = 1;              /* Current thread number */
+
+  did_reg = 0;                 /* Non-zero if we made .reg section */
+  did_reg2 = 0;                        /* Ditto for .reg2 */
 
   if (hdr->p_filesz > 0
-      && (buf = (char *) malloc ((size_t) hdr->p_filesz)) != NULL
+      && (buf = (char *) bfd_malloc ((size_t) hdr->p_filesz)) != NULL
       && bfd_seek (abfd, hdr->p_offset, SEEK_SET) != -1
       && bfd_read ((PTR) buf, hdr->p_filesz, 1, abfd) == hdr->p_filesz)
     {
@@ -255,15 +320,18 @@ elf_corefile_note (abfd, hdr)
            {
            case NT_PRSTATUS:
              /* process descdata as prstatus info */
-             if (! bfd_prstatus (abfd, descdata, i_note.descsz, filepos))
+             thread = get_thread (descdata);
+             if (! bfd_prstatus (abfd, descdata, i_note.descsz, filepos,
+                                 thread))
                return false;
-             sectname = ".prstatus";
+             sectname = NULL;
              break;
            case NT_FPREGSET:
              /* process descdata as fpregset info */
-             if (! bfd_fpregset (abfd, descdata, i_note.descsz, filepos))
+             if (! bfd_fpregset (abfd, descdata, i_note.descsz, filepos,
+                                 thread))
                return false;
-             sectname = ".fpregset";
+             sectname = NULL;
              break;
            case NT_PRPSINFO:
              /* process descdata as prpsinfo */
@@ -296,7 +364,6 @@ elf_corefile_note (abfd, hdr)
     }
   else if (hdr->p_filesz > 0)
     {
-      bfd_set_error (bfd_error_no_memory);
       return false;
     }
   return true;
@@ -367,11 +434,11 @@ elf_core_file_p (abfd)
   switch (x_ehdr.e_ident[EI_DATA])
     {
     case ELFDATA2MSB:          /* Big-endian */
-      if (abfd->xvec->byteorder_big_p == false)
+      if (! bfd_big_endian (abfd))
        goto wrong;
       break;
     case ELFDATA2LSB:          /* Little-endian */
-      if (abfd->xvec->byteorder_big_p == true)
+      if (! bfd_little_endian (abfd))
        goto wrong;
       break;
     case ELFDATANONE:          /* No data encoding specified */