summaryrefslogtreecommitdiff
path: root/bfd/elfxx-target.h
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@imgtec.com>2017-10-11 15:01:41 +0100
committerMaciej W. Rozycki <macro@imgtec.com>2017-10-11 15:01:41 +0100
commit3c9a7b0d6d84425ea24d222a1a31e206e587374f (patch)
tree78ec2893e3f1867fe1a45ceac22d45315b81f0f2 /bfd/elfxx-target.h
parenta2f63b2e7a5da01ff828b45c7e0e57265ee24131 (diff)
downloadbinutils-gdb-3c9a7b0d6d84425ea24d222a1a31e206e587374f.tar.gz
ELF/BFD: Handle both variants of the 64-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 handle both variants of the 64-bit Linux core PRPSINFO note across all targets. The 64-bit Linux core PRPSINFO note matches the 64-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 64-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 the SuperH target. The default is already handled, as from the commit referred. Add the other variant then 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 SuperH target backend. This arrangement is analogous to how the 32-bit Linux core PRPSINFO note is handled. bfd/ * elf-bfd.h (elf_backend_data): Add `linux_prpsinfo64_ugid16' member. * elf-linux-core.h (elf_external_linux_prpsinfo64): Rename to... (elf_external_linux_prpsinfo64_ugid32): ... this. (swap_linux_prpsinfo32_out): Rename to... (swap_linux_prpsinfo32_ugid32_out): ... this. (elf_external_linux_prpsinfo64_ugid16): New structure. (swap_linux_prpsinfo64_ugid16_out): New function. * elfxx-target.h [!elf_backend_linux_prpsinfo64_ugid16] (elf_backend_linux_prpsinfo64_ugid16): Define. (elfNN_bed): Initialize `linux_prpsinfo64_ugid16' member. * elf.c (elfcore_write_linux_prpsinfo64): Handle both variants of the 64-bit Linux core PRPSINFO note. * elf64-sh64.c (elf_backend_linux_prpsinfo64_ugid16): Define.
Diffstat (limited to 'bfd/elfxx-target.h')
-rw-r--r--bfd/elfxx-target.h6
1 files changed, 5 insertions, 1 deletions
diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h
index a8b9770fdd1..ed185e77d2e 100644
--- a/bfd/elfxx-target.h
+++ b/bfd/elfxx-target.h
@@ -135,6 +135,9 @@
#ifndef elf_backend_linux_prpsinfo32_ugid16
#define elf_backend_linux_prpsinfo32_ugid16 FALSE
#endif
+#ifndef elf_backend_linux_prpsinfo64_ugid16
+#define elf_backend_linux_prpsinfo64_ugid16 FALSE
+#endif
#ifndef elf_backend_stack_align
#define elf_backend_stack_align 16
#endif
@@ -899,7 +902,8 @@ static struct elf_backend_data elfNN_bed =
elf_backend_caches_rawsize,
elf_backend_extern_protected_data,
elf_backend_always_renumber_dynsyms,
- elf_backend_linux_prpsinfo32_ugid16
+ elf_backend_linux_prpsinfo32_ugid16,
+ elf_backend_linux_prpsinfo64_ugid16
};
/* Forward declaration for use when initialising alternative_target field. */