This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH/RFC 01/02 v2] Refactor PRPSINFO handling on Binutils
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. */
> + };
> +
>
> 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 */
> +}
> +
>
> /* 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)
> +
>
> /* 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
> +
>
> /* 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