Index: binutils/bfd/elf-bfd.h
===================================================================
--- binutils.orig/bfd/elf-bfd.h	2017-09-20 08:57:46.329829140 +0100
+++ binutils/bfd/elf-bfd.h	2017-09-20 13:21:44.632864903 +0100
@@ -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));
Index: binutils/bfd/elf-linux-core.h
===================================================================
--- binutils.orig/bfd/elf-linux-core.h	2017-09-20 13:03:16.072015869 +0100
+++ binutils/bfd/elf-linux-core.h	2017-09-20 13:21:44.637038624 +0100
@@ -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);
Index: binutils/bfd/elf.c
===================================================================
--- binutils.orig/bfd/elf.c	2017-09-20 08:57:46.410533380 +0100
+++ binutils/bfd/elf.c	2017-09-20 13:21:44.649303216 +0100
@@ -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 *
Index: binutils/bfd/elf32-am33lin.c
===================================================================
--- binutils.orig/bfd/elf32-am33lin.c	2017-09-20 08:57:46.444805132 +0100
+++ binutils/bfd/elf32-am33lin.c	2017-09-20 13:03:18.247682527 +0100
@@ -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"
Index: binutils/bfd/elf32-arm.c
===================================================================
--- binutils.orig/bfd/elf32-arm.c	2017-09-20 08:57:46.479234824 +0100
+++ binutils/bfd/elf32-arm.c	2017-09-20 13:03:18.308785922 +0100
@@ -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.  */
Index: binutils/bfd/elf32-cris.c
===================================================================
--- binutils.orig/bfd/elf32-cris.c	2017-09-20 08:57:46.486380760 +0100
+++ binutils/bfd/elf32-cris.c	2017-09-20 13:03:18.332132218 +0100
@@ -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
Index: binutils/bfd/elf32-frv.c
===================================================================
--- binutils.orig/bfd/elf32-frv.c	2017-09-20 08:57:46.506881510 +0100
+++ binutils/bfd/elf32-frv.c	2017-09-20 13:03:18.368383137 +0100
@@ -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
Index: binutils/bfd/elf32-i386.c
===================================================================
--- binutils.orig/bfd/elf32-i386.c	2017-09-20 08:57:46.533140544 +0100
+++ binutils/bfd/elf32-i386.c	2017-09-20 13:03:18.381640588 +0100
@@ -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.  */
Index: binutils/bfd/elf32-m32r.c
===================================================================
--- binutils.orig/bfd/elf32-m32r.c	2017-09-20 08:57:46.567479590 +0100
+++ binutils/bfd/elf32-m32r.c	2017-09-20 13:03:18.414173194 +0100
@@ -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
Index: binutils/bfd/elf32-m68k.c
===================================================================
--- binutils.orig/bfd/elf32-m68k.c	2017-09-20 08:57:46.603988462 +0100
+++ binutils/bfd/elf32-m68k.c	2017-09-20 13:03:18.461612987 +0100
@@ -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"
Index: binutils/bfd/elf32-ppc.c
===================================================================
--- binutils.orig/bfd/elf32-ppc.c	2017-09-20 08:57:46.632181726 +0100
+++ binutils/bfd/elf32-ppc.c	2017-09-20 13:03:18.545532544 +0100
@@ -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, ...)
 {
Index: binutils/bfd/elf32-s390.c
===================================================================
--- binutils.orig/bfd/elf32-s390.c	2017-09-20 08:57:46.652426839 +0100
+++ binutils/bfd/elf32-s390.c	2017-09-20 13:03:18.578921774 +0100
@@ -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"
Index: binutils/bfd/elf32-sh.c
===================================================================
--- binutils.orig/bfd/elf32-sh.c	2017-08-02 13:13:26.000000000 +0100
+++ binutils/bfd/elf32-sh.c	2017-09-20 13:25:34.410225837 +0100
@@ -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"
Index: binutils/bfd/elf32-sparc.c
===================================================================
--- binutils.orig/bfd/elf32-sparc.c	2017-09-20 08:57:46.677701718 +0100
+++ binutils/bfd/elf32-sparc.c	2017-09-20 13:03:18.589990618 +0100
@@ -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.  */
Index: binutils/bfd/elfxx-target.h
===================================================================
--- binutils.orig/bfd/elfxx-target.h	2017-09-20 08:57:46.692822810 +0100
+++ binutils/bfd/elfxx-target.h	2017-09-20 13:21:44.669562976 +0100
@@ -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.  */
Index: binutils/gdb/ppc-linux-tdep.c
===================================================================
--- binutils.orig/gdb/ppc-linux-tdep.c	2017-09-20 08:57:46.719058698 +0100
+++ binutils/gdb/ppc-linux-tdep.c	2017-09-20 13:03:18.656471651 +0100
@@ -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);
