Detailed description is in the internals.
All the job is done by the libcare-ctl
. It is called doctor
hereafter
and the targets of operations are thus called patients
.
The doctor accepts a few arguments that are common for all types of operations:
-v | enable verbose output |
-h | show commands list |
The patch
mode patches a process with ID given as an argument to -p
option
or all of them except self and init
when the argument is all
. The patch
(or directory with patches) to be applied should be specified as the only
positional argument:
$ libcare-ctl patch -p <PID_or_all> some_patch_file.kpatch
The patches are basically ELF files of relocatable type REL
with binary
meta-information such as BuildID and name of the patch target prepended.
Loading patches is thus a lot like loading a shared object (library)
into a process. Except we are puppeting it by strings going through a
keyhole in other process' memory.
First, the memory near the original object is allocated, then all the relocations and symbols are resolved in a local copy of patch content. This pre-baked patch is copied to the patient's memory and, finally, original functions are overwritten with the unconditional jumps to the patched version.
For more details look at the Patching.
The unpatch
mode makes doctor remove patches listed by target BuildID from
the patients' memory. It simply restores the original code of the patched
functions from a stash allocated along with the patch and puppets patients to
munmap
the memory areas used by patches.
The last entry to the libcare-ctl
is the info
command that lists all
the objects and their BuildIDs for the set of the processes requested. Its
primary use is as the utility for the book-keeping software.
Since patches to the objects such as libraries can be updated, there is a way to
distinguish them, called patchlevel
. This information is parsed
from the layout of the directory where the patches are stored. If on
patching stage a patch with a bigger patchlevel
is found, the old one is
removed and the new one is applied.