Commit Graph

431 Commits

Author SHA1 Message Date
Seth Jennings
f8d00bd232 Merge pull request #550 from libin2015/fix-find-parent-obj
kpatch-build: fix find_parent_obj
2015-11-16 13:29:35 -06:00
Seth Jennings
3d49e37f11 Merge pull request #548 from libin2015/fix-gcc-version-check
kpatch-build: fix gcc_version_check
2015-11-16 13:15:41 -06:00
Seth Jennings
aab5240df8 Merge pull request #555 from jpoimboe/static
create-diff-object: more static local variable rework
2015-11-16 11:55:36 -06:00
Seth Jennings
c7fd8673e9 Merge pull request #554 from jpoimboe/section-sym-gah
create-diff-object: handle reference to end of section
2015-11-16 10:37:32 -06:00
Josh Poimboeuf
fffbb85b81 create-diff-object: handle reference to end of section
Deal with a special case where gcc needs a pointer to the address at the end of
a data section.

This is usually used with a compare instruction to determine when to end a
loop.  The code doesn't actually dereference the pointer so this is "normal"
and we just replace the section reference with a reference to the last symbol
in the section.

Note that this only catches the issue when it happens at the end of a section.
It can also happen in the middle of a section.  In that case, the wrong symbol
will be associated with the reference.  But that's ok because:

1) This situation only occurs when gcc is trying to get the address of the
   symbol, not the contents of its data; and

2) Because kpatch doesn't allow data sections to change, &(var1+sizeof(var1))
   will always be the same as &var2.

Fixes: #553
2015-11-13 16:42:40 -06:00
Josh Poimboeuf
ac9020af20 create-diff-object: more static local variable rework
Refine the static local variable handling again.  This builds on a
previous patch by Zhou Chengming.

This fixes the following bugs reported by Zhou:

1.          xxx.123 ---> xxx.123 (previous correlation by coincidence)
            xxx.256 ---> xxx.256 (previous correlation by coincidence)
   But real xxx.123 ---> xxx.256

   In this case, the code doesn't work. Because when find patched_sym for
   xxx.123, the xxx.256 in patched_object hasn't been de-correlated.

2. old-object | new-object
        func1 | func1
      xxx.123 | xxx.123 (inline)
        func2 | func2
      xxx.256 | xxx.256
      xxx.123 | xxx.123 (inline)

   When find patched_sym for xxx.123, first find xxx.123 in func1 of new-object,
   But then find xxx.256 in func2 of new-object.
   So I think should not iterate the base-sections, when find one, just go out to next symbol.

Both of these problems can be fixed by splitting the code up into
multiple passes:

  1. uncorrelate all static locals
  2. correlate all static locals
  3. ensure each static local is referenced by all the same sections in
     both objects
  4. print warning on any new static locals

Fixes: #545
2015-11-13 13:56:13 -06:00
Li Bin
9143e88f16 kpatch-build: fix find_parent_obj
When find kobj, it should use 'cat changed_objs' to get the changed
objects, in order to process the following object format:
a/b/c/../../object.o. If using patched dir to get changed object,
the object will be a/object.o, but it is a/b/c/../../object.o in
*.cmd file.
This patch also fix the find_parent_obj that change the format
'a/b/c/../../object.o' to 'a/object.o' in deep find, otherwise
it will fail with "two parent matches for *.o".

Signed-off-by: Li Bin <huawei.libin@huawei.com>
2015-11-13 14:24:37 +08:00
Josh Poimboeuf
d529091f3b kpatch-build: cleanup on SIGHUP
Fix an issue where kpatch-build fails to clean up after hitting CTRL-C
during a remote integration test (make remote).
2015-11-12 20:39:14 -06:00
Li Bin
9fedd0d283 kpatch-build: fix gcc_version_check
gcc version string format may be 'gcc (xxx xxx) x.x.x [xxx]'
fix gcc_version_check to adapt to it.

Signed-off-by: Li Bin <huawei.libin@huawei.com>
2015-11-13 08:19:50 +08:00
Josh Poimboeuf
5429b18750 kpatch-build: s/TMPBUILDROOT/RPMTOPDIR/ 2015-11-04 12:11:26 -06:00
Josh Poimboeuf
0dec5136ee kpatch-build: clean up rpmbuild tmp directory handling
Setting HOME in a subshell is too hacky.  Instead just pass the rpmbuild
directory to the rpm and rpmbuild commands.
2015-11-03 14:35:33 -06:00
Seth Jennings
b2eeb59b8a Merge pull request #542 from jpoimboe/kpatch-build-cleanups
fix a couple of minor kpatch-build issues
2015-11-03 14:09:40 -06:00
Josh Poimboeuf
b8bc7c2812 kpatch-build: fix tempsrc directory leak
Also rename it to tmphome to more accurately describe its purpose.
2015-11-03 13:55:56 -06:00
Josh Poimboeuf
686cc4ff52 kpatch-build: put log file in $CACHEDIR
Otherwise it gets removed along with TEMPDIR if '--debug' isn't set.
2015-11-03 13:52:47 -06:00
Evgenii Shatokhin
ad6581756e kpatch-build: fix searching for the sizes of special structures
readelf -wi may output trailing spaces in the lines with section names
('alt_instr', etc.). The regexps should take this into account,
otherwise kpatch-build may fail with error:
    "can't find special struct size"
2015-11-03 12:39:39 +03:00
Seth Jennings
045a983574 Merge pull request #536 from jpoimboe/static-local-rewrite
Rewrite static local variable correlation logic
2015-11-02 11:16:55 -06:00
Chris J Arges
aaa584a856 kpatch-build: edit script description
This script works on other distros and can target source linux directories.
Adjust comments to match this.

Signed-off-by: Chris J Arges <chris.j.arges@canonical.com>
2015-10-30 17:01:27 -05:00
Josh Poimboeuf
7c88c41cfe create-diff-object: rewrite static local variable correlation logic
Rewrite the static local variable correlation logic.  The algorithm now
traverses all the static locals in the original object rather than the
patched object, ensuring that each symbol in the original object has a
twin.  It adds a new restriction that static local variables can't be
removed.

This adds support for the following:

- Multiple static locals with the same name in the same function

- Two separate static locals which happen to have the same numbered
  suffix

- Static locals which are referenced by data sections

- CSWTCH and other static locals which are sometimes unused due to
  sharing of their data sections

Fixes: #514
2015-10-29 16:52:10 -05:00
Josh Poimboeuf
bbc35bc12e Revert "create-diff-object: strip unused CSWTCH symbols"
It turns out this is a more general issue which exists for more than
just CSWTCH symbols.  The new static local handling code will handle it.

This reverts commit fd0c1bbe9c.
2015-10-29 16:51:22 -05:00
Seth Jennings
2e4dea5236 Merge pull request #525 from euspectre/no-reloc-fix
kpatch-build: revisit checking for fentry calls
2015-10-28 20:49:56 -05:00
Josh Poimboeuf
fd0c1bbe9c create-diff-object: strip unused CSWTCH symbols
Fixes: #532
2015-10-28 18:52:32 -05:00
Josh Poimboeuf
98f892b273 Revert "create-diff-object: Ignore unused CSWTCH static local symbols"
This reverts commit ce7ed7007b.
2015-10-28 18:41:50 -05:00
Seth Jennings
46732a74d3 Merge pull request #529 from jpoimboe/CSWTCH
create-diff-object: Ignore unused CSWTCH static local symbols
2015-10-28 14:47:41 -05:00
Seth Jennings
79945c3253 Merge pull request #531 from jpoimboe/vdso
kpatch-gcc: update ignore list
2015-10-28 14:46:57 -05:00
Evgenii Shatokhin
393be6f8fc kpatch-build: revisit checking for fentry calls
create-diff-object now checks if the original functions have fentry calls.
If an original function to be affected by the patch does not have the
fentry call, it cannot be patched. Error is reported in that case.

kpatch_create_mcount_sections() now also takes into account if a changed
or a new function has fentry call. If it does, mcount record is
generated for it as before. If a changed or a new function has no fentry
call, it is not an error in this case.

All this fixes the following issues.

1. If an original function has no fentry call (e.g. a "notrace" function)
but the patched function has it, the original function can not be
patched, but it would only be detected when applying the patch.

2. kpatch_create_mcount_sections() crashed if a patched function had no
relocation at all.

I observed such crashes when experimenting with a modified version of
the patch "tcp_cubic: better follow cubic curve after idle period" in
CentOS 7 x64.

Besides that, for a function with the first instruction starting with
0x0f, it would be incorrectly detemined that the function had fentry call.
The first bytes of the function would be overwritten in that case.

3. create-diff-object output an error if a new (an added) function had
no fentry call. This restriction is not necessary.

v2:

* Moved the check for fentry calls after the call to
kpatch_compare_correlated_elements() and before info about the original
ELF file is destroyed. The original symbols are now checked there (via
sym->twin) rather than the patched ones.

* Removed an excessive error check.

Signed-off-by: Evgenii Shatokhin <eshatokhin@odin.com>
2015-10-28 20:49:50 +03:00
Seth Jennings
01006814d8 Merge pull request #526 from arges/addflags
kpatch-build: consolidate build-artifacts and place into CACHEDIR
2015-10-28 12:44:18 -05:00
Chris J Arges
d0c8f43656 kpatch-build: put build artifacts into cachedir
Build artifacts are stored in $CACHEDIR/tmp instead of /tmp. This includes
files such as the build log and the temp directories used to build the patch.

In addition, allow $CACHEDIR to be set as an environment variable.

Signed-off-by: Chris J Arges <chris.j.arges@canonical.com>
2015-10-28 11:56:07 -05:00
Josh Poimboeuf
d378b245e5 kpatch-gcc: add libstub to ignore list
The firmware libstub library isn't a part of the proper runtime kernel
and can be safely ignored.

Fixes: #518
2015-10-28 11:39:55 -05:00
Josh Poimboeuf
a1d6b0d00e kpatch-gcc: update vdso location for newer kernels
With recent kernels, the vdso code has moved from arch/x86/vdso to
arch/x86/entry/vdso.

Fixes: #530
2015-10-28 11:27:15 -05:00
Josh Poimboeuf
ce7ed7007b create-diff-object: Ignore unused CSWTCH static local symbols
Fixes #519.
2015-10-28 10:06:51 -05:00
Seth Jennings
e78222e635 Merge pull request #527 from jpoimboe/werror
create-diff-object: make all warnings into errors
2015-10-27 12:07:20 -05:00
Josh Poimboeuf
1704498471 kpatch-build: detect special section group sizes
Hard-coding the special section group sizes is unreliable.  Instead,
determine them dynamically by finding the related struct definitions in
the DWARF metadata.

Fixes #517.
Fixes #523.
2015-10-27 11:31:40 -05:00
Josh Poimboeuf
2899b5c23c create-diff-object: make all warnings into errors 2015-10-27 11:29:38 -05:00
Evgenii Shatokhin
7b9629fc0a kpatch-build: do not use -ffunction-sections for a patch module itself
-ffunction-sections and -fdata-sections are needed when building the
original and the patched kernels.

It is not necessary, however, to use these options when building a
patch module itself, its functions and data are OK in the sections they
are.

Let us remove these options from KCGLAGS after the kernels have been
built.
2015-10-21 21:13:23 +03:00
Seth Jennings
1cd59c6603 Merge pull request #512 from euspectre/kpatch-build-symvers-fixes
kpatch-build: a couple of symvers-related fixes
2015-10-20 09:57:11 -05:00
Evgenii Shatokhin
9df043bc2e kpatch-build: do not clobber ~/rpmbuild directory
If a source RPM is used to obtain the kernel sources, kpatch-build
executes rpmdev-setuptree to prepare ~/rpmbuild directory tree, installs
the source RPM there. Then it calls 'rpmbuild -bp' to prepare the
kernel source tree.

All this, however, may clobber the existing contents of ~/rpmbuild,
which is very inconvenient if one uses rpmbuild to build other packages.

To avoid that, I could not find a better way than to specify a fake home
directory (~/.kpatch/tempsrc) for that portion of kpatch-build. It seems,
neither rpmdev-setuptree nor rpm have appropriate options for that.

I put the affected commands into a subshell so that the changes in $HOME
could not propagate to other parts of kpatch-build.
2015-10-19 15:45:43 +03:00
Evgenii Shatokhin
d5e3e09428 kpatch-build: look for symvers file in /lib/modules/.../kpatch too
If kpatch core module is packaged in an RPM and the package is installed,
the likely location of the module and its symvers file is
/lib/modules/<kernel_version>/extra/kpatch/.

kpatch-build checks this location too now when looking for the .symvers
file. This is convenient for distributing the Kpatch tools as RPMs and
the like.

Signed-off-by: Evgenii Shatokhin <eshatokhin@odin.com>
2015-10-19 14:23:35 +03:00
Evgenii Shatokhin
cba3081d59 kpatch-build: use Module.symvers for the target kernel
Before this fix, kpatch-build looked for Module.symvers for the core
module built for the currently running kernel. So, if one tried to build
a patch module for a kernel, different from the current one, an error
would occur. This patch fixed the problem.

Signed-off-by: Evgenii Shatokhin <eshatokhin@odin.com>
2015-10-19 13:19:09 +03:00
Seth Jennings
d444caa907 Merge pull request #510 from libin2015/support-add-new-file-v2
kpatch-build: support adding new files in patch
2015-10-16 09:29:45 -05:00
Li Bin
ef76bd9cc9 kpatch-build: support adding new files in patch
Geting the changed objects from the patched dir, in order to support
adding new files in patch.

Signed-off-by: Li Bin <huawei.libin@huawei.com>
2015-10-16 17:26:24 +08:00
Li Bin
724cac2e36 kpatch-build: support patching weak function
Before this patch, if changed function is weak symbol, it is not
be allowed to create live patch, and it will trigger the following
error:
/usr/local/libexec/kpatch/create-diff-object: ERROR: ***.o:
kpatch_create_patches_sections: 2294: lookup_global_symbol ***

And if the changed function reference the weak symbol, when loading
the patch module will trigger the following error:
module kpatch-***: overflow in relocation type *** val 0
insmod: can't insert 'kpatch-***.ko': invalid module format

This patch fix it and add support for patching weak function.

Signed-off-by: Li Bin <huawei.libin@huawei.com>
2015-10-16 13:21:00 +08:00
Seth Jennings
c8b0f18aa9 Merge pull request #504 from libin2015/section-change-fix
kpatch-build: verify bss/data/init section change properly
2015-10-15 17:05:07 -05:00
Josh Poimboeuf
beeadb8fa5 Merge pull request #503 from libin2015/master
kpatch-build: fix typo s/.rela.kpatch.patches/.rela.kpatch.funcs
2015-10-15 12:12:04 -05:00
Li Bin
5cb6a46069 kpatch-build: verify bss/data/init section change properly
kpatch_verify_patchability can detect the change of .bss or .data or
.init section, but it must be processed before verify num_changed.
Otherwise, for example, if only .init section changed, it will fail
with 'no changed functions were found', but not 'unsupported section
change(s)'.

With this patch,
for .init section: .init section will not a bundled section, so if
the section changed, not sync the function status, kpatch_verify_patchability
will give 'changed section <secname> not selected for inclusion' and
'unsupported section change(s)' error.

for .bss/.data section: kpatch_verify_patchability will ensure not
including .data or .bss section, otherwise it will give 'data section
<secname> selected for inclusion' and 'unsupported section change(s)'
error.

Signed-off-by: Li Bin <huawei.libin@huawei.com>
2015-10-13 09:29:38 +08:00
Li Bin
2722978fd6 kpatch-build: fix typo s/.rela.kpatch.patches/.rela.kpatch.funcs
Fix the kpatch_create_dynamic_rela_sections:
s/.rela.kpatch.patches/.rela.kpatch.funcs

Signed-off-by: Li Bin <huawei.libin@huawei.com>
2015-10-13 08:31:32 +08:00
Zhou ChengMing
0f556245e2 bugfix: correlate the rela sections of bundled static variables
If a static variable is a pointer, it has rela section.

Example:
	static int *p = &a;
changed to:
	static int *p = &b;
so its rela section has changed.

Then this change of data should be found and report error.
But if we don't correlate its rela section, we won't
find this change.

Signed-off-by: Zhou ChengMing <zhouchengming1@outlook.com>
2015-09-25 08:14:59 -07:00
Louis Taylor
5875032241 Fix kpatch-build failure with srpm on centos
kpatch-build was failing on centos7 with

    mv: cannot stat '/home/vagrant/rpmbuild/BUILD/kernel-*/linux-3.10.0-229.el7.x86_64': No such file or directory

in the error log. This was due to the actual directory being named
linux-3.10.0-229.el7.centos.x86_64. This patch avoids this failure by
adding a wildcard before the arch.

Signed-off-by: Louis Taylor <louis@kragniz.eu>
2015-05-31 02:47:52 +01:00
Seth Jennings
e731530ffc ensure scmversion consistency across builds
Signed-off-by: Seth Jennings <sjenning@redhat.com>
2015-01-23 16:17:09 -06:00
Xie XiuQi
6b446cba67 create-diff-object: fix a potential overflow for rela type
rela.type should be unsigned int instead of unsighed char.

/usr/include/gelf.h:#define GELF_R_TYPE(info)   ELF64_R_TYPE (info)
/usr/include/elf.h:#define ELF64_R_TYPE(i)      ((i) & 0xffffffff)

Signed-off-by: Xie XiuQi <xiexiuqi@huawei.com>
2015-01-19 22:43:26 +08:00
Josh Poimboeuf
f0ab1caad1 Merge pull request #459 from ColinIanKing/master
Fix memory leak on dest buffer on early return path
2014-10-21 10:03:09 -05:00