===================================================================
@@ -1552,6 +1552,10 @@ struct elf_backend_data
/* True if `_bfd_elf_link_renumber_dynsyms' must be called even for
static binaries. */
unsigned always_renumber_dynsyms : 1;
+
+ /* True if the 32-bit Linux PRPSINFO structure's `pr_uid' and `pr_gid'
+ members use a 16-bit data type. */
+ unsigned linux_prpsinfo32_ugid16 : 1;
};
/* Information about reloc sections associated with a bfd_elf_section_data
@@ -2590,10 +2594,6 @@ extern char *elfcore_write_linux_prpsinf
extern char *elfcore_write_linux_prpsinfo64
(bfd *, char *, int *, const struct elf_internal_linux_prpsinfo *);
-/* Linux/PPC32 uses different layout compared to most archs. */
-extern char *elfcore_write_ppc_linux_prpsinfo32
- (bfd *, char *, int *, const struct elf_internal_linux_prpsinfo *);
-
extern bfd *_bfd_elf32_bfd_from_remote_memory
(bfd *templ, bfd_vma ehdr_vma, bfd_size_type size, bfd_vma *loadbasep,
int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type));
===================================================================
@@ -21,18 +21,70 @@
#ifndef ELF_LINUX_CORE_H
#define ELF_LINUX_CORE_H
-/* The PRPSINFO structures defined below are used by most
- architectures, although some of them define their own versions
- (like e.g., PPC). */
+/* 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];
+ char pr_fname[16]; /* Filename of executable. */
+ char pr_psargs[80]; /* Initial part of arg list. */
+ };
+
+/* 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));
+}
/* 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 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.
+
This structure will ultimately be written in the corefile's note
section, as the PRPSINFO. */
-struct elf_external_linux_prpsinfo32
+struct elf_external_linux_prpsinfo32_ugid16
{
char pr_state; /* Numeric process state. */
char pr_sname; /* Char for pr_state. */
@@ -50,12 +102,13 @@ struct elf_external_linux_prpsinfo32
};
/* Helper function to copy an elf_internal_linux_prpsinfo in host
- endian to an elf_external_linux_prpsinfo32 in target endian. */
+ endian to an elf_external_linux_prpsinfo32_ugid16 in target endian. */
static inline void
-swap_linux_prpsinfo32_out (bfd *obfd,
- const struct elf_internal_linux_prpsinfo *from,
- struct elf_external_linux_prpsinfo32 *to)
+swap_linux_prpsinfo32_ugid16_out
+ (bfd *obfd,
+ const struct elf_internal_linux_prpsinfo *from,
+ struct elf_external_linux_prpsinfo32_ugid16 *to)
{
bfd_put_8 (obfd, from->pr_state, &to->pr_state);
bfd_put_8 (obfd, from->pr_sname, &to->pr_sname);
===================================================================
@@ -10447,11 +10447,22 @@ elfcore_write_linux_prpsinfo32
(bfd *abfd, char *buf, int *bufsiz,
const struct elf_internal_linux_prpsinfo *prpsinfo)
{
- struct elf_external_linux_prpsinfo32 data;
+ if (get_elf_backend_data (abfd)->linux_prpsinfo32_ugid16)
+ {
+ struct elf_external_linux_prpsinfo32_ugid16 data;
- swap_linux_prpsinfo32_out (abfd, prpsinfo, &data);
- return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
- &data, sizeof (data));
+ swap_linux_prpsinfo32_ugid16_out (abfd, prpsinfo, &data);
+ return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
+ &data, sizeof (data));
+ }
+ else
+ {
+ struct elf_external_linux_prpsinfo32_ugid32 data;
+
+ swap_linux_prpsinfo32_ugid32_out (abfd, prpsinfo, &data);
+ return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
+ &data, sizeof (data));
+ }
}
char *
===================================================================
@@ -102,4 +102,6 @@ elf32_am33lin_grok_psinfo (bfd *abfd, El
#define elf_backend_grok_prstatus elf32_am33lin_grok_prstatus
#define elf_backend_grok_psinfo elf32_am33lin_grok_psinfo
+#define elf_backend_linux_prpsinfo32_ugid16 TRUE
+
#include "elf-m10300.c"
===================================================================
@@ -19452,6 +19452,8 @@ elf32_arm_backend_symbol_processing (bfd
#undef elf_backend_lookup_section_flags_hook
#define elf_backend_lookup_section_flags_hook elf32_arm_lookup_section_flags
+#define elf_backend_linux_prpsinfo32_ugid16 TRUE
+
#include "elf32-target.h"
/* Native Client targets. */
===================================================================
@@ -4347,6 +4347,8 @@ elf_cris_got_elt_size (bfd *abfd ATTRIBU
#define elf_backend_may_use_rela_p 1
#define elf_backend_rela_normal 1
+#define elf_backend_linux_prpsinfo32_ugid16 TRUE
+
#include "elf32-target.h"
#undef TARGET_LITTLE_SYM
===================================================================
@@ -6810,6 +6810,8 @@ elf32_frv_grok_psinfo (bfd *abfd, Elf_In
#define elf_backend_grok_prstatus elf32_frv_grok_prstatus
#define elf_backend_grok_psinfo elf32_frv_grok_psinfo
+#define elf_backend_linux_prpsinfo32_ugid16 TRUE
+
#include "elf32-target.h"
#undef ELF_MAXPAGESIZE
===================================================================
@@ -4688,6 +4688,8 @@ elf_i386_link_setup_gnu_properties (stru
#define elf_backend_relocate_section elf_i386_relocate_section
#define elf_backend_setup_gnu_properties elf_i386_link_setup_gnu_properties
+#define elf_backend_linux_prpsinfo32_ugid16 TRUE
+
#include "elf32-target.h"
/* FreeBSD support. */
===================================================================
@@ -4015,6 +4015,8 @@ m32r_elf_reloc_type_class (const struct
#define bfd_elf32_bfd_print_private_bfd_data m32r_elf_print_private_bfd_data
#define elf_backend_special_sections m32r_elf_special_sections
+#define elf_backend_linux_prpsinfo32_ugid16 TRUE
+
#include "elf32-target.h"
#undef ELF_MAXPAGESIZE
===================================================================
@@ -4841,4 +4841,6 @@ elf_m68k_add_symbol_hook (bfd *abfd,
#define elf_backend_rela_normal 1
#define elf_backend_dtrel_excludes_plt 1
+#define elf_backend_linux_prpsinfo32_ugid16 TRUE
+
#include "elf32-target.h"
===================================================================
@@ -1821,56 +1821,6 @@ static reloc_howto_type ppc_elf_howto_ra
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 PPC 32-bit structure uses int for `pr_uid' and `pr_gid' while
- most non-PPC architectures use `short int'.
-
- This structure will ultimately be written in the corefile's note
- section, as the PRPSINFO. */
-
-struct elf_external_ppc_linux_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];
- char pr_fname[16]; /* Filename of executable. */
- char pr_psargs[80]; /* Initial part of arg list. */
- };
-
-/* Helper function to copy an elf_internal_linux_prpsinfo in host
- endian to an elf_external_ppc_linux_prpsinfo32 in target endian. */
-
-static inline void
-swap_ppc_linux_prpsinfo32_out (bfd *obfd,
- const struct elf_internal_linux_prpsinfo *from,
- struct elf_external_ppc_linux_prpsinfo32 *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));
-}
/* Initialize the ppc_elf_howto_table, so that linear accesses can be done. */
@@ -2408,20 +2358,6 @@ ppc_elf_grok_psinfo (bfd *abfd, Elf_Inte
return TRUE;
}
-char *
-elfcore_write_ppc_linux_prpsinfo32
- (bfd *abfd,
- char *buf,
- int *bufsiz,
- const struct elf_internal_linux_prpsinfo *prpsinfo)
-{
- struct elf_external_ppc_linux_prpsinfo32 data;
-
- swap_ppc_linux_prpsinfo32_out (abfd, prpsinfo, &data);
- return elfcore_write_note (abfd, buf, bufsiz,
- "CORE", NT_PRPSINFO, &data, sizeof (data));
-}
-
static char *
ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
{
===================================================================
@@ -4219,4 +4219,6 @@ elf32_s390_merge_private_bfd_data (bfd *
#define bfd_elf32_mkobject elf_s390_mkobject
#define elf_backend_object_p elf_s390_object_p
+#define elf_backend_linux_prpsinfo32_ugid16 TRUE
+
#include "elf32-target.h"
===================================================================
@@ -7301,6 +7301,8 @@ sh_elf_encode_eh_address (bfd *abfd,
#define elf_backend_got_header_size 12
#define elf_backend_dtrel_excludes_plt 1
+#define elf_backend_linux_prpsinfo32_ugid16 TRUE
+
#if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
#include "elf32-target.h"
===================================================================
@@ -252,6 +252,8 @@ elf32_sparc_add_symbol_hook (bfd * abfd,
#define elf_backend_add_symbol_hook elf32_sparc_add_symbol_hook
+#define elf_backend_linux_prpsinfo32_ugid16 TRUE
+
#include "elf32-target.h"
/* Solaris 2. */
===================================================================
@@ -132,6 +132,9 @@
#ifndef elf_backend_always_renumber_dynsyms
#define elf_backend_always_renumber_dynsyms FALSE
#endif
+#ifndef elf_backend_linux_prpsinfo32_ugid16
+#define elf_backend_linux_prpsinfo32_ugid16 FALSE
+#endif
#ifndef elf_backend_stack_align
#define elf_backend_stack_align 16
#endif
@@ -891,7 +894,8 @@ static struct elf_backend_data elfNN_bed
elf_backend_default_execstack,
elf_backend_caches_rawsize,
elf_backend_extern_protected_data,
- elf_backend_always_renumber_dynsyms
+ elf_backend_always_renumber_dynsyms,
+ elf_backend_linux_prpsinfo32_ugid16
};
/* Forward declaration for use when initialising alternative_target field. */
===================================================================
@@ -60,7 +60,7 @@
#include "parser-defs.h"
#include "user-regs.h"
#include <ctype.h>
-#include "elf-bfd.h" /* for elfcore_write_* */
+#include "elf-bfd.h"
#include "features/rs6000/powerpc-32l.c"
#include "features/rs6000/powerpc-altivec32l.c"
@@ -1773,12 +1773,6 @@ ppc_linux_init_abi (struct gdbarch_info
set_gdbarch_gcore_bfd_target (gdbarch, "elf64-powerpc");
}
- /* PPC32 uses a different prpsinfo32 compared to most other Linux
- archs. */
- if (tdep->wordsize == 4)
- set_gdbarch_elfcore_write_linux_prpsinfo (gdbarch,
- elfcore_write_ppc_linux_prpsinfo32);
-
set_gdbarch_core_read_description (gdbarch, ppc_linux_core_read_description);
set_gdbarch_iterate_over_regset_sections (gdbarch,
ppc_linux_iterate_over_regset_sections);