From: Joe Lawrence <joe.lawrence@redhat.com>
To: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
live-patching@vger.kernel.org,
Linux Kbuild mailing list <linux-kbuild@vger.kernel.org>
Subject: Re: [PATCH v4 03/10] livepatch: Add klp-convert tool
Date: Fri, 9 Aug 2019 14:42:53 -0400 [thread overview]
Message-ID: <20190809184253.GA31811@redhat.com> (raw)
In-Reply-To: <CAK7LNAToLyKSk9C0hwuMRxDK8yjJtghi_y6fH1p0+wK7N1wKow@mail.gmail.com>
On Wed, Jul 31, 2019 at 12:36:05PM +0900, Masahiro Yamada wrote:
> On Wed, Jul 31, 2019 at 11:50 AM Masahiro Yamada
> <yamada.masahiro@socionext.com> wrote:
> >
> > On Thu, May 9, 2019 at 11:39 PM Joe Lawrence <joe.lawrence@redhat.com> wrote:
> > >
> > > From: Josh Poimboeuf <jpoimboe@redhat.com>
> > >
> > > Livepatches may use symbols which are not contained in its own scope,
> > > and, because of that, may end up compiled with relocations that will
> > > only be resolved during module load. Yet, when the referenced symbols
> > > are not exported, solving this relocation requires information on the
> > > object that holds the symbol (either vmlinux or modules) and its
> > > position inside the object, as an object may contain multiple symbols
> > > with the same name. Providing such information must be done
> > > accordingly to what is specified in
> > > Documentation/livepatch/module-elf-format.txt.
> > >
> > > Currently, there is no trivial way to embed the required information
> > > as requested in the final livepatch elf object. klp-convert solves
> > > this problem in two different forms: (i) by relying on Symbols.list,
> > > which is built during kernel compilation, to automatically infer the
> > > relocation targeted symbol, and, when such inference is not possible
> > > (ii) by using annotations in the elf object to convert the relocation
> > > accordingly to the specification, enabling it to be handled by the
> > > livepatch loader.
> > >
> > > Given the above, create scripts/livepatch to hold tools developed for
> > > livepatches and add source files for klp-convert there.
> > >
> > > The core file of klp-convert is scripts/livepatch/klp-convert.c, which
> > > implements the heuristics used to solve the relocations and the
> > > conversion of unresolved symbols into the expected format, as defined
> > > in [1].
> > >
> > > klp-convert receives as arguments the Symbols.list file, an input
> > > livepatch module to be converted and the output name for the converted
> > > livepatch. When it starts running, klp-convert parses Symbols.list and
> > > builds two internal lists of symbols, one containing the exported and
> > > another containing the non-exported symbols. Then, by parsing the rela
> > > sections in the elf object, klp-convert identifies which symbols must
> > > be converted, which are those unresolved and that do not have a
> > > corresponding exported symbol, and attempts to convert them
> > > accordingly to the specification.
> > >
> > > By using Symbols.list, klp-convert identifies which symbols have names
> > > that only appear in a single kernel object, thus being capable of
> > > resolving these cases without the intervention of the developer. When
> > > various homonymous symbols exist through kernel objects, it is not
> > > possible to infer the right one, thus klp-convert falls back into
> > > using developer annotations. If these were not provided, then the tool
> > > will print a list with all acceptable targets for the symbol being
> > > processed.
> > >
> > > Annotations in the context of klp-convert are accessible as struct
> > > klp_module_reloc entries in sections named
> > > .klp.module_relocs.<objname>. These entries are pairs of symbol
> > > references and positions which are to be resolved against definitions
> > > in <objname>.
> > >
> > > Define the structure klp_module_reloc in
> > > include/linux/uapi/livepatch.h allowing developers to annotate the
> > > livepatch source code with it.
> > >
> > > klp-convert relies on libelf and on a list implementation. Add files
> > > scripts/livepatch/elf.c and scripts/livepatch/elf.h, which are a
> > > libelf interfacing layer and scripts/livepatch/list.h, which is a
> > > list implementation.
> > >
> > > Update Makefiles to correctly support the compilation of the new tool,
> > > update MAINTAINERS file and add a .gitignore file.
> > >
> > > [1] - Documentation/livepatch/module-elf-format.txt
> > >
> > > Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
> > > Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
> > > Signed-off-by: Joao Moreira <jmoreira@suse.de>
> > > Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
> > > ---
> > > MAINTAINERS | 1 +
> > > include/uapi/linux/livepatch.h | 5 +
> > > scripts/Makefile | 1 +
> > > scripts/livepatch/.gitignore | 1 +
> > > scripts/livepatch/Makefile | 7 +
> > > scripts/livepatch/elf.c | 753 ++++++++++++++++++++++++++++++++
> > > scripts/livepatch/elf.h | 73 ++++
> > > scripts/livepatch/klp-convert.c | 713 ++++++++++++++++++++++++++++++
> > > scripts/livepatch/klp-convert.h | 39 ++
> > > scripts/livepatch/list.h | 391 +++++++++++++++++
> > > 10 files changed, 1984 insertions(+)
> > > create mode 100644 scripts/livepatch/.gitignore
> > > create mode 100644 scripts/livepatch/Makefile
> > > create mode 100644 scripts/livepatch/elf.c
> > > create mode 100644 scripts/livepatch/elf.h
> > > create mode 100644 scripts/livepatch/klp-convert.c
> > > create mode 100644 scripts/livepatch/klp-convert.h
> > > create mode 100644 scripts/livepatch/list.h
> > >
> > > diff --git a/MAINTAINERS b/MAINTAINERS
> > > index 52842fa37261..c1587e1cc385 100644
> > > --- a/MAINTAINERS
> > > +++ b/MAINTAINERS
> > > @@ -9022,6 +9022,7 @@ F: arch/x86/kernel/livepatch.c
> > > F: Documentation/livepatch/
> > > F: Documentation/ABI/testing/sysfs-kernel-livepatch
> > > F: samples/livepatch/
> > > +F: scripts/livepatch/
> > > F: tools/testing/selftests/livepatch/
> > > L: live-patching@vger.kernel.org
> > > T: git git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching.git
> > > diff --git a/include/uapi/linux/livepatch.h b/include/uapi/linux/livepatch.h
> > > index e19430918a07..1c364d42d38e 100644
> > > --- a/include/uapi/linux/livepatch.h
> > > +++ b/include/uapi/linux/livepatch.h
> > > @@ -12,4 +12,9 @@
> > > #define KLP_RELA_PREFIX ".klp.rela."
> > > #define KLP_SYM_PREFIX ".klp.sym."
> > >
> > > +struct klp_module_reloc {
> > > + void *sym;
> > > + unsigned int sympos;
> > > +} __attribute__((packed));
> > > +
> > > #endif /* _UAPI_LIVEPATCH_H */
> > > diff --git a/scripts/Makefile b/scripts/Makefile
> > > index 9d442ee050bd..bf9ce74b70b0 100644
> > > --- a/scripts/Makefile
> > > +++ b/scripts/Makefile
> > > @@ -39,6 +39,7 @@ build_unifdef: $(obj)/unifdef
> > > subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
> > > subdir-$(CONFIG_MODVERSIONS) += genksyms
> > > subdir-$(CONFIG_SECURITY_SELINUX) += selinux
> > > +subdir-$(CONFIG_LIVEPATCH) += livepatch
> > >
> > > # Let clean descend into subdirs
> > > subdir- += basic dtc gdb kconfig mod package
> > > diff --git a/scripts/livepatch/.gitignore b/scripts/livepatch/.gitignore
> > > new file mode 100644
> > > index 000000000000..dc22fe4b6a5b
> > > --- /dev/null
> > > +++ b/scripts/livepatch/.gitignore
> > > @@ -0,0 +1 @@
> > > +klp-convert
> > > diff --git a/scripts/livepatch/Makefile b/scripts/livepatch/Makefile
> > > new file mode 100644
> > > index 000000000000..2842ecdba3fd
> > > --- /dev/null
> > > +++ b/scripts/livepatch/Makefile
> > > @@ -0,0 +1,7 @@
> > > +hostprogs-y := klp-convert
> > > +always := $(hostprogs-y)
> > > +
> > > +klp-convert-objs := klp-convert.o elf.o
> > > +
> > > +HOST_EXTRACFLAGS := -g -I$(INSTALL_HDR_PATH)/include -Wall
> >
> > This looks strange.
> >
> > Theoretically, you cannot include headers in $(INSTALL_HDR_PATH)/include
> > from host programs.
> >
> > headers_install works for the target architecture, not host architecture.
> > This may cause a strange result when you are cross-compiling the kernel.
> >
> > BTW, which header in $(INSTALL_HDR_PATH)/include do you need to include ?
> >
> >
> > Also, -Wall is redundant because it is set by the top-level Makefile.
>
>
> I deleted HOST_EXTRACFLAGS entirely,
> and I was still able to build klp-convert.
>
>
> What is the purpose of '-g' ?
> If it is only needed for local debugging,
> it should be removed from the upstream code, in my opinion.
>
HOST_EXTRACFLAGS looks like it was present in the patchset from the
early RFC days and inherited through each revision.
These are the files that the klp-convert code includes, mostly typical C
usercode headers like stdio.h and a few local headers like elf.h:
% grep -h '^#include' scripts/livepatch/*.{c,h} | sort -u
#include "elf.h"
#include <fcntl.h>
#include <gelf.h>
#include "klp-convert.h"
#include "list.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
If HOST_EXTRACFLAGS is really unneeded, we can easily drop it in the
next patchset version.
I haven't tried cross-compiling yet, but that is a good thing to note
for future testing.
Thanks,
-- Joe
next prev parent reply other threads:[~2019-08-09 18:42 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-09 14:38 [PATCH v4 00/10] klp-convert livepatch build tooling Joe Lawrence
2019-05-09 14:38 ` [PATCH v4 01/10] livepatch: Create and include UAPI headers Joe Lawrence
2019-05-09 14:38 ` [PATCH v4 02/10] kbuild: Support for Symbols.list creation Joe Lawrence
2019-05-21 13:48 ` Masahiro Yamada
2019-05-09 14:38 ` [PATCH v4 03/10] livepatch: Add klp-convert tool Joe Lawrence
2019-07-31 2:50 ` Masahiro Yamada
2019-07-31 3:36 ` Masahiro Yamada
2019-08-09 18:42 ` Joe Lawrence [this message]
2019-08-13 1:15 ` Masahiro Yamada
2019-05-09 14:38 ` [PATCH v4 04/10] livepatch: Add klp-convert annotation helpers Joe Lawrence
2019-05-09 14:38 ` [PATCH v4 05/10] modpost: Integrate klp-convert Joe Lawrence
2019-05-09 14:38 ` [PATCH v4 06/10] modpost: Add modinfo flag to livepatch modules Joe Lawrence
2019-07-31 5:58 ` Masahiro Yamada
2019-08-12 15:56 ` Joe Lawrence
2019-08-15 15:05 ` Masahiro Yamada
2019-08-16 8:19 ` Miroslav Benes
2019-08-16 12:43 ` Joe Lawrence
2019-08-16 19:01 ` Joe Lawrence
2019-08-19 3:50 ` Masahiro Yamada
2019-08-19 15:55 ` Joe Lawrence
2019-08-20 7:54 ` Miroslav Benes
2019-08-19 3:49 ` Masahiro Yamada
2019-08-19 7:31 ` Miroslav Benes
2019-08-19 16:02 ` Joe Lawrence
2019-08-22 3:35 ` Masahiro Yamada
2019-08-13 10:26 ` Miroslav Benes
2019-05-09 14:38 ` [PATCH v4 07/10] livepatch: Add sample livepatch module Joe Lawrence
2019-08-16 11:35 ` Masahiro Yamada
2019-08-16 12:47 ` Joe Lawrence
2019-05-09 14:38 ` [PATCH v4 08/10] documentation: Update on livepatch elf format Joe Lawrence
2019-05-09 14:38 ` [PATCH v4 09/10] livepatch/selftests: add klp-convert Joe Lawrence
2019-05-09 14:38 ` [PATCH v4 10/10] livepatch/klp-convert: abort on special sections Joe Lawrence
2019-06-13 13:00 ` [PATCH v4 00/10] klp-convert livepatch build tooling Miroslav Benes
2019-06-13 13:15 ` Joe Lawrence
2019-06-13 20:48 ` Joe Lawrence
2019-06-14 8:34 ` Petr Mladek
2019-06-14 14:20 ` Joe Lawrence
2019-06-14 16:36 ` Libor Pechacek
2019-06-25 11:36 ` Miroslav Benes
2019-06-25 13:24 ` Joe Lawrence
2019-06-25 19:08 ` Joe Lawrence
2019-06-26 10:27 ` Miroslav Benes
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=20190809184253.GA31811@redhat.com \
--to=joe.lawrence@redhat.com \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=live-patching@vger.kernel.org \
--cc=yamada.masahiro@socionext.com \
/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.