2013-02-05 02:26:34 +08:00
|
|
|
/* Definitions for PRPSINFO structures under ELF on GNU/Linux.
|
2021-01-01 06:58:58 +08:00
|
|
|
Copyright (C) 2013-2021 Free Software Foundation, Inc.
|
2013-02-05 02:26:34 +08:00
|
|
|
|
|
|
|
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. */
|
|
|
|
|
2016-01-21 11:03:53 +08:00
|
|
|
#ifndef ELF_LINUX_CORE_H
|
|
|
|
#define ELF_LINUX_CORE_H
|
2013-02-05 02:26:34 +08:00
|
|
|
|
ELF/BFD,GDB: Handle both variants of the 32-bit Linux core PRPSINFO note
Fix commit 70a38d42c5b3 ("New entry points for writing Linux NT_PRPSINFO
notes."), <https://sourceware.org/ml/binutils/2013-02/msg00023.html>,
and commit b3ac9c77560a ("Put more info in NT_PRPSINFO Linux notes"),
<https://sourceware.org/ml/binutils/2013-02/msg00024.html>, and handle
both variants of the 32-bit Linux core PRPSINFO note across all targets.
The 32-bit Linux core PRPSINFO note matches the 32-bit kernel structure,
defined as follows:
(gdb) ptype struct elf_prpsinfo
type = struct elf_prpsinfo {
char pr_state;
char pr_sname;
char pr_zomb;
char pr_nice;
unsigned long pr_flag;
__kernel_uid_t pr_uid;
__kernel_gid_t pr_gid;
pid_t pr_pid;
pid_t pr_ppid;
pid_t pr_pgrp;
pid_t pr_sid;
char pr_fname[16];
char pr_psargs[80];
}
(gdb)
where the individual data types of most members are the same across all
32-bit Linux ports, with the exception of `__kernel_uid_t' and
`__kernel_gid_t'. These are defined in <asm-generic/posix_types.h> as
32-bit `unsigned int' by default, however overridden as 16-bit `unsigned
short' in port-specific <asm/posix_types.h> for a few targets, mostly
earlier ports of Linux, specifically: ARM, CRIS, FR-V, M32R, m68k,
MN10300/AM33, s390, SuperH, SPARC and i386.
The default is the same as the PowerPC variant already handled, as from
the commits referred. Make the special PowerPC case generic then,
removing the GDB part, and provide a backend flag to switch between the
two cases possible, with the 32-bit one being the default and the 16-bit
one explicitly selected. Set the flag in the target backends affected.
bfd/
* elf-bfd.h (elf_backend_data): Add `linux_prpsinfo32_ugid16'
member.
(elfcore_write_ppc_linux_prpsinfo32): Remove prototype.
* elf32-ppc.c (elfcore_write_ppc_linux_prpsinfo32): Remove.
(elf_external_ppc_linux_prpsinfo32)
(swap_ppc_linux_prpsinfo32_out): Move to...
* elf-linux-core.h (elf_external_linux_prpsinfo32_ugid32)
(swap_linux_prpsinfo32_ugid32_out): ... these.
(elf_external_linux_prpsinfo32): Rename to...
(elf_external_linux_prpsinfo32_ugid16): ... this.
(swap_linux_prpsinfo32_out): Rename to...
(swap_linux_prpsinfo32_ugid16_out): ... this.
* elfxx-target.h [!elf_backend_linux_prpsinfo32_ugid16]
(elf_backend_linux_prpsinfo32_ugid16): Define.
(elfNN_bed): Initialize `linux_prpsinfo32_ugid16' member.
* elf.c (elfcore_write_linux_prpsinfo32): Handle both variants
of the 32-bit Linux core PRPSINFO note.
* elf32-am33lin.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-arm.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-cris.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-frv.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-i386.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m32r.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m68k.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-s390.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sh.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sparc.c (elf_backend_linux_prpsinfo32_ugid16): Define.
gdb/
* ppc-linux-tdep.c (ppc_linux_init_abi): Remove call to
`set_gdbarch_elfcore_write_linux_prpsinfo'.
2017-10-11 22:01:40 +08:00
|
|
|
/* 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 is the variant for targets which use a 32-bit data type for
|
|
|
|
UID and GID, as all modern Linux ports do. Some older ports use
|
|
|
|
a 16-bit data type instead; see below for the alternative variant.
|
|
|
|
|
|
|
|
This structure will ultimately be written in the corefile's note
|
|
|
|
section, as the PRPSINFO. */
|
|
|
|
|
|
|
|
struct elf_external_linux_prpsinfo32_ugid32
|
|
|
|
{
|
|
|
|
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];
|
2018-04-27 08:12:11 +08:00
|
|
|
char pr_fname[16] ATTRIBUTE_NONSTRING; /* Filename of executable. */
|
|
|
|
char pr_psargs[80] ATTRIBUTE_NONSTRING; /* Initial part of arg list. */
|
ELF/BFD,GDB: Handle both variants of the 32-bit Linux core PRPSINFO note
Fix commit 70a38d42c5b3 ("New entry points for writing Linux NT_PRPSINFO
notes."), <https://sourceware.org/ml/binutils/2013-02/msg00023.html>,
and commit b3ac9c77560a ("Put more info in NT_PRPSINFO Linux notes"),
<https://sourceware.org/ml/binutils/2013-02/msg00024.html>, and handle
both variants of the 32-bit Linux core PRPSINFO note across all targets.
The 32-bit Linux core PRPSINFO note matches the 32-bit kernel structure,
defined as follows:
(gdb) ptype struct elf_prpsinfo
type = struct elf_prpsinfo {
char pr_state;
char pr_sname;
char pr_zomb;
char pr_nice;
unsigned long pr_flag;
__kernel_uid_t pr_uid;
__kernel_gid_t pr_gid;
pid_t pr_pid;
pid_t pr_ppid;
pid_t pr_pgrp;
pid_t pr_sid;
char pr_fname[16];
char pr_psargs[80];
}
(gdb)
where the individual data types of most members are the same across all
32-bit Linux ports, with the exception of `__kernel_uid_t' and
`__kernel_gid_t'. These are defined in <asm-generic/posix_types.h> as
32-bit `unsigned int' by default, however overridden as 16-bit `unsigned
short' in port-specific <asm/posix_types.h> for a few targets, mostly
earlier ports of Linux, specifically: ARM, CRIS, FR-V, M32R, m68k,
MN10300/AM33, s390, SuperH, SPARC and i386.
The default is the same as the PowerPC variant already handled, as from
the commits referred. Make the special PowerPC case generic then,
removing the GDB part, and provide a backend flag to switch between the
two cases possible, with the 32-bit one being the default and the 16-bit
one explicitly selected. Set the flag in the target backends affected.
bfd/
* elf-bfd.h (elf_backend_data): Add `linux_prpsinfo32_ugid16'
member.
(elfcore_write_ppc_linux_prpsinfo32): Remove prototype.
* elf32-ppc.c (elfcore_write_ppc_linux_prpsinfo32): Remove.
(elf_external_ppc_linux_prpsinfo32)
(swap_ppc_linux_prpsinfo32_out): Move to...
* elf-linux-core.h (elf_external_linux_prpsinfo32_ugid32)
(swap_linux_prpsinfo32_ugid32_out): ... these.
(elf_external_linux_prpsinfo32): Rename to...
(elf_external_linux_prpsinfo32_ugid16): ... this.
(swap_linux_prpsinfo32_out): Rename to...
(swap_linux_prpsinfo32_ugid16_out): ... this.
* elfxx-target.h [!elf_backend_linux_prpsinfo32_ugid16]
(elf_backend_linux_prpsinfo32_ugid16): Define.
(elfNN_bed): Initialize `linux_prpsinfo32_ugid16' member.
* elf.c (elfcore_write_linux_prpsinfo32): Handle both variants
of the 32-bit Linux core PRPSINFO note.
* elf32-am33lin.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-arm.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-cris.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-frv.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-i386.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m32r.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m68k.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-s390.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sh.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sparc.c (elf_backend_linux_prpsinfo32_ugid16): Define.
gdb/
* ppc-linux-tdep.c (ppc_linux_init_abi): Remove call to
`set_gdbarch_elfcore_write_linux_prpsinfo'.
2017-10-11 22:01:40 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Helper function to copy an elf_internal_linux_prpsinfo in host
|
|
|
|
endian to an elf_external_linux_prpsinfo32_ugid32 in target endian. */
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
swap_linux_prpsinfo32_ugid32_out
|
|
|
|
(bfd *obfd,
|
|
|
|
const struct elf_internal_linux_prpsinfo *from,
|
|
|
|
struct elf_external_linux_prpsinfo32_ugid32 *to)
|
|
|
|
{
|
|
|
|
bfd_put_8 (obfd, from->pr_state, &to->pr_state);
|
|
|
|
bfd_put_8 (obfd, from->pr_sname, &to->pr_sname);
|
|
|
|
bfd_put_8 (obfd, from->pr_zomb, &to->pr_zomb);
|
|
|
|
bfd_put_8 (obfd, from->pr_nice, &to->pr_nice);
|
|
|
|
bfd_put_32 (obfd, from->pr_flag, to->pr_flag);
|
|
|
|
bfd_put_32 (obfd, from->pr_uid, to->pr_uid);
|
|
|
|
bfd_put_32 (obfd, from->pr_gid, to->pr_gid);
|
|
|
|
bfd_put_32 (obfd, from->pr_pid, to->pr_pid);
|
|
|
|
bfd_put_32 (obfd, from->pr_ppid, to->pr_ppid);
|
|
|
|
bfd_put_32 (obfd, from->pr_pgrp, to->pr_pgrp);
|
|
|
|
bfd_put_32 (obfd, 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));
|
|
|
|
}
|
2013-02-05 02:26:34 +08:00
|
|
|
|
|
|
|
/* 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.
|
|
|
|
|
ELF/BFD,GDB: Handle both variants of the 32-bit Linux core PRPSINFO note
Fix commit 70a38d42c5b3 ("New entry points for writing Linux NT_PRPSINFO
notes."), <https://sourceware.org/ml/binutils/2013-02/msg00023.html>,
and commit b3ac9c77560a ("Put more info in NT_PRPSINFO Linux notes"),
<https://sourceware.org/ml/binutils/2013-02/msg00024.html>, and handle
both variants of the 32-bit Linux core PRPSINFO note across all targets.
The 32-bit Linux core PRPSINFO note matches the 32-bit kernel structure,
defined as follows:
(gdb) ptype struct elf_prpsinfo
type = struct elf_prpsinfo {
char pr_state;
char pr_sname;
char pr_zomb;
char pr_nice;
unsigned long pr_flag;
__kernel_uid_t pr_uid;
__kernel_gid_t pr_gid;
pid_t pr_pid;
pid_t pr_ppid;
pid_t pr_pgrp;
pid_t pr_sid;
char pr_fname[16];
char pr_psargs[80];
}
(gdb)
where the individual data types of most members are the same across all
32-bit Linux ports, with the exception of `__kernel_uid_t' and
`__kernel_gid_t'. These are defined in <asm-generic/posix_types.h> as
32-bit `unsigned int' by default, however overridden as 16-bit `unsigned
short' in port-specific <asm/posix_types.h> for a few targets, mostly
earlier ports of Linux, specifically: ARM, CRIS, FR-V, M32R, m68k,
MN10300/AM33, s390, SuperH, SPARC and i386.
The default is the same as the PowerPC variant already handled, as from
the commits referred. Make the special PowerPC case generic then,
removing the GDB part, and provide a backend flag to switch between the
two cases possible, with the 32-bit one being the default and the 16-bit
one explicitly selected. Set the flag in the target backends affected.
bfd/
* elf-bfd.h (elf_backend_data): Add `linux_prpsinfo32_ugid16'
member.
(elfcore_write_ppc_linux_prpsinfo32): Remove prototype.
* elf32-ppc.c (elfcore_write_ppc_linux_prpsinfo32): Remove.
(elf_external_ppc_linux_prpsinfo32)
(swap_ppc_linux_prpsinfo32_out): Move to...
* elf-linux-core.h (elf_external_linux_prpsinfo32_ugid32)
(swap_linux_prpsinfo32_ugid32_out): ... these.
(elf_external_linux_prpsinfo32): Rename to...
(elf_external_linux_prpsinfo32_ugid16): ... this.
(swap_linux_prpsinfo32_out): Rename to...
(swap_linux_prpsinfo32_ugid16_out): ... this.
* elfxx-target.h [!elf_backend_linux_prpsinfo32_ugid16]
(elf_backend_linux_prpsinfo32_ugid16): Define.
(elfNN_bed): Initialize `linux_prpsinfo32_ugid16' member.
* elf.c (elfcore_write_linux_prpsinfo32): Handle both variants
of the 32-bit Linux core PRPSINFO note.
* elf32-am33lin.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-arm.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-cris.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-frv.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-i386.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m32r.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m68k.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-s390.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sh.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sparc.c (elf_backend_linux_prpsinfo32_ugid16): Define.
gdb/
* ppc-linux-tdep.c (ppc_linux_init_abi): Remove call to
`set_gdbarch_elfcore_write_linux_prpsinfo'.
2017-10-11 22:01:40 +08:00
|
|
|
This is the variant for targets which use a 16-bit data type for
|
|
|
|
UID and GID, as some older Linux ports do. All modern ports use
|
|
|
|
a 32-bit data type instead; see above for the alternative variant.
|
|
|
|
|
2013-02-05 02:26:34 +08:00
|
|
|
This structure will ultimately be written in the corefile's note
|
|
|
|
section, as the PRPSINFO. */
|
|
|
|
|
ELF/BFD,GDB: Handle both variants of the 32-bit Linux core PRPSINFO note
Fix commit 70a38d42c5b3 ("New entry points for writing Linux NT_PRPSINFO
notes."), <https://sourceware.org/ml/binutils/2013-02/msg00023.html>,
and commit b3ac9c77560a ("Put more info in NT_PRPSINFO Linux notes"),
<https://sourceware.org/ml/binutils/2013-02/msg00024.html>, and handle
both variants of the 32-bit Linux core PRPSINFO note across all targets.
The 32-bit Linux core PRPSINFO note matches the 32-bit kernel structure,
defined as follows:
(gdb) ptype struct elf_prpsinfo
type = struct elf_prpsinfo {
char pr_state;
char pr_sname;
char pr_zomb;
char pr_nice;
unsigned long pr_flag;
__kernel_uid_t pr_uid;
__kernel_gid_t pr_gid;
pid_t pr_pid;
pid_t pr_ppid;
pid_t pr_pgrp;
pid_t pr_sid;
char pr_fname[16];
char pr_psargs[80];
}
(gdb)
where the individual data types of most members are the same across all
32-bit Linux ports, with the exception of `__kernel_uid_t' and
`__kernel_gid_t'. These are defined in <asm-generic/posix_types.h> as
32-bit `unsigned int' by default, however overridden as 16-bit `unsigned
short' in port-specific <asm/posix_types.h> for a few targets, mostly
earlier ports of Linux, specifically: ARM, CRIS, FR-V, M32R, m68k,
MN10300/AM33, s390, SuperH, SPARC and i386.
The default is the same as the PowerPC variant already handled, as from
the commits referred. Make the special PowerPC case generic then,
removing the GDB part, and provide a backend flag to switch between the
two cases possible, with the 32-bit one being the default and the 16-bit
one explicitly selected. Set the flag in the target backends affected.
bfd/
* elf-bfd.h (elf_backend_data): Add `linux_prpsinfo32_ugid16'
member.
(elfcore_write_ppc_linux_prpsinfo32): Remove prototype.
* elf32-ppc.c (elfcore_write_ppc_linux_prpsinfo32): Remove.
(elf_external_ppc_linux_prpsinfo32)
(swap_ppc_linux_prpsinfo32_out): Move to...
* elf-linux-core.h (elf_external_linux_prpsinfo32_ugid32)
(swap_linux_prpsinfo32_ugid32_out): ... these.
(elf_external_linux_prpsinfo32): Rename to...
(elf_external_linux_prpsinfo32_ugid16): ... this.
(swap_linux_prpsinfo32_out): Rename to...
(swap_linux_prpsinfo32_ugid16_out): ... this.
* elfxx-target.h [!elf_backend_linux_prpsinfo32_ugid16]
(elf_backend_linux_prpsinfo32_ugid16): Define.
(elfNN_bed): Initialize `linux_prpsinfo32_ugid16' member.
* elf.c (elfcore_write_linux_prpsinfo32): Handle both variants
of the 32-bit Linux core PRPSINFO note.
* elf32-am33lin.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-arm.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-cris.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-frv.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-i386.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m32r.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m68k.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-s390.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sh.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sparc.c (elf_backend_linux_prpsinfo32_ugid16): Define.
gdb/
* ppc-linux-tdep.c (ppc_linux_init_abi): Remove call to
`set_gdbarch_elfcore_write_linux_prpsinfo'.
2017-10-11 22:01:40 +08:00
|
|
|
struct elf_external_linux_prpsinfo32_ugid16
|
2013-02-05 02:26:34 +08:00
|
|
|
{
|
|
|
|
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];
|
2018-04-27 08:12:11 +08:00
|
|
|
char pr_fname[16] ATTRIBUTE_NONSTRING; /* Filename of executable. */
|
|
|
|
char pr_psargs[80] ATTRIBUTE_NONSTRING; /* Initial part of arg list. */
|
2013-02-05 02:26:34 +08:00
|
|
|
};
|
|
|
|
|
2016-01-21 11:03:53 +08:00
|
|
|
/* Helper function to copy an elf_internal_linux_prpsinfo in host
|
ELF/BFD,GDB: Handle both variants of the 32-bit Linux core PRPSINFO note
Fix commit 70a38d42c5b3 ("New entry points for writing Linux NT_PRPSINFO
notes."), <https://sourceware.org/ml/binutils/2013-02/msg00023.html>,
and commit b3ac9c77560a ("Put more info in NT_PRPSINFO Linux notes"),
<https://sourceware.org/ml/binutils/2013-02/msg00024.html>, and handle
both variants of the 32-bit Linux core PRPSINFO note across all targets.
The 32-bit Linux core PRPSINFO note matches the 32-bit kernel structure,
defined as follows:
(gdb) ptype struct elf_prpsinfo
type = struct elf_prpsinfo {
char pr_state;
char pr_sname;
char pr_zomb;
char pr_nice;
unsigned long pr_flag;
__kernel_uid_t pr_uid;
__kernel_gid_t pr_gid;
pid_t pr_pid;
pid_t pr_ppid;
pid_t pr_pgrp;
pid_t pr_sid;
char pr_fname[16];
char pr_psargs[80];
}
(gdb)
where the individual data types of most members are the same across all
32-bit Linux ports, with the exception of `__kernel_uid_t' and
`__kernel_gid_t'. These are defined in <asm-generic/posix_types.h> as
32-bit `unsigned int' by default, however overridden as 16-bit `unsigned
short' in port-specific <asm/posix_types.h> for a few targets, mostly
earlier ports of Linux, specifically: ARM, CRIS, FR-V, M32R, m68k,
MN10300/AM33, s390, SuperH, SPARC and i386.
The default is the same as the PowerPC variant already handled, as from
the commits referred. Make the special PowerPC case generic then,
removing the GDB part, and provide a backend flag to switch between the
two cases possible, with the 32-bit one being the default and the 16-bit
one explicitly selected. Set the flag in the target backends affected.
bfd/
* elf-bfd.h (elf_backend_data): Add `linux_prpsinfo32_ugid16'
member.
(elfcore_write_ppc_linux_prpsinfo32): Remove prototype.
* elf32-ppc.c (elfcore_write_ppc_linux_prpsinfo32): Remove.
(elf_external_ppc_linux_prpsinfo32)
(swap_ppc_linux_prpsinfo32_out): Move to...
* elf-linux-core.h (elf_external_linux_prpsinfo32_ugid32)
(swap_linux_prpsinfo32_ugid32_out): ... these.
(elf_external_linux_prpsinfo32): Rename to...
(elf_external_linux_prpsinfo32_ugid16): ... this.
(swap_linux_prpsinfo32_out): Rename to...
(swap_linux_prpsinfo32_ugid16_out): ... this.
* elfxx-target.h [!elf_backend_linux_prpsinfo32_ugid16]
(elf_backend_linux_prpsinfo32_ugid16): Define.
(elfNN_bed): Initialize `linux_prpsinfo32_ugid16' member.
* elf.c (elfcore_write_linux_prpsinfo32): Handle both variants
of the 32-bit Linux core PRPSINFO note.
* elf32-am33lin.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-arm.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-cris.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-frv.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-i386.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m32r.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m68k.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-s390.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sh.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sparc.c (elf_backend_linux_prpsinfo32_ugid16): Define.
gdb/
* ppc-linux-tdep.c (ppc_linux_init_abi): Remove call to
`set_gdbarch_elfcore_write_linux_prpsinfo'.
2017-10-11 22:01:40 +08:00
|
|
|
endian to an elf_external_linux_prpsinfo32_ugid16 in target endian. */
|
2016-01-21 11:03:53 +08:00
|
|
|
|
|
|
|
static inline void
|
ELF/BFD,GDB: Handle both variants of the 32-bit Linux core PRPSINFO note
Fix commit 70a38d42c5b3 ("New entry points for writing Linux NT_PRPSINFO
notes."), <https://sourceware.org/ml/binutils/2013-02/msg00023.html>,
and commit b3ac9c77560a ("Put more info in NT_PRPSINFO Linux notes"),
<https://sourceware.org/ml/binutils/2013-02/msg00024.html>, and handle
both variants of the 32-bit Linux core PRPSINFO note across all targets.
The 32-bit Linux core PRPSINFO note matches the 32-bit kernel structure,
defined as follows:
(gdb) ptype struct elf_prpsinfo
type = struct elf_prpsinfo {
char pr_state;
char pr_sname;
char pr_zomb;
char pr_nice;
unsigned long pr_flag;
__kernel_uid_t pr_uid;
__kernel_gid_t pr_gid;
pid_t pr_pid;
pid_t pr_ppid;
pid_t pr_pgrp;
pid_t pr_sid;
char pr_fname[16];
char pr_psargs[80];
}
(gdb)
where the individual data types of most members are the same across all
32-bit Linux ports, with the exception of `__kernel_uid_t' and
`__kernel_gid_t'. These are defined in <asm-generic/posix_types.h> as
32-bit `unsigned int' by default, however overridden as 16-bit `unsigned
short' in port-specific <asm/posix_types.h> for a few targets, mostly
earlier ports of Linux, specifically: ARM, CRIS, FR-V, M32R, m68k,
MN10300/AM33, s390, SuperH, SPARC and i386.
The default is the same as the PowerPC variant already handled, as from
the commits referred. Make the special PowerPC case generic then,
removing the GDB part, and provide a backend flag to switch between the
two cases possible, with the 32-bit one being the default and the 16-bit
one explicitly selected. Set the flag in the target backends affected.
bfd/
* elf-bfd.h (elf_backend_data): Add `linux_prpsinfo32_ugid16'
member.
(elfcore_write_ppc_linux_prpsinfo32): Remove prototype.
* elf32-ppc.c (elfcore_write_ppc_linux_prpsinfo32): Remove.
(elf_external_ppc_linux_prpsinfo32)
(swap_ppc_linux_prpsinfo32_out): Move to...
* elf-linux-core.h (elf_external_linux_prpsinfo32_ugid32)
(swap_linux_prpsinfo32_ugid32_out): ... these.
(elf_external_linux_prpsinfo32): Rename to...
(elf_external_linux_prpsinfo32_ugid16): ... this.
(swap_linux_prpsinfo32_out): Rename to...
(swap_linux_prpsinfo32_ugid16_out): ... this.
* elfxx-target.h [!elf_backend_linux_prpsinfo32_ugid16]
(elf_backend_linux_prpsinfo32_ugid16): Define.
(elfNN_bed): Initialize `linux_prpsinfo32_ugid16' member.
* elf.c (elfcore_write_linux_prpsinfo32): Handle both variants
of the 32-bit Linux core PRPSINFO note.
* elf32-am33lin.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-arm.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-cris.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-frv.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-i386.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m32r.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-m68k.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-s390.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sh.c (elf_backend_linux_prpsinfo32_ugid16): Define.
* elf32-sparc.c (elf_backend_linux_prpsinfo32_ugid16): Define.
gdb/
* ppc-linux-tdep.c (ppc_linux_init_abi): Remove call to
`set_gdbarch_elfcore_write_linux_prpsinfo'.
2017-10-11 22:01:40 +08:00
|
|
|
swap_linux_prpsinfo32_ugid16_out
|
|
|
|
(bfd *obfd,
|
|
|
|
const struct elf_internal_linux_prpsinfo *from,
|
|
|
|
struct elf_external_linux_prpsinfo32_ugid16 *to)
|
2016-01-21 11:03:53 +08:00
|
|
|
{
|
|
|
|
bfd_put_8 (obfd, from->pr_state, &to->pr_state);
|
|
|
|
bfd_put_8 (obfd, from->pr_sname, &to->pr_sname);
|
|
|
|
bfd_put_8 (obfd, from->pr_zomb, &to->pr_zomb);
|
|
|
|
bfd_put_8 (obfd, from->pr_nice, &to->pr_nice);
|
|
|
|
bfd_put_32 (obfd, from->pr_flag, to->pr_flag);
|
|
|
|
bfd_put_16 (obfd, from->pr_uid, to->pr_uid);
|
|
|
|
bfd_put_16 (obfd, from->pr_gid, to->pr_gid);
|
|
|
|
bfd_put_32 (obfd, from->pr_pid, to->pr_pid);
|
|
|
|
bfd_put_32 (obfd, from->pr_ppid, to->pr_ppid);
|
|
|
|
bfd_put_32 (obfd, from->pr_pgrp, to->pr_pgrp);
|
|
|
|
bfd_put_32 (obfd, 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));
|
|
|
|
}
|
2013-02-05 02:26:34 +08:00
|
|
|
|
|
|
|
/* 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.
|
|
|
|
|
2017-10-11 22:01:41 +08:00
|
|
|
This is the variant for targets which use a 32-bit data type for
|
|
|
|
UID and GID, as most Linux ports do. The SH64 port uses a 16-bit
|
|
|
|
data type instead; see below for the alternative variant.
|
|
|
|
|
2013-02-05 02:26:34 +08:00
|
|
|
This structure will ultimately be written in the corefile's note
|
|
|
|
section, as the PRPSINFO. */
|
|
|
|
|
2017-10-11 22:01:41 +08:00
|
|
|
struct elf_external_linux_prpsinfo64_ugid32
|
2013-02-05 02:26:34 +08:00
|
|
|
{
|
|
|
|
char pr_state; /* Numeric process state. */
|
|
|
|
char pr_sname; /* Char for pr_state. */
|
|
|
|
char pr_zomb; /* Zombie. */
|
|
|
|
char pr_nice; /* Nice val. */
|
|
|
|
char gap[4];
|
2017-10-11 22:01:40 +08:00
|
|
|
char pr_flag[8]; /* Flags. */
|
2013-02-05 02:26:34 +08:00
|
|
|
char pr_uid[4];
|
|
|
|
char pr_gid[4];
|
|
|
|
char pr_pid[4];
|
|
|
|
char pr_ppid[4];
|
|
|
|
char pr_pgrp[4];
|
|
|
|
char pr_sid[4];
|
2018-04-27 08:12:11 +08:00
|
|
|
char pr_fname[16] ATTRIBUTE_NONSTRING; /* Filename of executable. */
|
|
|
|
char pr_psargs[80] ATTRIBUTE_NONSTRING; /* Initial part of arg list. */
|
2013-02-05 02:26:34 +08:00
|
|
|
};
|
|
|
|
|
2016-01-21 11:03:53 +08:00
|
|
|
/* Helper function to copy an elf_internal_linux_prpsinfo in host
|
2017-10-11 22:01:41 +08:00
|
|
|
endian to an elf_external_linux_prpsinfo64_ugid32 in target endian. */
|
2016-01-21 11:03:53 +08:00
|
|
|
|
|
|
|
static inline void
|
2017-10-11 22:01:41 +08:00
|
|
|
swap_linux_prpsinfo64_ugid32_out
|
|
|
|
(bfd *obfd,
|
|
|
|
const struct elf_internal_linux_prpsinfo *from,
|
|
|
|
struct elf_external_linux_prpsinfo64_ugid32 *to)
|
2016-01-21 11:03:53 +08:00
|
|
|
{
|
|
|
|
bfd_put_8 (obfd, from->pr_state, &to->pr_state);
|
|
|
|
bfd_put_8 (obfd, from->pr_sname, &to->pr_sname);
|
|
|
|
bfd_put_8 (obfd, from->pr_zomb, &to->pr_zomb);
|
|
|
|
bfd_put_8 (obfd, from->pr_nice, &to->pr_nice);
|
|
|
|
bfd_put_64 (obfd, from->pr_flag, to->pr_flag);
|
|
|
|
bfd_put_32 (obfd, from->pr_uid, to->pr_uid);
|
|
|
|
bfd_put_32 (obfd, from->pr_gid, to->pr_gid);
|
|
|
|
bfd_put_32 (obfd, from->pr_pid, to->pr_pid);
|
|
|
|
bfd_put_32 (obfd, from->pr_ppid, to->pr_ppid);
|
|
|
|
bfd_put_32 (obfd, from->pr_pgrp, to->pr_pgrp);
|
|
|
|
bfd_put_32 (obfd, 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));
|
|
|
|
}
|
2013-02-05 02:26:34 +08:00
|
|
|
|
2017-10-11 22:01:41 +08:00
|
|
|
/* 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.
|
|
|
|
|
|
|
|
This is the variant for the SH64 port which uses a 16-bit data
|
|
|
|
type for UID and GID. Most Linux ports use a 32-bit data type
|
|
|
|
instead; see above for the alternative variant.
|
|
|
|
|
|
|
|
This structure will ultimately be written in the corefile's note
|
|
|
|
section, as the PRPSINFO. */
|
|
|
|
|
|
|
|
struct elf_external_linux_prpsinfo64_ugid16
|
|
|
|
{
|
|
|
|
char pr_state; /* Numeric process state. */
|
|
|
|
char pr_sname; /* Char for pr_state. */
|
|
|
|
char pr_zomb; /* Zombie. */
|
|
|
|
char pr_nice; /* Nice val. */
|
|
|
|
char gap[4];
|
|
|
|
char pr_flag[8]; /* 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];
|
2018-04-27 08:12:11 +08:00
|
|
|
char pr_fname[16] ATTRIBUTE_NONSTRING; /* Filename of executable. */
|
|
|
|
char pr_psargs[80] ATTRIBUTE_NONSTRING; /* Initial part of arg list. */
|
2017-10-11 22:01:41 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Helper function to copy an elf_internal_linux_prpsinfo in host
|
|
|
|
endian to an elf_external_linux_prpsinfo64_ugid16 in target endian. */
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
swap_linux_prpsinfo64_ugid16_out
|
|
|
|
(bfd *obfd,
|
|
|
|
const struct elf_internal_linux_prpsinfo *from,
|
|
|
|
struct elf_external_linux_prpsinfo64_ugid16 *to)
|
|
|
|
{
|
|
|
|
bfd_put_8 (obfd, from->pr_state, &to->pr_state);
|
|
|
|
bfd_put_8 (obfd, from->pr_sname, &to->pr_sname);
|
|
|
|
bfd_put_8 (obfd, from->pr_zomb, &to->pr_zomb);
|
|
|
|
bfd_put_8 (obfd, from->pr_nice, &to->pr_nice);
|
|
|
|
bfd_put_64 (obfd, from->pr_flag, to->pr_flag);
|
|
|
|
bfd_put_16 (obfd, from->pr_uid, to->pr_uid);
|
|
|
|
bfd_put_16 (obfd, from->pr_gid, to->pr_gid);
|
|
|
|
bfd_put_32 (obfd, from->pr_pid, to->pr_pid);
|
|
|
|
bfd_put_32 (obfd, from->pr_ppid, to->pr_ppid);
|
|
|
|
bfd_put_32 (obfd, from->pr_pgrp, to->pr_pgrp);
|
|
|
|
bfd_put_32 (obfd, 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));
|
|
|
|
}
|
|
|
|
|
2013-02-05 02:26:34 +08:00
|
|
|
#endif
|