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
- From: Sergio Durigan Junior <sergiodj at redhat dot com>
- To: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- Cc: Binutils Development <binutils at sourceware dot org>, GDB Patches <gdb-patches at sourceware dot org>, Pedro Alves <palves at redhat dot com>, "H.J. Lu" <hjl dot tools at gmail dot com>
- Date: Tue, 18 Dec 2012 17:19:06 -0200
- Subject: Re: [PATCH/RFC 01/02 v2] Refactor PRPSINFO handling on Binutils
- References: <m3k3shv0g5.fsf@redhat.com> <20121218173747.GA24546@host2.jankratochvil.net>
Thanks for the review.
On Tuesday, December 18 2012, Jan Kratochvil wrote:
>> diff --git a/bfd/Makefile.in b/bfd/Makefile.in
>> index 92d9d08..e12deb5 100644
>> --- a/bfd/Makefile.in
>> +++ b/bfd/Makefile.in
>> @@ -1050,7 +1050,7 @@ BUILD_CFILES = \
>> CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
>> SOURCE_HFILES = \
>> aout-target.h aoutf1.h aoutx.h coffcode.h coffswap.h ecoffswap.h \
>> - elf-bfd.h elf-hppa.h elf32-hppa.h \
>> + elf-bfd.h elf-psinfo.h elf-hppa.h elf32-hppa.h \
>> elf64-hppa.h elfcode.h elfcore.h \
>> freebsd.h genlink.h go32stub.h \
>> libaout.h libbfd.h libcoff.h libecoff.h libhppa.h libieee.h \
>> diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
>> index b8d82b1..d314291 100644
>> --- a/bfd/elf-bfd.h
>> +++ b/bfd/elf-bfd.h
>> @@ -2234,11 +2234,15 @@ extern bfd_boolean bfd_elf_lookup_section_flags
>> extern Elf_Internal_Phdr * _bfd_elf_find_segment_containing_section
>> (bfd * abfd, asection * section);
>>
>> +/* Forward declaration of prpsinfo. See `elf-psinfo.h' for more details. */
>> +
>> +struct elf_internal_prpsinfo;
>> +
>> /* Exported interface for writing elf corefile notes. */
>> extern char *elfcore_write_note
>> (bfd *, char *, int *, const char *, int, const void *, int);
>> extern char *elfcore_write_prpsinfo
>> - (bfd *, char *, int *, const char *, const char *);
>> + (bfd *, char *, int *, const struct elf_internal_prpsinfo *);
>> extern char *elfcore_write_prstatus
>> (bfd *, char *, int *, long, int, const void *);
>> extern char * elfcore_write_pstatus
>> diff --git a/bfd/elf-psinfo.h b/bfd/elf-psinfo.h
>> new file mode 100644
>> index 0000000..61b38e1
>> --- /dev/null
>> +++ b/bfd/elf-psinfo.h
>> @@ -0,0 +1,215 @@
>> +/* Declarations for PRPSINFO structures under ELF on GNU/Linux.
>> + Copyright 2012 Free Software Foundation, Inc.
>> +
>> + This file is part of BFD, the Binary File Descriptor library.
>> +
>> + This program is free software; you can redistribute it and/or modify
>> + it under the terms of the GNU General Public License as published by
>> + the Free Software Foundation; either version 3 of the License, or
>> + (at your option) any later version.
>> +
>> + This program is distributed in the hope that it will be useful,
>> + but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + GNU General Public License for more details.
>> +
>> + You should have received a copy of the GNU General Public License
>> + along with this program; if not, write to the Free Software
>> + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
>> + MA 02110-1301, USA. */
>> +
>> +#undef HAVE_PRPSINFO32_T
>> +#define HAVE_PRPSINFO32_T
>> +#undef HAVE_PRPSINFO32_T_PR_PID
>> +#define HAVE_PRPSINFO32_T_PR_PID
>
> This does not seem to be useful, these are auto-detected by configure and
> elf-psinfo.h is included unconditionally. Therefore they could be completely
> removed.
Indeed, I removed the last referecen to those defines a few minutes
before sending the patch. I agree.
> But in reality they should not be removed as your elf-core definitions do not
> cover very every target supported by bfd, only some of them.
The patch covers the existing targets that already implemented the
*_write_core_note function, with the exception of i386 which is a new
implementation. So I still agree with your comment above, that the
defines can be removed.
>> +/* Maximum size of the arguments that can be stored in a PRPSINFO
>> + structure. */
>> +
>> +#define ELF_PRARGSZ (80)
>> +
>> +/* Internal structure which holds information to be included in the
>> + PRPSINFO section of the corefile.
>> +
>> + This is an "internal" structure in the sense that it should be used to
>> + pass information to BFD (via the `elfcore_write_prpsinfo', for example),
>> + so things like endianess shouldn't be an issue. This structure will
>> + eventually be converted in one of the `elf_external_*' structures
>> + below. */
>> +
>> +struct elf_internal_prpsinfo
>> + {
>> + char pr_state; /* Numeric process state. */
>> + char pr_sname; /* Char for pr_state. */
>> + char pr_zomb; /* Zombie. */
>> + char pr_nice; /* Nice val. */
>> + unsigned long pr_flag; /* Flags. */
>> + unsigned int pr_uid;
>> + unsigned int pr_gid;
>> + int pr_pid, pr_ppid, pr_pgrp, pr_sid;
>> + /* Lots missing */
>> + char pr_fname[16]; /* Filename of executable. */
>> + char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
>> + };
>> +
>> +/* External 32-bit structure for PRPSINFO. This structure is ABI-defined,
>> + thus we choose to use char arrays here in order to avoid dealing with
>> + different types in different architectures.
>> +
>> + This structure will ultimately be written in the corefile's note section,
>> + as the PRPSINFO. */
>> +
>> +struct elf_external_prpsinfo32
>> + {
>> + char pr_state; /* Numeric process state. */
>> + char pr_sname; /* Char for pr_state. */
>> + char pr_zomb; /* Zombie. */
>> + char pr_nice; /* Nice val. */
>> + char pr_flag[4]; /* Flags. */
>> + char pr_uid[2];
>> + char pr_gid[2];
>> + char pr_pid[4];
>> + char pr_ppid[4];
>> + char pr_pgrp[4];
>> + char pr_sid[4];
>> + /* Lots missing */
>> + char pr_fname[16]; /* Filename of executable. */
>> + char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
>> + };
>
> As it does not match very every arch I believe you should just copy it into
> elf*-*.c files containing the *_elf_write_core_note function for archs where
> you have verified (by comparing some headers, not just by experiment) it does
> match.
I disagree. As I said above, the patch covers all targets that were
already implementing *_write_core_note. If some new target decides to
implement it, it is just a matter of including "elf-psinfo.h" and using
the right structures.
>> +
>> +/* External 32-bit PPC structure for PRPSINFO.
>
> If it is arch-specific then it should not be in a generic file.
>
> I believe elf32-ppc.c and elf64-ppc.c files are fine for it.
Ok, I am fine with that. I made this decision based on a quick chat
that I had with Pedro, asking him if it would be OK to create an
arch-specific structure for the case of 32-bit PPC.
I will move this definition to elf32-ppc.c, which is the only place that
uses this.
> In the end I do not see a use for this header file.
As I said above, I disagree. The header file is useful for having a
single place which defines those structures (i.e., i386, x32 and ARM use
the same elf_external_prpsinfo32 strucutre). Also, the header is useful
for including in the BFD clients (I'm thiking "GDB" here) which can use
the elf_internal_prpsinfo strucuture to pass information to BFD.
However, I agree with you that the arch-specific external structures
(like the PPC above) can be declared in their .c files.
>> diff --git a/bfd/elf.c b/bfd/elf.c
>> index a92dd5d..a39b88c 100644
>> --- a/bfd/elf.c
>> +++ b/bfd/elf.c
>> @@ -44,6 +44,7 @@ SECTION
>> #include "elf-bfd.h"
>> #include "libiberty.h"
>> #include "safe-ctype.h"
>> +#include "elf-psinfo.h"
>>
>> #ifdef CORE_HEADER
>> #include CORE_HEADER
>> @@ -8161,13 +8162,6 @@ elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
>> return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
>> }
>>
>> -#if defined (HAVE_PRPSINFO_T)
>> -typedef prpsinfo_t elfcore_psinfo_t;
>> -#if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
>> -typedef prpsinfo32_t elfcore_psinfo32_t;
>> -#endif
>> -#endif
>> -
>
> This is arch-independent file (elf.c). Some targets are unverified they match
> your new ABI elfcore definition. As they may provide correct system
> prpsinfo_t defintion you should use it there, if available.
Ok, I will revert this change.
>> #if defined (HAVE_PSINFO_T)
>> typedef psinfo_t elfcore_psinfo_t;
>> #if defined (HAVE_PSINFO32_T) /* Sparc64 cross Sparc32 */
>> @@ -8201,17 +8195,17 @@ _bfd_elfcore_strndup (bfd *abfd, char *start, size_t max)
>> return dups;
>> }
>>
>> -#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
>
> All these changes are like the comment above.
I will revert this.
>> diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
>> index fd7d26a..cacc895 100644
>> --- a/bfd/elf32-arm.c
>> +++ b/bfd/elf32-arm.c
>> @@ -30,6 +30,7 @@
>> #include "elf-nacl.h"
>> #include "elf-vxworks.h"
>> #include "elf/arm.h"
>> +#include "elf-psinfo.h"
>>
>> /* Return the relocation section associated with NAME. HTAB is the
>> bfd's elf32_arm_link_hash_entry. */
>> @@ -2004,17 +2005,19 @@ elf32_arm_nabi_write_core_note (bfd *abfd, char *buf, int *bufsiz,
>>
>> case NT_PRPSINFO:
>> {
>> - char data[124];
>> + const struct elf_internal_prpsinfo *prpsinfo;
>> + struct elf_external_prpsinfo32 data;
>> va_list ap;
>>
>> va_start (ap, note_type);
>> - memset (data, 0, sizeof (data));
>> - strncpy (data + 28, va_arg (ap, const char *), 16);
>> - strncpy (data + 44, va_arg (ap, const char *), 80);
>> + prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
>> va_end (ap);
>>
>> + memset (&data, 0, sizeof (data));
>> + PRPSINFO32_COPY_FIELDS (abfd, prpsinfo, data);
>> +
>> return elfcore_write_note (abfd, buf, bufsiz,
>> - "CORE", note_type, data, sizeof (data));
>> + "CORE", note_type, &data, sizeof (data));
>> }
>>
>> case NT_PRSTATUS:
>> diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
>> index a188cec..5b81baa 100644
>> --- a/bfd/elf32-i386.c
>> +++ b/bfd/elf32-i386.c
>> @@ -31,12 +31,20 @@
>> #include "objalloc.h"
>> #include "hashtab.h"
>> #include "dwarf2.h"
>> +#include "elf-bfd.h"
>> +#include "elf-psinfo.h"
>> +
>> +#include <stdarg.h>
>>
>> /* 386 uses REL relocations instead of RELA. */
>> #define USE_REL 1
>>
>> #include "elf/i386.h"
>>
>> +#ifdef CORE_HEADER
>> +#include CORE_HEADER
>> +#endif
>
> I believe new CORE_HEADER should not be introduced, they are rather deprecated
> as they depend on system <procfs.h> which is not compatible for cross-build
> core handling. (But I may be completely wrong here.)
Yeah, this is a point of confusion for me as well. I will remove this
part, and resubmit the patch. Let's wait until someone more experienced
comments. BTW, in order to be able to remove this, I had to "return
NULL" when handling the "NT_PRSTATUS" case inside the
elf_i386_write_core_note.
Ok, here is the new version of the patch, with some of your comments
addressed. I didn't make some changes suggested above because of my
disagreement, but we can keep discussing.
Thanks,
--
Sergio
---
bfd/Makefile.in | 2 +-
bfd/elf-bfd.h | 6 ++-
bfd/elf-psinfo.h | 155 +++++++++++++++++++++++++++++++++++++++++++++++
bfd/elf.c | 17 +++---
bfd/elf32-arm.c | 13 +++--
bfd/elf32-i386.c | 42 +++++++++++++
bfd/elf32-ppc.c | 69 +++++++++++++++++++--
bfd/elf64-ppc.c | 14 +++--
bfd/elf64-x86-64.c | 36 ++++++------
bfd/hosts/x86-64linux.h | 37 -----------
10 files changed, 311 insertions(+), 80 deletions(-)
create mode 100644 bfd/elf-psinfo.h
diff --git a/bfd/Makefile.in b/bfd/Makefile.in
index 92d9d08..e12deb5 100644
--- a/bfd/Makefile.in
+++ b/bfd/Makefile.in
@@ -1050,7 +1050,7 @@ BUILD_CFILES = \
CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
SOURCE_HFILES = \
aout-target.h aoutf1.h aoutx.h coffcode.h coffswap.h ecoffswap.h \
- elf-bfd.h elf-hppa.h elf32-hppa.h \
+ elf-bfd.h elf-psinfo.h elf-hppa.h elf32-hppa.h \
elf64-hppa.h elfcode.h elfcore.h \
freebsd.h genlink.h go32stub.h \
libaout.h libbfd.h libcoff.h libecoff.h libhppa.h libieee.h \
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index b8d82b1..d314291 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2234,11 +2234,15 @@ extern bfd_boolean bfd_elf_lookup_section_flags
extern Elf_Internal_Phdr * _bfd_elf_find_segment_containing_section
(bfd * abfd, asection * section);
+/* Forward declaration of prpsinfo. See `elf-psinfo.h' for more details. */
+
+struct elf_internal_prpsinfo;
+
/* Exported interface for writing elf corefile notes. */
extern char *elfcore_write_note
(bfd *, char *, int *, const char *, int, const void *, int);
extern char *elfcore_write_prpsinfo
- (bfd *, char *, int *, const char *, const char *);
+ (bfd *, char *, int *, const struct elf_internal_prpsinfo *);
extern char *elfcore_write_prstatus
(bfd *, char *, int *, long, int, const void *);
extern char * elfcore_write_pstatus
diff --git a/bfd/elf-psinfo.h b/bfd/elf-psinfo.h
new file mode 100644
index 0000000..b2d6092
--- /dev/null
+++ b/bfd/elf-psinfo.h
@@ -0,0 +1,155 @@
+/* Declarations for PRPSINFO structures under ELF on GNU/Linux.
+ Copyright 2012 Free Software Foundation, Inc.
+
+ This file is part of BFD, the Binary File Descriptor library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
+
+/* Maximum size of the arguments that can be stored in a PRPSINFO
+ structure. */
+
+#define ELF_PRARGSZ (80)
+
+/* Internal structure which holds information to be included in the
+ PRPSINFO section of the corefile.
+
+ This is an "internal" structure in the sense that it should be used to
+ pass information to BFD (via the `elfcore_write_prpsinfo', for example),
+ so things like endianess shouldn't be an issue. This structure will
+ eventually be converted in one of the `elf_external_*' structures
+ below. */
+
+struct elf_internal_prpsinfo
+ {
+ char pr_state; /* Numeric process state. */
+ char pr_sname; /* Char for pr_state. */
+ char pr_zomb; /* Zombie. */
+ char pr_nice; /* Nice val. */
+ unsigned long pr_flag; /* Flags. */
+ unsigned int pr_uid;
+ unsigned int pr_gid;
+ int pr_pid, pr_ppid, pr_pgrp, pr_sid;
+ /* Lots missing */
+ char pr_fname[16]; /* Filename of executable. */
+ char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
+ };
+
+/* External 32-bit structure for PRPSINFO. This structure is ABI-defined,
+ thus we choose to use char arrays here in order to avoid dealing with
+ different types in different architectures.
+
+ This structure will ultimately be written in the corefile's note section,
+ as the PRPSINFO. */
+
+struct elf_external_prpsinfo32
+ {
+ char pr_state; /* Numeric process state. */
+ char pr_sname; /* Char for pr_state. */
+ char pr_zomb; /* Zombie. */
+ char pr_nice; /* Nice val. */
+ char pr_flag[4]; /* Flags. */
+ char pr_uid[2];
+ char pr_gid[2];
+ char pr_pid[4];
+ char pr_ppid[4];
+ char pr_pgrp[4];
+ char pr_sid[4];
+ /* Lots missing */
+ char pr_fname[16]; /* Filename of executable. */
+ char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
+ };
+
+/* Helper macro to copy (properly handling endianess) things from the
+ `elf_internal_prpsinfo' structure to the `elf_external_prpsinfo32'
+ structure.
+
+ Note that FROM should be a pointer, and TO should be the explicit type. */
+
+#define PRPSINFO32_COPY_FIELDS(abfd, from, to) \
+ do \
+ { \
+ H_PUT_8 (abfd, from->pr_state, &to.pr_state); \
+ H_PUT_8 (abfd, from->pr_sname, &to.pr_sname); \
+ H_PUT_8 (abfd, from->pr_zomb, &to.pr_zomb); \
+ H_PUT_8 (abfd, from->pr_nice, &to.pr_nice); \
+ H_PUT_32 (abfd, from->pr_flag, to.pr_flag); \
+ H_PUT_16 (abfd, from->pr_uid, to.pr_uid); \
+ H_PUT_16 (abfd, from->pr_gid, to.pr_gid); \
+ H_PUT_32 (abfd, from->pr_pid, to.pr_pid); \
+ H_PUT_32 (abfd, from->pr_ppid, to.pr_ppid); \
+ H_PUT_32 (abfd, from->pr_pgrp, to.pr_pgrp); \
+ H_PUT_32 (abfd, from->pr_sid, to.pr_sid); \
+ strncpy (to.pr_fname, from->pr_fname, sizeof (to.pr_fname)); \
+ strncpy (to.pr_psargs, from->pr_psargs, sizeof (to.pr_psargs)); \
+ } while (0)
+
+/* External 64-bit structure for PRPSINFO. This structure is ABI-defined,
+ thus we choose to use char arrays here in order to avoid dealing with
+ different types in different architectures.
+
+ Differently from the 32-bit version, the PowerPC guys made our lives better
+ and used the same size as the other architectures.
+
+ This structure will ultimately be written in the corefile's note section,
+ as the PRPSINFO. */
+
+struct elf_external_prpsinfo64
+ {
+ char pr_state; /* Numeric process state. */
+ char pr_sname; /* Char for pr_state. */
+ char pr_zomb; /* Zombie. */
+ char pr_nice; /* Nice val. */
+ char pr_flag[8]; /* Flags. */
+ char gap[4];
+ char pr_uid[4];
+ char pr_gid[4];
+ char pr_pid[4];
+ char pr_ppid[4];
+ char pr_pgrp[4];
+ char pr_sid[4];
+ /* Lots missing */
+ char pr_fname[16]; /* Filename of executable. */
+ char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
+ };
+
+/* Helper macro to copy (properly handling endianess) things from the
+ `elf_internal_prpsinfo' structure to the `elf_external_prpsinfo64'
+ structure.
+
+ Note that FROM should be a pointer, and TO should be the explicit type. */
+
+#define PRPSINFO64_COPY_FIELDS(abfd, from, to) \
+ do \
+ { \
+ H_PUT_8 (abfd, from->pr_state, &to.pr_state); \
+ H_PUT_8 (abfd, from->pr_sname, &to.pr_sname); \
+ H_PUT_8 (abfd, from->pr_zomb, &to.pr_zomb); \
+ H_PUT_8 (abfd, from->pr_nice, &to.pr_nice); \
+ H_PUT_64 (abfd, from->pr_flag, to.pr_flag); \
+ H_PUT_32 (abfd, from->pr_uid, to.pr_uid); \
+ H_PUT_32 (abfd, from->pr_gid, to.pr_gid); \
+ H_PUT_32 (abfd, from->pr_pid, to.pr_pid); \
+ H_PUT_32 (abfd, from->pr_ppid, to.pr_ppid); \
+ H_PUT_32 (abfd, from->pr_pgrp, to.pr_pgrp); \
+ H_PUT_32 (abfd, from->pr_sid, to.pr_sid); \
+ strncpy (to.pr_fname, from->pr_fname, sizeof (to.pr_fname)); \
+ strncpy (to.pr_psargs, from->pr_psargs, sizeof (to.pr_psargs)); \
+ } while (0)
+
+/* Process info. In the end we do provide typedefs for them. */
+
+typedef struct elf_external_prpsinfo32 prpsinfo32_t;
+typedef struct elf_external_prpsinfo64 prpsinfo64_t;
diff --git a/bfd/elf.c b/bfd/elf.c
index a92dd5d..4556386 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -44,6 +44,7 @@ SECTION
#include "elf-bfd.h"
#include "libiberty.h"
#include "safe-ctype.h"
+#include "elf-psinfo.h"
#ifdef CORE_HEADER
#include CORE_HEADER
@@ -9062,16 +9063,16 @@ char *
elfcore_write_prpsinfo (bfd *abfd,
char *buf,
int *bufsiz,
- const char *fname,
- const char *psargs)
+ const struct elf_internal_prpsinfo *input)
{
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
if (bed->elf_backend_write_core_note != NULL)
{
char *ret;
+
ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
- NT_PRPSINFO, fname, psargs);
+ NT_PRPSINFO, input);
if (ret != NULL)
return ret;
}
@@ -9089,8 +9090,8 @@ elfcore_write_prpsinfo (bfd *abfd,
#endif
memset (&data, 0, sizeof (data));
- strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
- strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+ strncpy (data.pr_fname, input->pr_fname, sizeof (data.pr_fname));
+ strncpy (data.pr_psargs, input->pr_psargs, sizeof (data.pr_psargs));
return elfcore_write_note (abfd, buf, bufsiz,
"CORE", note_type, &data, sizeof (data));
}
@@ -9101,13 +9102,13 @@ elfcore_write_prpsinfo (bfd *abfd,
psinfo_t data;
int note_type = NT_PSINFO;
#else
- prpsinfo_t data;
+ prpsinfo64_t data;
int note_type = NT_PRPSINFO;
#endif
memset (&data, 0, sizeof (data));
- strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
- strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+ strncpy (data.pr_fname, input->pr_fname, sizeof (data.pr_fname));
+ strncpy (data.pr_psargs, input->pr_psargs, sizeof (data.pr_psargs));
return elfcore_write_note (abfd, buf, bufsiz,
"CORE", note_type, &data, sizeof (data));
}
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index fd7d26a..cacc895 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -30,6 +30,7 @@
#include "elf-nacl.h"
#include "elf-vxworks.h"
#include "elf/arm.h"
+#include "elf-psinfo.h"
/* Return the relocation section associated with NAME. HTAB is the
bfd's elf32_arm_link_hash_entry. */
@@ -2004,17 +2005,19 @@ elf32_arm_nabi_write_core_note (bfd *abfd, char *buf, int *bufsiz,
case NT_PRPSINFO:
{
- char data[124];
+ const struct elf_internal_prpsinfo *prpsinfo;
+ struct elf_external_prpsinfo32 data;
va_list ap;
va_start (ap, note_type);
- memset (data, 0, sizeof (data));
- strncpy (data + 28, va_arg (ap, const char *), 16);
- strncpy (data + 44, va_arg (ap, const char *), 80);
+ prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
va_end (ap);
+ memset (&data, 0, sizeof (data));
+ PRPSINFO32_COPY_FIELDS (abfd, prpsinfo, data);
+
return elfcore_write_note (abfd, buf, bufsiz,
- "CORE", note_type, data, sizeof (data));
+ "CORE", note_type, &data, sizeof (data));
}
case NT_PRSTATUS:
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index a188cec..4a14fc9 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -31,6 +31,10 @@
#include "objalloc.h"
#include "hashtab.h"
#include "dwarf2.h"
+#include "elf-bfd.h"
+#include "elf-psinfo.h"
+
+#include <stdarg.h>
/* 386 uses REL relocations instead of RELA. */
#define USE_REL 1
@@ -500,6 +504,43 @@ elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
return TRUE;
}
+
+static char *
+elf_i386_write_core_note (bfd *abfd, char *buf, int *bufsiz,
+ int note_type, ...)
+{
+ va_list ap;
+
+ switch (note_type)
+ {
+ default:
+ return NULL;
+
+ case NT_PRPSINFO:
+ {
+ const struct elf_internal_prpsinfo *prpsinfo;
+ struct elf_external_prpsinfo32 data;
+
+ va_start (ap, note_type);
+ prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
+ va_end (ap);
+
+ memset (&data, 0, sizeof (data));
+ PRPSINFO32_COPY_FIELDS (abfd, prpsinfo, data);
+
+ return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+ &data, sizeof (data));
+ }
+ /* NOTREACHED */
+
+ case NT_PRSTATUS:
+ /* FIXME: For now, to avoid the inclusion of the "CORE_HEADER", we
+ return NULL and delegate this to elfcore_write_prstatus. */
+ return NULL;
+ }
+ /* NOTREACHED */
+}
+
/* Functions for the i386 ELF linker.
@@ -5140,6 +5181,7 @@ elf_i386_add_symbol_hook (bfd * abfd,
#define elf_backend_gc_sweep_hook elf_i386_gc_sweep_hook
#define elf_backend_grok_prstatus elf_i386_grok_prstatus
#define elf_backend_grok_psinfo elf_i386_grok_psinfo
+#define elf_backend_write_core_note elf_i386_write_core_note
#define elf_backend_reloc_type_class elf_i386_reloc_type_class
#define elf_backend_relocate_section elf_i386_relocate_section
#define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 5241926..199affa 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -37,6 +37,7 @@
#include "elf32-ppc.h"
#include "elf-vxworks.h"
#include "dwarf2.h"
+#include "elf-psinfo.h"
typedef enum split16_format_type
{
@@ -2212,6 +2213,61 @@ ppc_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
return TRUE;
}
+/* External 32-bit PPC structure for PRPSINFO. This structure is ABI-defined,
+ thus we choose to use char arrays here in order to avoid dealing with
+ different types in different architectures.
+
+ The reason why we have a different structure only for PPC is because
+ on this architecture (and *only* here!) the size of 32-bit structure
+ changes. This is due to the different sizes of `pr_uid' and `pr_gid',
+ which on non-PPC architectures are declared as `short int' and on PPC
+ architectures are declared as `int'.
+
+ This structure will ultimately be written in the corefile's note section,
+ as the PRPSINFO. */
+
+struct elf_external_ppc_prpsinfo32
+ {
+ char pr_state; /* Numeric process state. */
+ char pr_sname; /* Char for pr_state. */
+ char pr_zomb; /* Zombie. */
+ char pr_nice; /* Nice val. */
+ char pr_flag[4]; /* Flags. */
+ char pr_uid[4];
+ char pr_gid[4];
+ char pr_pid[4];
+ char pr_ppid[4];
+ char pr_pgrp[4];
+ char pr_sid[4];
+ /* Lots missing */
+ char pr_fname[16]; /* Filename of executable. */
+ char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
+ };
+
+/* Helper macro to copy (properly handling endianess) things from the
+ `elf_internal_prpsinfo' structure to the `elf_external_ppc_prpsinfo32'
+ structure.
+
+ Note that FROM should be a pointer, and TO should be the explicit type. */
+
+#define PRPSINFO32_PPC_COPY_FIELDS(abfd, from, to) \
+ do \
+ { \
+ H_PUT_8 (abfd, from->pr_state, &to.pr_state); \
+ H_PUT_8 (abfd, from->pr_sname, &to.pr_sname); \
+ H_PUT_8 (abfd, from->pr_zomb, &to.pr_zomb); \
+ H_PUT_8 (abfd, from->pr_nice, &to.pr_nice); \
+ H_PUT_32 (abfd, from->pr_flag, to.pr_flag); \
+ H_PUT_32 (abfd, from->pr_uid, to.pr_uid); \
+ H_PUT_32 (abfd, from->pr_gid, to.pr_gid); \
+ H_PUT_32 (abfd, from->pr_pid, to.pr_pid); \
+ H_PUT_32 (abfd, from->pr_ppid, to.pr_ppid); \
+ H_PUT_32 (abfd, from->pr_pgrp, to.pr_pgrp); \
+ H_PUT_32 (abfd, from->pr_sid, to.pr_sid); \
+ strncpy (to.pr_fname, from->pr_fname, sizeof (to.pr_fname)); \
+ strncpy (to.pr_psargs, from->pr_psargs, sizeof (to.pr_psargs)); \
+ } while (0)
+
static char *
ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
{
@@ -2222,16 +2278,19 @@ ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
case NT_PRPSINFO:
{
- char data[128];
+ const struct elf_internal_prpsinfo *prpsinfo;
+ struct elf_external_ppc_prpsinfo32 data;
va_list ap;
va_start (ap, note_type);
- memset (data, 0, sizeof (data));
- strncpy (data + 32, va_arg (ap, const char *), 16);
- strncpy (data + 48, va_arg (ap, const char *), 80);
+ prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
va_end (ap);
+
+ memset (&data, 0, sizeof (data));
+ PRPSINFO32_PPC_COPY_FIELDS (abfd, prpsinfo, data);
+
return elfcore_write_note (abfd, buf, bufsiz,
- "CORE", note_type, data, sizeof (data));
+ "CORE", note_type, &data, sizeof (data));
}
case NT_PRSTATUS:
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 10b6f9d..4eda989 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -34,6 +34,7 @@
#include "elf-bfd.h"
#include "elf/ppc64.h"
#include "elf64-ppc.h"
+#include "elf-psinfo.h"
#include "dwarf2.h"
static bfd_reloc_status_type ppc64_elf_ha_reloc
@@ -2718,16 +2719,19 @@ ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
case NT_PRPSINFO:
{
- char data[136];
+ const struct elf_internal_prpsinfo *prpsinfo;
+ struct elf_external_prpsinfo64 data;
va_list ap;
va_start (ap, note_type);
- memset (data, 0, sizeof (data));
- strncpy (data + 40, va_arg (ap, const char *), 16);
- strncpy (data + 56, va_arg (ap, const char *), 80);
+ prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
va_end (ap);
+
+ memset (&data, 0, sizeof (data));
+ PRPSINFO64_COPY_FIELDS (abfd, prpsinfo, data);
+
return elfcore_write_note (abfd, buf, bufsiz,
- "CORE", note_type, data, sizeof (data));
+ "CORE", note_type, &data, sizeof (data));
}
case NT_PRSTATUS:
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 283681c..2c9939d 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -32,11 +32,13 @@
#include "hashtab.h"
#include "dwarf2.h"
#include "libiberty.h"
+#include "elf-psinfo.h"
+
+#include <stdarg.h>
#include "elf/x86-64.h"
#ifdef CORE_HEADER
-#include <stdarg.h>
#include CORE_HEADER
#endif
@@ -415,14 +417,13 @@ elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
return TRUE;
}
-#ifdef CORE_HEADER
static char *
elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
int note_type, ...)
{
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
va_list ap;
- const char *fname, *psargs;
+ const struct elf_internal_prpsinfo *prpsinfo;
long pid;
int cursig;
const void *gregs;
@@ -434,27 +435,28 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
case NT_PRPSINFO:
va_start (ap, note_type);
- fname = va_arg (ap, const char *);
- psargs = va_arg (ap, const char *);
+ prpsinfo = va_arg (ap, const struct elf_internal_prpsinfo *);
va_end (ap);
if (bed->s->elfclass == ELFCLASS32)
{
- prpsinfo32_t data;
- memset (&data, 0, sizeof (data));
- strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
- strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+ struct elf_external_prpsinfo32 data32;
+
+ memset (&data32, 0, sizeof (data32));
+ PRPSINFO32_COPY_FIELDS (abfd, prpsinfo, data32);
+
return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
- &data, sizeof (data));
+ &data32, sizeof (data32));
}
else
{
- prpsinfo64_t data;
- memset (&data, 0, sizeof (data));
- strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
- strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+ struct elf_external_prpsinfo64 data64;
+
+ memset (&data64, 0, sizeof (data64));
+ PRPSINFO64_COPY_FIELDS (abfd, prpsinfo, data64);
+
return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
- &data, sizeof (data));
+ &data64, sizeof (data64));
}
/* NOTREACHED */
@@ -501,7 +503,7 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
}
/* NOTREACHED */
}
-#endif
+
/* Functions for the x86-64 ELF linker. */
@@ -5225,9 +5227,7 @@ static const struct bfd_elf_special_section
#define elf_backend_gc_sweep_hook elf_x86_64_gc_sweep_hook
#define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
#define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
-#ifdef CORE_HEADER
#define elf_backend_write_core_note elf_x86_64_write_core_note
-#endif
#define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
#define elf_backend_relocate_section elf_x86_64_relocate_section
#define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections
diff --git a/bfd/hosts/x86-64linux.h b/bfd/hosts/x86-64linux.h
index 78be09a..6070978 100644
--- a/bfd/hosts/x86-64linux.h
+++ b/bfd/hosts/x86-64linux.h
@@ -43,11 +43,6 @@ typedef unsigned long long int uint64_t;
/* Unsigned 64-bit integer aligned to 8 bytes. */
typedef uint64_t __attribute__ ((__aligned__ (8))) a8_uint64_t;
-#undef HAVE_PRPSINFO32_T
-#define HAVE_PRPSINFO32_T
-#undef HAVE_PRPSINFO32_T_PR_PID
-#define HAVE_PRPSINFO32_T_PR_PID
-
#undef HAVE_PRSTATUS32_T
#define HAVE_PRSTATUS32_T
@@ -191,36 +186,6 @@ struct elf_prstatus64
int pr_fpvalid; /* True if math copro being used. */
};
-struct elf_prpsinfo32
- {
- char pr_state; /* Numeric process state. */
- char pr_sname; /* Char for pr_state. */
- char pr_zomb; /* Zombie. */
- char pr_nice; /* Nice val. */
- unsigned int pr_flag; /* Flags. */
- unsigned short int pr_uid;
- unsigned short int pr_gid;
- int pr_pid, pr_ppid, pr_pgrp, pr_sid;
- /* Lots missing */
- char pr_fname[16]; /* Filename of executable. */
- char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
- };
-
-struct elf_prpsinfo64
- {
- char pr_state; /* Numeric process state. */
- char pr_sname; /* Char for pr_state. */
- char pr_zomb; /* Zombie. */
- char pr_nice; /* Nice val. */
- a8_uint64_t pr_flag; /* Flags. */
- unsigned int pr_uid;
- unsigned int pr_gid;
- int pr_pid, pr_ppid, pr_pgrp, pr_sid;
- /* Lots missing */
- char pr_fname[16]; /* Filename of executable. */
- char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
- };
-
/* The rest of this file provides the types for emulation of the
Solaris <proc_service.h> interfaces that should be implemented by
users of libthread_db. */
@@ -229,5 +194,3 @@ struct elf_prpsinfo64
typedef struct elf_prstatus32 prstatus32_t;
typedef struct elf_prstatusx32 prstatusx32_t;
typedef struct elf_prstatus64 prstatus64_t;
-typedef struct elf_prpsinfo32 prpsinfo32_t;
-typedef struct elf_prpsinfo64 prpsinfo64_t;
--
1.7.7.6