From: Al Viro <viro@zeniv.linux.org.uk>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org,
"Eric W. Biederman" <ebiederm@xmission.com>,
David Howells <dhowells@redhat.com>,
Nicolas Pitre <nico@fluxnic.net>
Subject: [RFC][PATCHES] converting FDPIC coredumps to regsets
Date: Tue, 30 Jun 2020 05:36:41 +0100 [thread overview]
Message-ID: <20200630043641.GD2786714@ZenIV.linux.org.uk> (raw)
Conversion of ELF coredumps to regsets has not touched
ELF_FDPIC. Right now all architectures that support FDPIC have
regsets sufficient for switching it to regset-based coredumps. A bit
of backstory: original ELF (and ELF_FDPIC) coredumps reused the old
helpers used by a.out coredumps. These days a.out coredumps are gone;
we could remove the dead code, if not for several obstacles. And one
of those obstacles is ELF_FDPIC.
This series more or less reproduces the conversion done
by Roland for ELF coredumps. The branch is in
git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git #work.fdpic
and it's based on top of #regset.base there (just the introduction of
regset_get() wrapper for ->get(); nothing else from the regset series
is needed). Killing the old aout helpers is _not_ in this branch;
followup cleanups live separately.
First we need to sort out the mess with struct elf_prstatus,
though. It's used both for ELF and ELF_FDPIC coredumps, and it
contains a couple of fields under ifdef on CONFIG_BINFMT_ELF_FDPIC.
ELF is MMU-dependent and most, but not all configs that allow ELF_FDPIC
are non-MMU. ARM is an exception - there ELF_FDPIC is allowed both for
MMU and non-MMU configs. That's a problem - struct elf_prstatus is a
part of coredump layout, so ELF coredumps produced by arm kernels that
have ELF_FDPIC enabled are incompatible with those that have it disabled.
The obvious solution is to introduce struct elf_prstatus_fdpic
and use that in binfmt_elf_fdpic.c, taking these fields out of the
normal struct elf_prstatus. Unfortunately, the damn thing is defined in
include/uapi/linux/elfcore.h, so nominally it's a part of userland ABI.
However, not a single userland program actually includes linux/elfcore.h.
The reason is that the definition in there uses elf_gregset_t as a member,
and _that_ is not defined anywhere in the exported headers. It is defined
in (libc) sys/procfs.h, but the same file defines struct elf_prstatus
as well. So if you try to include linux/elfcore.h without having already
pulled sys/procfs.h, it'll break on incomplete type of a member. And if
you have pulled sys/procfs.h, it'll break on redefining a structure.
IOW, it's not usable and it never had been; as the matter of fact,
that's the reason sys/procfs.h had been introduced back in 1996.
1/7) unexport linux/elfcore.h
Takes it out of include/uapi/linux and moves the stuff that used
to live there into include/linux/elfcore.h
2/7) take fdpic-related parts of elf_prstatus out
Now we can take that ifdef out of the definition of elf_prstatus
(as well as compat_elf_prstatus) and put the variant with those extra
fields into binfmt_elf_fdpic.c, calling it elf_prstatus_fdpic there.
3/7) kill elf_fpxregs_t
All code dealing with it (both in elf_fdpic and non-regset side
of elf) is conditional upon ELF_CORE_COPY_XFPREGS. And no architectures
define that anymore. Take the dead code out.
4/7) [elf-fdpic] coredump: don't bother with cyclic list for per-thread
objects
5/7) [elf-fdpic] move allocation of elf_thread_status into
elf_dump_thread_status()
6/7) [elf-fdpic] use elf_dump_thread_status() for the dumper thread as well
Massaging fdpic coredump logics towards the regset side of
elf coredump.
7/7) [elf-fdpic] switch coredump to regsets
... and now we can switch from elf_core_copy_task_{,fp}regs()
to regset_get().
Diffstat:
arch/ia64/include/asm/elf.h | 2 -
arch/powerpc/include/asm/elf.h | 2 -
arch/x86/include/asm/elf.h | 2 -
fs/binfmt_elf.c | 30 ------
fs/binfmt_elf_fdpic.c | 205 ++++++++++++++++++-----------------------
include/linux/elfcore-compat.h | 4 -
include/linux/elfcore.h | 66 +++++++++++--
include/uapi/linux/elfcore.h | 101 --------------------
scripts/headers_install.sh | 1 -
usr/include/Makefile | 1 -
10 files changed, 146 insertions(+), 268 deletions(-)
next reply other threads:[~2020-06-30 4:36 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-30 4:36 Al Viro [this message]
2020-06-30 4:41 ` [PATCH 1/7] unexport linux/elfcore.h Al Viro
2020-06-30 4:41 ` [PATCH 2/7] take fdpic-related parts of elf_prstatus out Al Viro
2020-06-30 4:41 ` [PATCH 3/7] kill elf_fpxregs_t Al Viro
2020-06-30 4:41 ` [PATCH 4/7] [elf-fdpic] coredump: don't bother with cyclic list for per-thread objects Al Viro
2020-06-30 4:41 ` [PATCH 5/7] [elf-fdpic] move allocation of elf_thread_status into elf_dump_thread_status() Al Viro
2020-06-30 4:41 ` [PATCH 6/7] [elf-fdpic] use elf_dump_thread_status() for the dumper thread as well Al Viro
2020-06-30 4:41 ` [PATCH 7/7] [elf-fdpic] switch coredump to regsets Al Viro
2020-06-30 15:45 ` [RFC][PATCHES] converting FDPIC coredumps " Nicolas Pitre
2020-07-14 17:14 ` Eric W. Biederman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200630043641.GD2786714@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=dhowells@redhat.com \
--cc=ebiederm@xmission.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nico@fluxnic.net \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.