aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog30
-rw-r--r--bfd/elf-bfd.h8
-rw-r--r--bfd/elf-linux-core.h69
-rw-r--r--bfd/elf.c19
-rw-r--r--bfd/elf32-am33lin.c2
-rw-r--r--bfd/elf32-arm.c2
-rw-r--r--bfd/elf32-cris.c2
-rw-r--r--bfd/elf32-frv.c2
-rw-r--r--bfd/elf32-i386.c2
-rw-r--r--bfd/elf32-m32r.c2
-rw-r--r--bfd/elf32-m68k.c2
-rw-r--r--bfd/elf32-ppc.c64
-rw-r--r--bfd/elf32-s390.c2
-rw-r--r--bfd/elf32-sh.c2
-rw-r--r--bfd/elf32-sparc.c2
-rw-r--r--bfd/elfxx-target.h6
16 files changed, 135 insertions, 81 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index f2ad127..c25b281 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,35 @@
2017-10-11 Maciej W. Rozycki <macro@imgtec.com>
+ * 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.
+
+2017-10-11 Maciej W. Rozycki <macro@imgtec.com>
+
* elf-linux-core.h (elf_external_linux_prpsinfo64): Move the
`gap' member ahead of `pr_flag'.
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 399e298..4788fd0 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1557,6 +1557,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
@@ -2595,10 +2599,6 @@ extern char *elfcore_write_linux_prpsinfo32
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));
diff --git a/bfd/elf-linux-core.h b/bfd/elf-linux-core.h
index e904939..20eef9a 100644
--- a/bfd/elf-linux-core.h
+++ b/bfd/elf-linux-core.h
@@ -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);
diff --git a/bfd/elf.c b/bfd/elf.c
index c6de70d..4a150de 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -10466,11 +10466,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_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_out (abfd, prpsinfo, &data);
- return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
- &data, sizeof (data));
+ swap_linux_prpsinfo32_ugid32_out (abfd, prpsinfo, &data);
+ return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
+ &data, sizeof (data));
+ }
}
char *
diff --git a/bfd/elf32-am33lin.c b/bfd/elf32-am33lin.c
index 0cc1b2b..a37b3d3 100644
--- a/bfd/elf32-am33lin.c
+++ b/bfd/elf32-am33lin.c
@@ -102,4 +102,6 @@ elf32_am33lin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
#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"
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index f841da7..34b9e0c 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -19452,6 +19452,8 @@ elf32_arm_backend_symbol_processing (bfd *abfd, asymbol *sym)
#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. */
diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c
index 2661f2b..a4dc86f 100644
--- a/bfd/elf32-cris.c
+++ b/bfd/elf32-cris.c
@@ -4347,6 +4347,8 @@ elf_cris_got_elt_size (bfd *abfd ATTRIBUTE_UNUSED,
#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
diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c
index 971073c..7eb003e 100644
--- a/bfd/elf32-frv.c
+++ b/bfd/elf32-frv.c
@@ -6810,6 +6810,8 @@ elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
#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
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index ade1e7d..bcb219e 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -4587,6 +4587,8 @@ elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
#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. */
diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c
index d4e4423..78f9ac3 100644
--- a/bfd/elf32-m32r.c
+++ b/bfd/elf32-m32r.c
@@ -4015,6 +4015,8 @@ m32r_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
#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
diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c
index ab122fe..21bff66 100644
--- a/bfd/elf32-m68k.c
+++ b/bfd/elf32-m68k.c
@@ -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"
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index bfd7e06..ceae344 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -1821,56 +1821,6 @@ 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 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_Internal_Note *note)
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, ...)
{
diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c
index 91853ef..81e1a9d 100644
--- a/bfd/elf32-s390.c
+++ b/bfd/elf32-s390.c
@@ -4219,4 +4219,6 @@ elf32_s390_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
#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"
diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c
index 9967587..6ce34fe 100644
--- a/bfd/elf32-sh.c
+++ b/bfd/elf32-sh.c
@@ -7308,6 +7308,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"
diff --git a/bfd/elf32-sparc.c b/bfd/elf32-sparc.c
index 283f043..5baaf64 100644
--- a/bfd/elf32-sparc.c
+++ b/bfd/elf32-sparc.c
@@ -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. */
diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h
index 6efca84..a8b9770 100644
--- a/bfd/elfxx-target.h
+++ b/bfd/elfxx-target.h
@@ -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
@@ -895,7 +898,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. */