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


Hi Sergio,

thanks for the updated, I have just seen some more minor issues:


On Sun, 30 Dec 2012 02:49:36 +0100, Sergio Durigan Junior wrote:
> --- 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..90ced7a 100644
> --- a/bfd/elf-bfd.h
> +++ b/bfd/elf-bfd.h
> @@ -1722,6 +1722,38 @@ 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])
> +
> +#ifndef ELF_PRARGSZ
> +/* Maximum size of the arguments that can be stored in a PRPSINFO
> +   structure.  */
> +
> +#define ELF_PRARGSZ (80)
> +#endif

This should be unrelated to the system definition, BFD now defines everything
about PRPSINFO on its own and different system definiton of it can just break
it.  Host system may be some exotic kind with no core files support by BFD.


> +
> +/* 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 */

This comment seems off-topic here.  It fully represents the core file
structure.


> +    char pr_fname[16];			/* Filename of executable.  */
> +    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */

As this is only internal representation the sizes can be +1 including the
terminating '\0' for a more convenient use by the callers.


> +  };
> +
>  
>  extern void _bfd_elf_swap_verdef_in
>    (bfd *, const Elf_External_Verdef *, Elf_Internal_Verdef *);
> @@ -2234,11 +2266,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..ddf3aa1
> --- /dev/null
> +++ b/bfd/elf-psinfo.h
> @@ -0,0 +1,133 @@
> +/* Declarations for PRPSINFO structures under ELF on GNU/Linux.

s/Declarations/Definitions/


> +   Copyright 2012 Free Software Foundation, Inc.

2013 now. :-)


> +
> +   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.  */
> +
> +#ifndef ELF_PRARGSZ
> +/* Maximum size of the arguments that can be stored in a PRPSINFO
> +   structure.  */
> +
> +#define ELF_PRARGSZ (80)
> +#endif

The same comment as above.


> +
> +/* 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 */

Also unrelated comment I think.  It is in Linux kernel where this IMO means
that the core file could contain more info.  But it can no longer be changed
so I find the comment irrelevant now.


> +    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;

There was some comment that *_t types are reserved for system (POSIX?) use.
So when BFD now now longer uses the system ones and fully defines them on its
own they should have some different namespace, not *_t.



> diff --git a/bfd/elf.c b/bfd/elf.c
> index 17e9ad4..aad8b27 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
> @@ -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;
>      }
> @@ -9090,8 +9091,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));
>      }
> @@ -9102,13 +9103,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 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..0198eef 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;

I do not think this 'case NT_PRSTATUS:' needs to be here at all, it is also in
fact unrelated to this patchset, but that is again just a matter of style,
-> bfd maintainers.


> +    }
> +  /* NOTREACHED */
> +}
> +
>  
>  /* Functions for the i386 ELF linker.
>  
> @@ -5042,6 +5083,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..b239e5c 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 */

Likewise.


> +    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)
> +
>  
>  /* 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..c9bcf48 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

I think the NT_PRSTATUS part still needs to have #ifdef CORE_HEADER (and using
the NULL return fallback if CORE_HEADER is not available).


>  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.	 */
>  
> @@ -5157,9 +5159,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


Thanks,
Jan


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