Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Sergio Durigan Junior <sergiodj@redhat.com>
To: Jan Kratochvil <jan.kratochvil@redhat.com>
Cc: Binutils Development <binutils@sourceware.org>,
	       GDB Patches <gdb-patches@sourceware.org>,
	       Pedro Alves <palves@redhat.com>,
	"H.J. Lu" <hjl.tools@gmail.com>
Subject: Re: [PATCH/RFC 01/02 v2] Refactor PRPSINFO handling on Binutils
Date: Wed, 09 Jan 2013 20:49:00 -0000	[thread overview]
Message-ID: <m3fw2a13q5.fsf@redhat.com> (raw)
In-Reply-To: <m3a9sp7e93.fsf@redhat.com> (Sergio Durigan Junior's message of	"Fri, 04 Jan 2013 02:39:52 -0200")

On Friday, January 04 2013, I wrote:

> On Thursday, January 03 2013, I wrote:
>
>> Ops, sorry, I thought you were talking about the comment above the
>> structure, and not about the "Lots missing".  Then I agree, it can be
>> removed.  Sorry about the confusion.  I will send an updated patch in a
>> few moments.
>
> Here it is.  Thanks for the comments.

Ping.

I can send an updated version if needed.

Thanks,

> 2013-01-04  Sergio Durigan Junior  <sergiodj@redhat.com>
>
> 	* Makefile.in (BUILD_CFILES): Add `elf-psinfo.h'.
> 	* elf-bfd.h (ELF_PRARGSZ): New conditional definition.
> 	(elf_internal_prpsinfo): New structure declaration.
> 	(elfcore_write_prpsinfo): Change prototype, accepting
> 	`elf_internal_prpsinfo' as argument.
> 	* elf-psinfo.h: New file.
> 	* elf.c	(elfcore_write_prpsinfo): Change prototype, accepting
> 	`elf_internal_prpsinfo' as argument.  Rewrite parts of the code to
> 	make use of the new argument.
> 	* elf32-arm.c: Include `elf-psinfo.h'.
> 	(elf32_arm_nabi_write_core_note): Refactor `NT_PRPSINFO' case.
> 	* elf32-i386.c: Include `elf-bfd.h', `elf-psinfo.h' and `stdarg.h'.
> 	(elf_i386_write_core_note): New function.
> 	* elf32-ppc.c: Include `elf-psinfo.h'.
> 	(elf_external_ppc_prpsinfo32): New structure declaration.
> 	(ppc_elf_write_core_note): Refactor `NT_PRPSINFO' case.
> 	* elf64-ppc.c: Include `elf-psinfo.h'.
> 	(ppc64_elf_write_core_note): Refactor `NT_PRPSINFO' case.
> 	* elf64-x86-64.c: Include `elf-psinfo.h'.  Include `stdarg.h'
> 	unconditionally.
> 	(elf_x86_64_write_core_note): Remove `#ifdef CORE_HEADER', making the
> 	function unconditionally available.  Refactor `NT_PRPSINFO' case.
> 	Refactor `NT_PRSTATUS' case, making it conditional to `CORE_HEADER'.
> 	* hosts/x86-64linux.h (HAVE_PRPSINFO32_T, HAVE_PRPSINFO32_T_PR_PID,
> 	elf_prpsinfo32, elf_prpsinfo64, prpsinfo32_t, prpsinfo64_t): Remove
> 	definitions, moving some of them to `elf-psinfo.h'.
>
> ---
>  bfd/Makefile.in         |    2 +-
>  bfd/elf-bfd.h           |   26 +++++++++-
>  bfd/elf-psinfo.h        |  124 +++++++++++++++++++++++++++++++++++++++++++++++
>  bfd/elf.c               |   21 ++++----
>  bfd/elf32-arm.c         |   13 +++--
>  bfd/elf32-i386.c        |   37 ++++++++++++++
>  bfd/elf32-ppc.c         |   70 ++++++++++++++++++++++++--
>  bfd/elf64-ppc.c         |   14 +++--
>  bfd/elf64-x86-64.c      |   40 ++++++++-------
>  bfd/hosts/x86-64linux.h |   37 --------------
>  10 files changed, 302 insertions(+), 82 deletions(-)
>  create mode 100644 bfd/elf-psinfo.h
>
> diff --git a/bfd/Makefile.in b/bfd/Makefile.in
> index c51c342..adea836 100644
> --- a/bfd/Makefile.in
> +++ b/bfd/Makefile.in
> @@ -1068,7 +1068,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..1572cba 100644
> --- a/bfd/elf-bfd.h
> +++ b/bfd/elf-bfd.h
> @@ -1722,6 +1722,30 @@ struct elf_obj_tdata
>    (elf_known_obj_attributes (bfd) [OBJ_ATTR_PROC])
>  #define elf_other_obj_attributes_proc(bfd) \
>    (elf_other_obj_attributes (bfd) [OBJ_ATTR_PROC])
> +
> +/* 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;
> +    char pr_fname[16 + 1];		/* Filename of executable.  */
> +    char pr_psargs[80 + 1];		/* Initial part of arg list.  */
> +  };
> +
>  \f
>  extern void _bfd_elf_swap_verdef_in
>    (bfd *, const Elf_External_Verdef *, Elf_Internal_Verdef *);
> @@ -2238,7 +2262,7 @@ extern Elf_Internal_Phdr * _bfd_elf_find_segment_containing_section
>  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..6689a58
> --- /dev/null
> +++ b/bfd/elf-psinfo.h
> @@ -0,0 +1,124 @@
> +/* Definitions for PRPSINFO structures under ELF on GNU/Linux.
> +   Copyright 2013 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.  */
> +
> +/* 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];
> +    char pr_fname[16];			/* Filename of executable.  */
> +    char pr_psargs[80];			/* 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];
> +    char pr_fname[16];			/* Filename of executable.  */
> +    char pr_psargs[80];			/* 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;
> +typedef struct elf_external_prpsinfo64 prpsinfo64;
> diff --git a/bfd/elf.c b/bfd/elf.c
> index 17e9ad4..c4f04ea 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
> @@ -8165,7 +8166,7 @@ elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *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;
> +typedef prpsinfo32 elfcore_psinfo32_t;
>  #endif
>  #endif
>  
> @@ -9063,16 +9064,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;
>      }
> @@ -9085,13 +9086,13 @@ elfcore_write_prpsinfo (bfd  *abfd,
>        psinfo32_t data;
>        int note_type = NT_PSINFO;
>  #else
> -      prpsinfo32_t data;
> +      prpsinfo32 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));
>      }
> @@ -9102,13 +9103,13 @@ elfcore_write_prpsinfo (bfd  *abfd,
>        psinfo_t data;
>        int note_type = NT_PSINFO;
>  #else
> -      prpsinfo_t data;
> +      prpsinfo64 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 e2f8a96..a354602 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 f76c7a7..45a1e26 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,38 @@ 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 */
> +    }
> +  /* NOTREACHED */
> +}
> +
>  \f
>  /* Functions for the i386 ELF linker.
>  
> @@ -5042,6 +5078,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..02d494f 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
>  {
> @@ -1777,6 +1778,62 @@ static reloc_howto_type ppc_elf_howto_raw[] = {
>  	 0xffff,		/* dst_mask */
>  	 FALSE),		/* pcrel_offset */
>  };
> +
> +/* 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[80];			/* 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)
> +
>  \f
>  /* Initialize the ppc_elf_howto_table, so that linear accesses can be done.  */
>  
> @@ -2222,16 +2279,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 92bf991..40ce80f 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,31 +435,33 @@ 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 */
>  
>      case NT_PRSTATUS:
> +#ifdef CORE_HEADER
>        va_start (ap, note_type);
>        pid = va_arg (ap, long);
>        cursig = va_arg (ap, int);
> @@ -498,10 +501,13 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
>  	  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
>  				     &prstat, sizeof (prstat));
>  	}
> +#else
> +      return NULL;
> +#endif /* CORE_HEADER */
>      }
>    /* NOTREACHED */
>  }
> -#endif
> +
>  \f
>  /* Functions for the x86-64 ELF linker.	 */
>  
> @@ -5157,9 +5163,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

-- 
Sergio


  reply	other threads:[~2013-01-09 20:49 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-17  3:10 Sergio Durigan Junior
2012-12-17 15:43 ` H.J. Lu
2012-12-17 17:41   ` Sergio Durigan Junior
2012-12-17 17:44     ` H.J. Lu
2012-12-17 17:51       ` Sergio Durigan Junior
2012-12-17 22:01         ` H.J. Lu
2012-12-18  5:47           ` Sergio Durigan Junior
2012-12-18 15:43             ` H.J. Lu
2012-12-18 17:38 ` Jan Kratochvil
2012-12-18 19:19   ` Sergio Durigan Junior
2012-12-18 19:43     ` Jan Kratochvil
2012-12-30  1:49       ` Sergio Durigan Junior
2013-01-01 14:30         ` Jan Kratochvil
2013-01-02 23:32           ` Sergio Durigan Junior
2013-01-03 13:44             ` Jan Kratochvil
2013-01-03 15:46               ` Sergio Durigan Junior
2013-01-04  4:40                 ` Sergio Durigan Junior
2013-01-09 20:49                   ` Sergio Durigan Junior [this message]
2013-01-10 18:26                   ` Pedro Alves
2013-01-10 19:47                     ` Sergio Durigan Junior
2013-01-11 15:45                       ` Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m3fw2a13q5.fsf@redhat.com \
    --to=sergiodj@redhat.com \
    --cc=binutils@sourceware.org \
    --cc=gdb-patches@sourceware.org \
    --cc=hjl.tools@gmail.com \
    --cc=jan.kratochvil@redhat.com \
    --cc=palves@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox