kpatch/kpatch-build
Josh Poimboeuf 2e99d6b7a4 kpatch-build: build the kernel in ~/.kpatch/src again
Once upon a time, kpatch-build did the kernel build in three passes.
The extra pass was done without '-ffunction-sections -fdata-sections',
so it could produce the original vmlinux file.

At that time, there was no ~/.kpatch/obj directory.  The kernel was
built directly in ~/.kpatch/src.  Because the same directory was used
for both the original kernel build and the '-ffunction-sections
-fdata-sections' build, the entire tree had to be rebuilt twice for
every kpatch-build incantation, making it very slow.

That situation was improved with the following commit:

  5352d8b01a ("build objects in separate directory to fix caching")

That built the regular and special binaries in ~/.kpatch/obj and
~/.kpatch/obj2, respectively.

Since then we've simplified things so that it only does two build
passes: original and patched, both with '-ffunction-sections
-fdata-sections', and ~/.kpatch/obj2 was removed.  However,
~/.kpatch/obj still remained.  That's because we never had a reason to
change it, until now.

Recent commit aa2907df29 ("support dup file+symbol")
triggers a new warning:

  create-diff-object: ERROR: dynamic_debug.o: find_local_syms: 124: find_local_syms for dynamic_debug.c: found_none

This was actually a preexisting issue which that commit helped uncover.
The root issue is that dynamic_debug.c has some creative uses of the
`__FILE__` macro.  When building the kernel objects outside the source
tree, the macro results in a absolute path like:

  /home/jpoimboe/.kpatch/src/lib/dynamic_debug.c

But when building inside the source tree it's a relative path:

  lib/dynamic_debug.c

The Fedora kernel is built in-tree, and I would imagine most other
distros are also built that way.  So the way kpatch builds can result in
a slightly different 'original' object than the distro version, thanks
to the __FILE__ macro.

In this case, the order of the symbol table changed slightly between
vmlinux and the 'orig' object.  Presumably, the difference in string
lengths was enough to convince the compiler to shuffle things around a
bit.

So considering that bug, and the possibility of other mismatches, go
back to building the kernel in the source tree.
2017-03-03 11:29:21 -06:00
..
insn insn: get it to compile in create-diff-object 2014-05-30 15:19:57 -05:00
create-diff-object.c detect and ignore might_sleep line number changes 2017-02-14 16:34:48 -05:00
create-klp-module.c create-klp-module: add new program that creates patch modules that have klp elements 2017-01-23 12:43:31 -08:00
create-kpatch-module.c create-kpatch-module: add new program that creates kpatch modules 2017-01-23 12:43:34 -08:00
kpatch-build kpatch-build: build the kernel in ~/.kpatch/src again 2017-03-03 11:29:21 -06:00
kpatch-elf.c kpatch-elf: add find_rela_by_offset() 2017-01-23 12:43:27 -08:00
kpatch-elf.h kpatch-elf: add find_rela_by_offset() 2017-01-23 12:43:27 -08:00
kpatch-gcc kpatch-build: fix 'undefined reference to kpatch_shadow_*' errors 2016-12-05 20:22:11 -06:00
kpatch-intermediate.h kpatch-intermediate.h: fix comments 2017-01-23 22:42:25 -08:00
list.h new .fixup group size algorithm 2014-09-15 14:54:57 -05:00
log.h log: include error.h 2017-01-23 12:42:35 -08:00
lookup.c support dup file+symbol 2017-02-04 09:37:18 +08:00
lookup.h support dup file+symbol 2017-02-04 09:37:18 +08:00
Makefile create-kpatch-module: add new program that creates kpatch modules 2017-01-23 12:43:34 -08:00