From 3c9a7b0d6d84425ea24d222a1a31e206e587374f Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Wed, 11 Oct 2017 15:01:41 +0100 Subject: 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."), , 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 as 32-bit `unsigned int' by default, however overridden as 16-bit `unsigned short' in port-specific 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. --- bfd/elf.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'bfd/elf.c') diff --git a/bfd/elf.c b/bfd/elf.c index 4a150de..9cecb24 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -10489,11 +10489,22 @@ elfcore_write_linux_prpsinfo64 (bfd *abfd, char *buf, int *bufsiz, const struct elf_internal_linux_prpsinfo *prpsinfo) { - struct elf_external_linux_prpsinfo64 data; + if (get_elf_backend_data (abfd)->linux_prpsinfo64_ugid16) + { + struct elf_external_linux_prpsinfo64_ugid16 data; - swap_linux_prpsinfo64_out (abfd, prpsinfo, &data); - return elfcore_write_note (abfd, buf, bufsiz, - "CORE", NT_PRPSINFO, &data, sizeof (data)); + swap_linux_prpsinfo64_ugid16_out (abfd, prpsinfo, &data); + return elfcore_write_note (abfd, buf, bufsiz, + "CORE", NT_PRPSINFO, &data, sizeof (data)); + } + else + { + struct elf_external_linux_prpsinfo64_ugid32 data; + + swap_linux_prpsinfo64_ugid32_out (abfd, prpsinfo, &data); + return elfcore_write_note (abfd, buf, bufsiz, + "CORE", NT_PRPSINFO, &data, sizeof (data)); + } } char * -- cgit v1.1