linuxhooking/ugtrain: introduce PIE support

Some Linux distributions use the GCC options -pie and -fPIE
by default for hardened security. Together with ASLR, the binary
is loaded each execution to another memory location. So we have to
find out that memory location and use it as an offset. This
applies to code addresses on the stack and static memory as well.

The kernel knows about the location in /proc/$pid/maps. As we have
to fork in order to read from that file, we also have to remove
libmemdisc/hack from LD_PRELOAD. This also helps us hiding from the
game process that libmemdisc/hack is preloaded. ;-)

Finding this out also involved a lot of debugging which can be
simplified and unified between libmemdisc and libmemhack by
introducing pr_dbg(), pr_out() and pr_err() in new files
libcommon.[ch]. We always need the prefix to show that this is
neither game output nor ugtrain output. So we do it similar to the
Linux kernel and define some print helpers.

pr_dbg() is printf(PFX ...) and is not compiled by default.
pr_out() is fprintf(stdout, PFX ...).
pr_err() is fprintf(stderr, PFX ...).
ugtrain: rework config entry type and value handling

Current state is that we use the three type values is_signed,
is_float and size separately for value entries and check entries
in the config. The values are used as an i64 value which is
casted into the real data type. This is quite complex and can be
improved for better performance as well as readability.

So put the type values into a separate structure and use it as a
function parameter whenever different behavior depending on the
type is required. Also replace i64 values with an 8 byte union
'value_t' (scanmem uses the same). This avoids a lot of casting
within the hot path.
ugtrain: also use value buffers as value_t

This allows us to reduce casting even more and to get rid of a lot
of memcpy() calls.
libmemdisc: fix input parsing of first semicolon