mirror of
https://github.com/matrix-construct/construct
synced 2024-11-25 00:02:34 +01:00
ircd::mods::ldso: Improve interposition of exceptions for runtime behavior switching.
This commit is contained in:
parent
d5302087bc
commit
830a5b9d2a
3 changed files with 60 additions and 7 deletions
|
@ -25,6 +25,7 @@ extern "C"
|
||||||
namespace ircd::mods::ldso
|
namespace ircd::mods::ldso
|
||||||
{
|
{
|
||||||
struct info;
|
struct info;
|
||||||
|
struct exceptions;
|
||||||
|
|
||||||
IRCD_EXCEPTION(mods::error, error)
|
IRCD_EXCEPTION(mods::error, error)
|
||||||
IRCD_EXCEPTION(error, not_found);
|
IRCD_EXCEPTION(error, not_found);
|
||||||
|
@ -73,3 +74,27 @@ struct ircd::mods::ldso::info
|
||||||
info(const void *const &addr);
|
info(const void *const &addr);
|
||||||
info() = default;
|
info() = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ircd::mods::ldso::exceptions
|
||||||
|
{
|
||||||
|
static bool enable;
|
||||||
|
const bool theirs;
|
||||||
|
|
||||||
|
public:
|
||||||
|
exceptions(const bool enable = true);
|
||||||
|
~exceptions() noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline
|
||||||
|
ircd::mods::ldso::exceptions::exceptions(const bool ours)
|
||||||
|
:theirs{enable}
|
||||||
|
{
|
||||||
|
enable = ours;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
ircd::mods::ldso::exceptions::~exceptions()
|
||||||
|
noexcept
|
||||||
|
{
|
||||||
|
enable = theirs;
|
||||||
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ AM_LDFLAGS = \
|
||||||
-Wl,--wrap=pthread_clockjoin_np \
|
-Wl,--wrap=pthread_clockjoin_np \
|
||||||
-Wl,--wrap=pthread_self \
|
-Wl,--wrap=pthread_self \
|
||||||
-Wl,--wrap=pthread_setname_np \
|
-Wl,--wrap=pthread_setname_np \
|
||||||
|
-Wl,--wrap=_dl_signal_exception \
|
||||||
-Wl,-z,nodelete \
|
-Wl,-z,nodelete \
|
||||||
-Wl,-z,nodlopen \
|
-Wl,-z,nodlopen \
|
||||||
-Wl,-z,lazy \
|
-Wl,-z,lazy \
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
#include <RB_INC_DLFCN_H
|
#include <RB_INC_DLFCN_H
|
||||||
#include <RB_INC_LINK_H
|
#include <RB_INC_LINK_H
|
||||||
|
|
||||||
|
#include "mods.h"
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// dlfcn suite
|
// dlfcn suite
|
||||||
|
@ -308,7 +310,12 @@ ircd::mods::ldso::fullname(const struct link_map &map)
|
||||||
// transit from here through libdl and out of a random PLT slot. non-call-
|
// transit from here through libdl and out of a random PLT slot. non-call-
|
||||||
// exceptions does not appear to be necessary, at least for FUNC symbols.
|
// exceptions does not appear to be necessary, at least for FUNC symbols.
|
||||||
//
|
//
|
||||||
#if defined(HAVE_DLFCN_H)
|
|
||||||
|
decltype(ircd::mods::ldso::exceptions::enable)
|
||||||
|
ircd::mods::ldso::exceptions::enable
|
||||||
|
{
|
||||||
|
true
|
||||||
|
};
|
||||||
|
|
||||||
// glibc/sysdeps/generic/ldsodefs.h
|
// glibc/sysdeps/generic/ldsodefs.h
|
||||||
struct dl_exception
|
struct dl_exception
|
||||||
|
@ -326,11 +333,32 @@ extern "C" void
|
||||||
__attribute__((noreturn))
|
__attribute__((noreturn))
|
||||||
_dl_signal_exception(int, struct dl_exception *, const char *);
|
_dl_signal_exception(int, struct dl_exception *, const char *);
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
__real__dl_signal_exception(int, struct dl_exception *, const char *);
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
__attribute__((noreturn))
|
__attribute__((noreturn))
|
||||||
_dl_signal_exception(int errcode,
|
ircd_dl_signal_exception(int, struct dl_exception *, const char *);
|
||||||
struct dl_exception *e,
|
|
||||||
const char *occasion)
|
extern "C" void
|
||||||
|
__wrap__dl_signal_exception(int errcode,
|
||||||
|
struct dl_exception *e,
|
||||||
|
const char *occasion)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_DLFCN_H)
|
||||||
|
if(ircd::mods::ldso::exceptions::enable)
|
||||||
|
return ircd_dl_signal_exception(errcode, e, occasion);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__real__dl_signal_exception(errcode, e, occasion);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(HAVE_DLFCN_H)
|
||||||
|
extern "C" void
|
||||||
|
__attribute__((noreturn))
|
||||||
|
ircd_dl_signal_exception(int errcode,
|
||||||
|
struct dl_exception *e,
|
||||||
|
const char *occasion)
|
||||||
{
|
{
|
||||||
using namespace ircd;
|
using namespace ircd;
|
||||||
|
|
||||||
|
@ -346,7 +374,7 @@ _dl_signal_exception(int errcode,
|
||||||
errcode,
|
errcode,
|
||||||
occasion,
|
occasion,
|
||||||
e->objname,
|
e->objname,
|
||||||
e->errstring
|
e->errstring,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const auto &undefined_symbol_prefix
|
static const auto &undefined_symbol_prefix
|
||||||
|
@ -379,8 +407,7 @@ _dl_signal_exception(int errcode,
|
||||||
e->errstring,
|
e->errstring,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
#endif // defined(HAVE_DLFCN_H)
|
||||||
#endif // defined(HAVE_DLFCN_H
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in a new issue