parlib: Fix dlopen() with -rdynamic
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 30 Aug 2017 17:20:48 +0000 (13:20 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 30 Aug 2017 17:51:41 +0000 (13:51 -0400)
commit23833dc15246606497934ab49ea36fb5b4eca6a1
tree75e6e8cccdeac1e67418e6179b620cd43e5a0aaf
parent433b282f05aa731daed96ff0c6686e90d7527aed
parlib: Fix dlopen() with -rdynamic

Part 3 of trying to fix shared objects, following up on commit c77d5ade84b7
("parlib: Fix fake parlib detection for dlopen() (XCC)").

If we use -rdynamic, all symbols from the binary (e.g. hello.c) will
override functions in the .so.  For instance, __in_fake_parlib() and
vcore_lib_init() will be from the binary, not the .so, even when we're
running the library's ctors.

The fix is relatively simple: __in_fake_parlib() is a static inline, which
won't give the opportunity for the .so to link against a global version,
since there is no global version.

For the ctors, we actually could leave vcore_lib_init() as a global ctor,
since it can safely be called multiple times.  But that's a little sloppy
and confusing - I wondered for a little while why vcore_lib_init() ran from
hello, while uthread_lib_init() was run from within the .so.  static vs
global.  We still need the guts vcore_lib_init() to be in a header for
uthread.c, so the sanest thing was to just split it up.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/alarm.c
user/parlib/include/parlib/vcore.h
user/parlib/panic.c
user/parlib/uthread.c
user/parlib/vcore.c
user/parlib/vcore_tick.c