This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH/RFC 01/02 v2] Refactor PRPSINFO handling on Binutils


Thanks for the review.

On Tuesday, December 18 2012, Jan Kratochvil wrote:

>> diff --git a/bfd/Makefile.in b/bfd/Makefile.in
>> index 92d9d08..e12deb5 100644
>> --- a/bfd/Makefile.in
>> +++ b/bfd/Makefile.in
>> @@ -1050,7 +1050,7 @@ BUILD_CFILES = \
>>  CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
>>  SOURCE_HFILES = \
>>  	aout-target.h aoutf1.h aoutx.h coffcode.h coffswap.h ecoffswap.h \
>> -	elf-bfd.h elf-hppa.h elf32-hppa.h \
>> +	elf-bfd.h elf-psinfo.h elf-hppa.h elf32-hppa.h \
>>  	elf64-hppa.h elfcode.h elfcore.h \
>>  	freebsd.h genlink.h go32stub.h \
>>  	libaout.h libbfd.h libcoff.h libecoff.h libhppa.h libieee.h \
>> diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
>> index b8d82b1..d314291 100644
>> --- a/bfd/elf-bfd.h
>> +++ b/bfd/elf-bfd.h
>> @@ -2234,11 +2234,15 @@ extern bfd_boolean bfd_elf_lookup_section_flags
>>  extern Elf_Internal_Phdr * _bfd_elf_find_segment_containing_section
>>    (bfd * abfd, asection * section);
>>  
>> +/* Forward declaration of prpsinfo.  See `elf-psinfo.h' for more details.  */
>> +
>> +struct elf_internal_prpsinfo;
>> +
>>  /* Exported interface for writing elf corefile notes. */
>>  extern char *elfcore_write_note
>>    (bfd *, char *, int *, const char *, int, const void *, int);
>>  extern char *elfcore_write_prpsinfo
>> -  (bfd *, char *, int *, const char *, const char *);
>> +  (bfd *, char *, int *, const struct elf_internal_prpsinfo *);
>>  extern char *elfcore_write_prstatus
>>    (bfd *, char *, int *, long, int, const void *);
>>  extern char * elfcore_write_pstatus
>> diff --git a/bfd/elf-psinfo.h b/bfd/elf-psinfo.h
>> new file mode 100644
>> index 0000000..61b38e1
>> --- /dev/null
>> +++ b/bfd/elf-psinfo.h
>> @@ -0,0 +1,215 @@
>> +/* Declarations for PRPSINFO structures under ELF on GNU/Linux.
>> +   Copyright 2012 Free Software Foundation, Inc.
>> +
>> +   This file is part of BFD, the Binary File Descriptor library.
>> +
>> +   This program is free software; you can redistribute it and/or modify
>> +   it under the terms of the GNU General Public License as published by
>> +   the Free Software Foundation; either version 3 of the License, or
>> +   (at your option) any later version.
>> +
>> +   This program is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> +   GNU General Public License for more details.
>> +
>> +   You should have received a copy of the GNU General Public License
>> +   along with this program; if not, write to the Free Software
>> +   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
>> +   MA 02110-1301, USA.  */
>> +
>> +#undef HAVE_PRPSINFO32_T
>> +#define HAVE_PRPSINFO32_T
>> +#undef HAVE_PRPSINFO32_T_PR_PID
>> +#define HAVE_PRPSINFO32_T_PR_PID
>
> This does not seem to be useful, these are auto-detected by configure and
> elf-psinfo.h is included unconditionally.  Therefore they could be completely
> removed.

Indeed, I removed the last referecen to those defines a few minutes
before sending the patch.  I agree.

> But in reality they should not be removed as your elf-core definitions do not
> cover very every target supported by bfd, only some of them.

The patch covers the existing targets that already implemented the
*_write_core_note function, with the exception of i386 which is a new
implementation.  So I still agree with your comment above, that the
defines can be removed.

>> +/* Maximum size of the arguments that can be stored in a PRPSINFO
>> +   structure.  */
>> +
>> +#define ELF_PRARGSZ (80)
>> +
>> +/* Internal structure which holds information to be included in the
>> +   PRPSINFO section of the corefile.
>> +
>> +   This is an "internal" structure in the sense that it should be used to
>> +   pass information to BFD (via the `elfcore_write_prpsinfo', for example),
>> +   so things like endianess shouldn't be an issue.  This structure will
>> +   eventually be converted in one of the `elf_external_*' structures
>> +   below.  */
>> +
>> +struct elf_internal_prpsinfo
>> +  {
>> +    char pr_state;			/* Numeric process state.  */
>> +    char pr_sname;			/* Char for pr_state.  */
>> +    char pr_zomb;			/* Zombie.  */
>> +    char pr_nice;			/* Nice val.  */
>> +    unsigned long pr_flag;		/* Flags.  */
>> +    unsigned int pr_uid;
>> +    unsigned int pr_gid;
>> +    int pr_pid, pr_ppid, pr_pgrp, pr_sid;
>> +    /* Lots missing */
>> +    char pr_fname[16];			/* Filename of executable.  */
>> +    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
>> +  };
>> +
>> +/* External 32-bit structure for PRPSINFO.  This structure is ABI-defined,
>> +   thus we choose to use char arrays here in order to avoid dealing with
>> +   different types in different architectures.
>> +
>> +   This structure will ultimately be written in the corefile's note section,
>> +   as the PRPSINFO.  */
>> +
>> +struct elf_external_prpsinfo32
>> +  {
>> +    char pr_state;			/* Numeric process state.  */
>> +    char pr_sname;			/* Char for pr_state.  */
>> +    char pr_zomb;			/* Zombie.  */
>> +    char pr_nice;			/* Nice val.  */
>> +    char pr_flag[4];			/* Flags.  */
>> +    char pr_uid[2];
>> +    char pr_gid[2];
>> +    char pr_pid[4];
>> +    char pr_ppid[4];
>> +    char pr_pgrp[4];
>> +    char pr_sid[4];
>> +    /* Lots missing */
>> +    char pr_fname[16];			/* Filename of executable.  */
>> +    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
>> +  };
>
> As it does not match very every arch I believe you should just copy it into
> elf*-*.c files containing the *_elf_write_core_note function for archs where
> you have verified (by comparing some headers, not just by experiment) it does
> match.

I disagree.  As I said above, the patch covers all targets that were
already implementing *_write_core_note.  If some new target decides to
implement it, it is just a matter of including "elf-psinfo.h" and using
the right structures.

>> +
>> +/* External 32-bit PPC structure for PRPSINFO.
>
> If it is arch-specific then it should not be in a generic file.
>
> I believe elf32-ppc.c and elf64-ppc.c files are fine for it.

Ok, I am fine with that.  I made this decision based on a quick chat
that I had with Pedro, asking him if it would be OK to create an
arch-specific structure for the case of 32-bit PPC.

I will move this definition to elf32-ppc.c, which is the only place that
uses this.

> In the end I do not see a use for this header file.

As I said above, I disagree.  The header file is useful for having a
single place which defines those structures (i.e., i386, x32 and ARM use
the same elf_external_prpsinfo32 strucutre).  Also, the header is useful
for including in the BFD clients (I'm thiking "GDB" here) which can use
the elf_internal_prpsinfo strucuture to pass information to BFD.

However, I agree with you that the arch-specific external structures
(like the PPC above) can be declared in their .c files.

>> diff --git a/bfd/elf.c b/bfd/elf.c
>> index a92dd5d..a39b88c 100644
>> --- a/bfd/elf.c
>> +++ b/bfd/elf.c
>> @@ -44,6 +44,7 @@ SECTION
>>  #include "elf-bfd.h"
>>  #include "libiberty.h"
>>  #include "safe-ctype.h"
>> +#include "elf-psinfo.h"
>>  
>>  #ifdef CORE_HEADER
>>  #include CORE_HEADER
>> @@ -8161,13 +8162,6 @@ elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
>>    return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
>>  }
>>  
>> -#if defined (HAVE_PRPSINFO_T)
>> -typedef prpsinfo_t   elfcore_psinfo_t;
>> -#if defined (HAVE_PRPSINFO32_T)		/* Sparc64 cross Sparc32 */
>> -typedef prpsinfo32_t elfcore_psinfo32_t;
>> -#endif
>> -#endif
>> -
>
> This is arch-independent file (elf.c).  Some targets are unverified they match
> your new ABI elfcore definition.  As they may provide correct system
> prpsinfo_t defintion you should use it there, if available.

Ok, I will revert this change.

>>  #if defined (HAVE_PSINFO_T)
>>  typedef psinfo_t   elfcore_psinfo_t;
>>  #if defined (HAVE_PSINFO32_T)		/* Sparc64 cross Sparc32 */
>> @@ -8201,17 +8195,17 @@ _bfd_elfcore_strndup (bfd *abfd, char *start, size_t max)
>>    return dups;
>>  }
>>  
>> -#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
>
> All these changes are like the comment above.

I will revert this.

>> diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
>> index fd7d26a..cacc895 100644
>> --- a/bfd/elf32-arm.c
>> +++ b/bfd/elf32-arm.c
>> @@ -30,6 +30,7 @@
>>  #include "elf-nacl.h"
>>  #include "elf-vxworks.h"
>>  #include "elf/arm.h"
>> +#include "elf-psinfo.h"
>>  
>>  /* Return the relocation section associated with NAME.  HTAB is the
>>     bfd's elf32_arm_link_hash_entry.  */
>> @@ -2004,17 +2005,19 @@ elf32_arm_nabi_write_core_note (bfd *abfd, char *buf, int *bufsiz,
>>  
>>      case NT_PRPSINFO:
>>        {
>> -	char data[124];
>> +	const struct elf_internal_prpsinfo *prpsinfo;
>> +	struct elf_external_prpsinfo32 data;
>>  	va_list ap;
>>  
>>  	va_start (ap, note_type);
>> -	memset (data, 0, sizeof (data));
>> -	strncpy (data + 28, va_arg (ap, const char *), 16);
>> -	strncpy (data + 44, va_arg (ap, const char *), 80);
>> +	prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
>>  	va_end (ap);
>>  
>> +	memset (&data, 0, sizeof (data));
>> +	PRPSINFO32_COPY_FIELDS (abfd, prpsinfo, data);
>> +
>>  	return elfcore_write_note (abfd, buf, bufsiz,
>> -				   "CORE", note_type, data, sizeof (data));
>> +				   "CORE", note_type, &data, sizeof (data));
>>        }
>>  
>>      case NT_PRSTATUS:
>> diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
>> index a188cec..5b81baa 100644
>> --- a/bfd/elf32-i386.c
>> +++ b/bfd/elf32-i386.c
>> @@ -31,12 +31,20 @@
>>  #include "objalloc.h"
>>  #include "hashtab.h"
>>  #include "dwarf2.h"
>> +#include "elf-bfd.h"
>> +#include "elf-psinfo.h"
>> +
>> +#include <stdarg.h>
>>  
>>  /* 386 uses REL relocations instead of RELA.  */
>>  #define USE_REL	1
>>  
>>  #include "elf/i386.h"
>>  
>> +#ifdef CORE_HEADER
>> +#include CORE_HEADER
>> +#endif
>
> I believe new CORE_HEADER should not be introduced, they are rather deprecated
> as they depend on system <procfs.h> which is not compatible for cross-build
> core handling.  (But I may be completely wrong here.)

Yeah, this is a point of confusion for me as well.  I will remove this
part, and resubmit the patch.  Let's wait until someone more experienced
comments.  BTW, in order to be able to remove this, I had to "return
NULL" when handling the "NT_PRSTATUS" case inside the
elf_i386_write_core_note.

Ok, here is the new version of the patch, with some of your comments
addressed.  I didn't make some changes suggested above because of my
disagreement, but we can keep discussing.

Thanks,

-- 
Sergio

---
 bfd/Makefile.in         |    2 +-
 bfd/elf-bfd.h           |    6 ++-
 bfd/elf-psinfo.h        |  155 +++++++++++++++++++++++++++++++++++++++++++++++
 bfd/elf.c               |   17 +++---
 bfd/elf32-arm.c         |   13 +++--
 bfd/elf32-i386.c        |   42 +++++++++++++
 bfd/elf32-ppc.c         |   69 +++++++++++++++++++--
 bfd/elf64-ppc.c         |   14 +++--
 bfd/elf64-x86-64.c      |   36 ++++++------
 bfd/hosts/x86-64linux.h |   37 -----------
 10 files changed, 311 insertions(+), 80 deletions(-)
 create mode 100644 bfd/elf-psinfo.h

diff --git a/bfd/Makefile.in b/bfd/Makefile.in
index 92d9d08..e12deb5 100644
--- a/bfd/Makefile.in
+++ b/bfd/Makefile.in
@@ -1050,7 +1050,7 @@ BUILD_CFILES = \
 CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
 SOURCE_HFILES = \
 	aout-target.h aoutf1.h aoutx.h coffcode.h coffswap.h ecoffswap.h \
-	elf-bfd.h elf-hppa.h elf32-hppa.h \
+	elf-bfd.h elf-psinfo.h elf-hppa.h elf32-hppa.h \
 	elf64-hppa.h elfcode.h elfcore.h \
 	freebsd.h genlink.h go32stub.h \
 	libaout.h libbfd.h libcoff.h libecoff.h libhppa.h libieee.h \
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index b8d82b1..d314291 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2234,11 +2234,15 @@ extern bfd_boolean bfd_elf_lookup_section_flags
 extern Elf_Internal_Phdr * _bfd_elf_find_segment_containing_section
   (bfd * abfd, asection * section);
 
+/* Forward declaration of prpsinfo.  See `elf-psinfo.h' for more details.  */
+
+struct elf_internal_prpsinfo;
+
 /* Exported interface for writing elf corefile notes. */
 extern char *elfcore_write_note
   (bfd *, char *, int *, const char *, int, const void *, int);
 extern char *elfcore_write_prpsinfo
-  (bfd *, char *, int *, const char *, const char *);
+  (bfd *, char *, int *, const struct elf_internal_prpsinfo *);
 extern char *elfcore_write_prstatus
   (bfd *, char *, int *, long, int, const void *);
 extern char * elfcore_write_pstatus
diff --git a/bfd/elf-psinfo.h b/bfd/elf-psinfo.h
new file mode 100644
index 0000000..b2d6092
--- /dev/null
+++ b/bfd/elf-psinfo.h
@@ -0,0 +1,155 @@
+/* Declarations for PRPSINFO structures under ELF on GNU/Linux.
+   Copyright 2012 Free Software Foundation, Inc.
+
+   This file is part of BFD, the Binary File Descriptor library.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+/* Maximum size of the arguments that can be stored in a PRPSINFO
+   structure.  */
+
+#define ELF_PRARGSZ (80)
+
+/* Internal structure which holds information to be included in the
+   PRPSINFO section of the corefile.
+
+   This is an "internal" structure in the sense that it should be used to
+   pass information to BFD (via the `elfcore_write_prpsinfo', for example),
+   so things like endianess shouldn't be an issue.  This structure will
+   eventually be converted in one of the `elf_external_*' structures
+   below.  */
+
+struct elf_internal_prpsinfo
+  {
+    char pr_state;			/* Numeric process state.  */
+    char pr_sname;			/* Char for pr_state.  */
+    char pr_zomb;			/* Zombie.  */
+    char pr_nice;			/* Nice val.  */
+    unsigned long pr_flag;		/* Flags.  */
+    unsigned int pr_uid;
+    unsigned int pr_gid;
+    int pr_pid, pr_ppid, pr_pgrp, pr_sid;
+    /* Lots missing */
+    char pr_fname[16];			/* Filename of executable.  */
+    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
+  };
+
+/* External 32-bit structure for PRPSINFO.  This structure is ABI-defined,
+   thus we choose to use char arrays here in order to avoid dealing with
+   different types in different architectures.
+
+   This structure will ultimately be written in the corefile's note section,
+   as the PRPSINFO.  */
+
+struct elf_external_prpsinfo32
+  {
+    char pr_state;			/* Numeric process state.  */
+    char pr_sname;			/* Char for pr_state.  */
+    char pr_zomb;			/* Zombie.  */
+    char pr_nice;			/* Nice val.  */
+    char pr_flag[4];			/* Flags.  */
+    char pr_uid[2];
+    char pr_gid[2];
+    char pr_pid[4];
+    char pr_ppid[4];
+    char pr_pgrp[4];
+    char pr_sid[4];
+    /* Lots missing */
+    char pr_fname[16];			/* Filename of executable.  */
+    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
+  };
+
+/* Helper macro to copy (properly handling endianess) things from the
+   `elf_internal_prpsinfo' structure to the `elf_external_prpsinfo32'
+   structure.
+
+   Note that FROM should be a pointer, and TO should be the explicit type.  */
+
+#define PRPSINFO32_COPY_FIELDS(abfd, from, to) \
+  do \
+    { \
+      H_PUT_8 (abfd, from->pr_state, &to.pr_state); \
+      H_PUT_8 (abfd, from->pr_sname, &to.pr_sname); \
+      H_PUT_8 (abfd, from->pr_zomb, &to.pr_zomb); \
+      H_PUT_8 (abfd, from->pr_nice, &to.pr_nice); \
+      H_PUT_32 (abfd, from->pr_flag, to.pr_flag); \
+      H_PUT_16 (abfd, from->pr_uid, to.pr_uid); \
+      H_PUT_16 (abfd, from->pr_gid, to.pr_gid); \
+      H_PUT_32 (abfd, from->pr_pid, to.pr_pid); \
+      H_PUT_32 (abfd, from->pr_ppid, to.pr_ppid); \
+      H_PUT_32 (abfd, from->pr_pgrp, to.pr_pgrp); \
+      H_PUT_32 (abfd, from->pr_sid, to.pr_sid); \
+      strncpy (to.pr_fname, from->pr_fname, sizeof (to.pr_fname)); \
+      strncpy (to.pr_psargs, from->pr_psargs, sizeof (to.pr_psargs)); \
+    } while (0)
+
+/* External 64-bit structure for PRPSINFO.  This structure is ABI-defined,
+   thus we choose to use char arrays here in order to avoid dealing with
+   different types in different architectures.
+
+   Differently from the 32-bit version, the PowerPC guys made our lives better
+   and used the same size as the other architectures.
+
+   This structure will ultimately be written in the corefile's note section,
+   as the PRPSINFO.  */
+
+struct elf_external_prpsinfo64
+  {
+    char pr_state;			/* Numeric process state.  */
+    char pr_sname;			/* Char for pr_state.  */
+    char pr_zomb;			/* Zombie.  */
+    char pr_nice;			/* Nice val.  */
+    char pr_flag[8];			/* Flags.  */
+    char gap[4];
+    char pr_uid[4];
+    char pr_gid[4];
+    char pr_pid[4];
+    char pr_ppid[4];
+    char pr_pgrp[4];
+    char pr_sid[4];
+    /* Lots missing */
+    char pr_fname[16];			/* Filename of executable.  */
+    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
+  };
+
+/* Helper macro to copy (properly handling endianess) things from the
+   `elf_internal_prpsinfo' structure to the `elf_external_prpsinfo64'
+   structure.
+
+   Note that FROM should be a pointer, and TO should be the explicit type.  */
+
+#define PRPSINFO64_COPY_FIELDS(abfd, from, to) \
+  do \
+    { \
+      H_PUT_8 (abfd, from->pr_state, &to.pr_state); \
+      H_PUT_8 (abfd, from->pr_sname, &to.pr_sname); \
+      H_PUT_8 (abfd, from->pr_zomb, &to.pr_zomb); \
+      H_PUT_8 (abfd, from->pr_nice, &to.pr_nice); \
+      H_PUT_64 (abfd, from->pr_flag, to.pr_flag); \
+      H_PUT_32 (abfd, from->pr_uid, to.pr_uid); \
+      H_PUT_32 (abfd, from->pr_gid, to.pr_gid); \
+      H_PUT_32 (abfd, from->pr_pid, to.pr_pid); \
+      H_PUT_32 (abfd, from->pr_ppid, to.pr_ppid); \
+      H_PUT_32 (abfd, from->pr_pgrp, to.pr_pgrp); \
+      H_PUT_32 (abfd, from->pr_sid, to.pr_sid); \
+      strncpy (to.pr_fname, from->pr_fname, sizeof (to.pr_fname)); \
+      strncpy (to.pr_psargs, from->pr_psargs, sizeof (to.pr_psargs)); \
+    } while (0)
+
+/* Process info.  In the end we do provide typedefs for them.  */
+
+typedef struct elf_external_prpsinfo32 prpsinfo32_t;
+typedef struct elf_external_prpsinfo64 prpsinfo64_t;
diff --git a/bfd/elf.c b/bfd/elf.c
index a92dd5d..4556386 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -44,6 +44,7 @@ SECTION
 #include "elf-bfd.h"
 #include "libiberty.h"
 #include "safe-ctype.h"
+#include "elf-psinfo.h"
 
 #ifdef CORE_HEADER
 #include CORE_HEADER
@@ -9062,16 +9063,16 @@ char *
 elfcore_write_prpsinfo (bfd  *abfd,
 			char *buf,
 			int  *bufsiz,
-			const char *fname,
-			const char *psargs)
+			const struct elf_internal_prpsinfo *input)
 {
   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
 
   if (bed->elf_backend_write_core_note != NULL)
     {
       char *ret;
+
       ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
-						 NT_PRPSINFO, fname, psargs);
+						 NT_PRPSINFO, input);
       if (ret != NULL)
 	return ret;
     }
@@ -9089,8 +9090,8 @@ elfcore_write_prpsinfo (bfd  *abfd,
 #endif
 
       memset (&data, 0, sizeof (data));
-      strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
-      strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+      strncpy (data.pr_fname, input->pr_fname, sizeof (data.pr_fname));
+      strncpy (data.pr_psargs, input->pr_psargs, sizeof (data.pr_psargs));
       return elfcore_write_note (abfd, buf, bufsiz,
 				 "CORE", note_type, &data, sizeof (data));
     }
@@ -9101,13 +9102,13 @@ elfcore_write_prpsinfo (bfd  *abfd,
       psinfo_t data;
       int note_type = NT_PSINFO;
 #else
-      prpsinfo_t data;
+      prpsinfo64_t data;
       int note_type = NT_PRPSINFO;
 #endif
 
       memset (&data, 0, sizeof (data));
-      strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
-      strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+      strncpy (data.pr_fname, input->pr_fname, sizeof (data.pr_fname));
+      strncpy (data.pr_psargs, input->pr_psargs, sizeof (data.pr_psargs));
       return elfcore_write_note (abfd, buf, bufsiz,
 				 "CORE", note_type, &data, sizeof (data));
     }
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index fd7d26a..cacc895 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -30,6 +30,7 @@
 #include "elf-nacl.h"
 #include "elf-vxworks.h"
 #include "elf/arm.h"
+#include "elf-psinfo.h"
 
 /* Return the relocation section associated with NAME.  HTAB is the
    bfd's elf32_arm_link_hash_entry.  */
@@ -2004,17 +2005,19 @@ elf32_arm_nabi_write_core_note (bfd *abfd, char *buf, int *bufsiz,
 
     case NT_PRPSINFO:
       {
-	char data[124];
+	const struct elf_internal_prpsinfo *prpsinfo;
+	struct elf_external_prpsinfo32 data;
 	va_list ap;
 
 	va_start (ap, note_type);
-	memset (data, 0, sizeof (data));
-	strncpy (data + 28, va_arg (ap, const char *), 16);
-	strncpy (data + 44, va_arg (ap, const char *), 80);
+	prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
 	va_end (ap);
 
+	memset (&data, 0, sizeof (data));
+	PRPSINFO32_COPY_FIELDS (abfd, prpsinfo, data);
+
 	return elfcore_write_note (abfd, buf, bufsiz,
-				   "CORE", note_type, data, sizeof (data));
+				   "CORE", note_type, &data, sizeof (data));
       }
 
     case NT_PRSTATUS:
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index a188cec..4a14fc9 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -31,6 +31,10 @@
 #include "objalloc.h"
 #include "hashtab.h"
 #include "dwarf2.h"
+#include "elf-bfd.h"
+#include "elf-psinfo.h"
+
+#include <stdarg.h>
 
 /* 386 uses REL relocations instead of RELA.  */
 #define USE_REL	1
@@ -500,6 +504,43 @@ elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 
   return TRUE;
 }
+
+static char *
+elf_i386_write_core_note (bfd *abfd, char *buf, int *bufsiz,
+			  int note_type, ...)
+{
+  va_list ap;
+
+  switch (note_type)
+    {
+    default:
+      return NULL;
+
+    case NT_PRPSINFO:
+	{
+	  const struct elf_internal_prpsinfo *prpsinfo;
+	  struct elf_external_prpsinfo32 data;
+
+	  va_start (ap, note_type);
+	  prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
+	  va_end (ap);
+
+	  memset (&data, 0, sizeof (data));
+	  PRPSINFO32_COPY_FIELDS (abfd, prpsinfo, data);
+
+	  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+				     &data, sizeof (data));
+	}
+      /* NOTREACHED */
+
+    case NT_PRSTATUS:
+      /* FIXME: For now, to avoid the inclusion of the "CORE_HEADER", we
+	 return NULL and delegate this to elfcore_write_prstatus.  */
+      return NULL;
+    }
+  /* NOTREACHED */
+}
+
 
 /* Functions for the i386 ELF linker.
 
@@ -5140,6 +5181,7 @@ elf_i386_add_symbol_hook (bfd * abfd,
 #define elf_backend_gc_sweep_hook	      elf_i386_gc_sweep_hook
 #define elf_backend_grok_prstatus	      elf_i386_grok_prstatus
 #define elf_backend_grok_psinfo		      elf_i386_grok_psinfo
+#define elf_backend_write_core_note	      elf_i386_write_core_note
 #define elf_backend_reloc_type_class	      elf_i386_reloc_type_class
 #define elf_backend_relocate_section	      elf_i386_relocate_section
 #define elf_backend_size_dynamic_sections     elf_i386_size_dynamic_sections
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 5241926..199affa 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -37,6 +37,7 @@
 #include "elf32-ppc.h"
 #include "elf-vxworks.h"
 #include "dwarf2.h"
+#include "elf-psinfo.h"
 
 typedef enum split16_format_type
 {
@@ -2212,6 +2213,61 @@ ppc_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   return TRUE;
 }
 
+/* External 32-bit PPC structure for PRPSINFO.  This structure is ABI-defined,
+   thus we choose to use char arrays here in order to avoid dealing with
+   different types in different architectures.
+
+   The reason why we have a different structure only for PPC is because
+   on this architecture (and *only* here!) the size of 32-bit structure
+   changes.  This is due to the different sizes of `pr_uid' and `pr_gid',
+   which on non-PPC architectures are declared as `short int' and on PPC
+   architectures are declared as `int'.
+
+   This structure will ultimately be written in the corefile's note section,
+   as the PRPSINFO.  */
+
+struct elf_external_ppc_prpsinfo32
+  {
+    char pr_state;			/* Numeric process state.  */
+    char pr_sname;			/* Char for pr_state.  */
+    char pr_zomb;			/* Zombie.  */
+    char pr_nice;			/* Nice val.  */
+    char pr_flag[4];			/* Flags.  */
+    char pr_uid[4];
+    char pr_gid[4];
+    char pr_pid[4];
+    char pr_ppid[4];
+    char pr_pgrp[4];
+    char pr_sid[4];
+    /* Lots missing */
+    char pr_fname[16];			/* Filename of executable.  */
+    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
+  };
+
+/* Helper macro to copy (properly handling endianess) things from the
+   `elf_internal_prpsinfo' structure to the `elf_external_ppc_prpsinfo32'
+   structure.
+
+   Note that FROM should be a pointer, and TO should be the explicit type.  */
+
+#define PRPSINFO32_PPC_COPY_FIELDS(abfd, from, to) \
+  do \
+    { \
+      H_PUT_8 (abfd, from->pr_state, &to.pr_state); \
+      H_PUT_8 (abfd, from->pr_sname, &to.pr_sname); \
+      H_PUT_8 (abfd, from->pr_zomb, &to.pr_zomb); \
+      H_PUT_8 (abfd, from->pr_nice, &to.pr_nice); \
+      H_PUT_32 (abfd, from->pr_flag, to.pr_flag); \
+      H_PUT_32 (abfd, from->pr_uid, to.pr_uid); \
+      H_PUT_32 (abfd, from->pr_gid, to.pr_gid); \
+      H_PUT_32 (abfd, from->pr_pid, to.pr_pid); \
+      H_PUT_32 (abfd, from->pr_ppid, to.pr_ppid); \
+      H_PUT_32 (abfd, from->pr_pgrp, to.pr_pgrp); \
+      H_PUT_32 (abfd, from->pr_sid, to.pr_sid); \
+      strncpy (to.pr_fname, from->pr_fname, sizeof (to.pr_fname)); \
+      strncpy (to.pr_psargs, from->pr_psargs, sizeof (to.pr_psargs)); \
+    } while (0)
+
 static char *
 ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
 {
@@ -2222,16 +2278,19 @@ ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
 
     case NT_PRPSINFO:
       {
-	char data[128];
+	const struct elf_internal_prpsinfo *prpsinfo;
+	struct elf_external_ppc_prpsinfo32 data;
 	va_list ap;
 
 	va_start (ap, note_type);
-	memset (data, 0, sizeof (data));
-	strncpy (data + 32, va_arg (ap, const char *), 16);
-	strncpy (data + 48, va_arg (ap, const char *), 80);
+	prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
 	va_end (ap);
+
+	memset (&data, 0, sizeof (data));
+	PRPSINFO32_PPC_COPY_FIELDS (abfd, prpsinfo, data);
+
 	return elfcore_write_note (abfd, buf, bufsiz,
-				   "CORE", note_type, data, sizeof (data));
+				   "CORE", note_type, &data, sizeof (data));
       }
 
     case NT_PRSTATUS:
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 10b6f9d..4eda989 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -34,6 +34,7 @@
 #include "elf-bfd.h"
 #include "elf/ppc64.h"
 #include "elf64-ppc.h"
+#include "elf-psinfo.h"
 #include "dwarf2.h"
 
 static bfd_reloc_status_type ppc64_elf_ha_reloc
@@ -2718,16 +2719,19 @@ ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
 
     case NT_PRPSINFO:
       {
-	char data[136];
+	const struct elf_internal_prpsinfo *prpsinfo;
+	struct elf_external_prpsinfo64 data;
 	va_list ap;
 
 	va_start (ap, note_type);
-	memset (data, 0, sizeof (data));
-	strncpy (data + 40, va_arg (ap, const char *), 16);
-	strncpy (data + 56, va_arg (ap, const char *), 80);
+	prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
 	va_end (ap);
+
+	memset (&data, 0, sizeof (data));
+	PRPSINFO64_COPY_FIELDS (abfd, prpsinfo, data);
+
 	return elfcore_write_note (abfd, buf, bufsiz,
-				   "CORE", note_type, data, sizeof (data));
+				   "CORE", note_type, &data, sizeof (data));
       }
 
     case NT_PRSTATUS:
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 283681c..2c9939d 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -32,11 +32,13 @@
 #include "hashtab.h"
 #include "dwarf2.h"
 #include "libiberty.h"
+#include "elf-psinfo.h"
+
+#include <stdarg.h>
 
 #include "elf/x86-64.h"
 
 #ifdef CORE_HEADER
-#include <stdarg.h>
 #include CORE_HEADER
 #endif
 
@@ -415,14 +417,13 @@ elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   return TRUE;
 }
 
-#ifdef CORE_HEADER
 static char *
 elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
 			    int note_type, ...)
 {
   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   va_list ap;
-  const char *fname, *psargs;
+  const struct elf_internal_prpsinfo *prpsinfo;
   long pid;
   int cursig;
   const void *gregs;
@@ -434,27 +435,28 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
 
     case NT_PRPSINFO:
       va_start (ap, note_type);
-      fname = va_arg (ap, const char *);
-      psargs = va_arg (ap, const char *);
+      prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
       va_end (ap);
 
       if (bed->s->elfclass == ELFCLASS32)
 	{
-	  prpsinfo32_t data;
-	  memset (&data, 0, sizeof (data));
-	  strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
-	  strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+	  struct elf_external_prpsinfo32 data32;
+
+	  memset (&data32, 0, sizeof (data32));
+	  PRPSINFO32_COPY_FIELDS (abfd, prpsinfo, data32);
+
 	  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
-				     &data, sizeof (data));
+				     &data32, sizeof (data32));
 	}
       else
 	{
-	  prpsinfo64_t data;
-	  memset (&data, 0, sizeof (data));
-	  strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
-	  strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+	  struct elf_external_prpsinfo64 data64;
+
+	  memset (&data64, 0, sizeof (data64));
+	  PRPSINFO64_COPY_FIELDS (abfd, prpsinfo, data64);
+
 	  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
-				     &data, sizeof (data));
+				     &data64, sizeof (data64));
 	}
       /* NOTREACHED */
 
@@ -501,7 +503,7 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
     }
   /* NOTREACHED */
 }
-#endif
+
 
 /* Functions for the x86-64 ELF linker.	 */
 
@@ -5225,9 +5227,7 @@ static const struct bfd_elf_special_section
 #define elf_backend_gc_sweep_hook	    elf_x86_64_gc_sweep_hook
 #define elf_backend_grok_prstatus	    elf_x86_64_grok_prstatus
 #define elf_backend_grok_psinfo		    elf_x86_64_grok_psinfo
-#ifdef CORE_HEADER
 #define elf_backend_write_core_note	    elf_x86_64_write_core_note
-#endif
 #define elf_backend_reloc_type_class	    elf_x86_64_reloc_type_class
 #define elf_backend_relocate_section	    elf_x86_64_relocate_section
 #define elf_backend_size_dynamic_sections   elf_x86_64_size_dynamic_sections
diff --git a/bfd/hosts/x86-64linux.h b/bfd/hosts/x86-64linux.h
index 78be09a..6070978 100644
--- a/bfd/hosts/x86-64linux.h
+++ b/bfd/hosts/x86-64linux.h
@@ -43,11 +43,6 @@ typedef unsigned long long int uint64_t;
 /* Unsigned 64-bit integer aligned to 8 bytes.  */
 typedef uint64_t __attribute__ ((__aligned__ (8))) a8_uint64_t;
 
-#undef HAVE_PRPSINFO32_T
-#define HAVE_PRPSINFO32_T
-#undef HAVE_PRPSINFO32_T_PR_PID
-#define HAVE_PRPSINFO32_T_PR_PID
-
 #undef HAVE_PRSTATUS32_T
 #define HAVE_PRSTATUS32_T
 
@@ -191,36 +186,6 @@ struct elf_prstatus64
     int pr_fpvalid;			/* True if math copro being used.  */
   };
 
-struct elf_prpsinfo32
-  {
-    char pr_state;			/* Numeric process state.  */
-    char pr_sname;			/* Char for pr_state.  */
-    char pr_zomb;			/* Zombie.  */
-    char pr_nice;			/* Nice val.  */
-    unsigned int pr_flag;		/* Flags.  */
-    unsigned short int pr_uid;
-    unsigned short int pr_gid;
-    int pr_pid, pr_ppid, pr_pgrp, pr_sid;
-    /* Lots missing */
-    char pr_fname[16];			/* Filename of executable.  */
-    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
-  };
-
-struct elf_prpsinfo64
-  {
-    char pr_state;			/* Numeric process state.  */
-    char pr_sname;			/* Char for pr_state.  */
-    char pr_zomb;			/* Zombie.  */
-    char pr_nice;			/* Nice val.  */
-    a8_uint64_t pr_flag;		/* Flags.  */
-    unsigned int pr_uid;
-    unsigned int pr_gid;
-    int pr_pid, pr_ppid, pr_pgrp, pr_sid;
-    /* Lots missing */
-    char pr_fname[16];			/* Filename of executable.  */
-    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
-  };
-
 /* The rest of this file provides the types for emulation of the
    Solaris <proc_service.h> interfaces that should be implemented by
    users of libthread_db.  */
@@ -229,5 +194,3 @@ struct elf_prpsinfo64
 typedef struct elf_prstatus32 prstatus32_t;
 typedef struct elf_prstatusx32 prstatusx32_t;
 typedef struct elf_prstatus64 prstatus64_t;
-typedef struct elf_prpsinfo32 prpsinfo32_t;
-typedef struct elf_prpsinfo64 prpsinfo64_t;
-- 
1.7.7.6


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]