From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12839 invoked by alias); 9 Jan 2013 20:49:56 -0000 Received: (qmail 12819 invoked by uid 22791); 9 Jan 2013 20:49:53 -0000 X-SWARE-Spam-Status: No, hits=-3.5 required=5.0 tests=AWL,BAYES_00,KAM_STOCKTIP,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,SPF_HELO_PASS,TW_CP X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 09 Jan 2013 20:49:44 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r09KnhrG014335 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 9 Jan 2013 15:49:43 -0500 Received: from psique (ovpn-113-189.phx2.redhat.com [10.3.113.189]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r09Knd6m023654; Wed, 9 Jan 2013 15:49:40 -0500 From: Sergio Durigan Junior To: Jan Kratochvil Cc: Binutils Development , GDB Patches , Pedro Alves , "H.J. Lu" Subject: Re: [PATCH/RFC 01/02 v2] Refactor PRPSINFO handling on Binutils References: <20121218173747.GA24546@host2.jankratochvil.net> <20121218193104.GA29194@host2.jankratochvil.net> <20130101143027.GA17408@host2.jankratochvil.net> <20130103134431.GA4099@host2.jankratochvil.net> X-URL: http://www.redhat.com Date: Wed, 09 Jan 2013 20:49:00 -0000 In-Reply-To: (Sergio Durigan Junior's message of "Fri, 04 Jan 2013 02:39:52 -0200") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2013-01/txt/msg00189.txt.bz2 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 > > * 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 > > /* 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 > > #include "elf/x86-64.h" > > #ifdef CORE_HEADER > -#include > #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 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