mirror of
https://github.com/matrix-construct/construct
synced 2024-12-27 07:54:05 +01:00
ircd::mods: Propagate our own exception through ld.so.
This commit is contained in:
parent
008325d6e8
commit
090fda072b
3 changed files with 94 additions and 25 deletions
|
@ -134,6 +134,9 @@ if AIO
|
||||||
libircd_la_SOURCES += fs_aio.cc
|
libircd_la_SOURCES += fs_aio.cc
|
||||||
endif
|
endif
|
||||||
libircd_la_SOURCES += mods.cc
|
libircd_la_SOURCES += mods.cc
|
||||||
|
if LINUX
|
||||||
|
libircd_la_SOURCES += mods_dl.cc
|
||||||
|
endif
|
||||||
libircd_la_SOURCES += db_port.cc
|
libircd_la_SOURCES += db_port.cc
|
||||||
libircd_la_SOURCES += db_env.cc
|
libircd_la_SOURCES += db_env.cc
|
||||||
libircd_la_SOURCES += db.cc
|
libircd_la_SOURCES += db.cc
|
||||||
|
|
25
ircd/mods.cc
25
ircd/mods.cc
|
@ -40,31 +40,6 @@ ircd::mods::autoload
|
||||||
{ "persist", false },
|
{ "persist", false },
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
|
||||||
// (internal) dlsym hooker
|
|
||||||
//
|
|
||||||
|
|
||||||
extern "C" void *
|
|
||||||
__libc_dlsym(void *, const char *);
|
|
||||||
|
|
||||||
#ifdef IRCD_MODS_HOOK_DLSYM
|
|
||||||
extern "C" void *
|
|
||||||
dlsym(void *const handle,
|
|
||||||
const char *const symbol)
|
|
||||||
{
|
|
||||||
#ifdef RB_DEBUG_MODS_HOOK_DLSYM
|
|
||||||
ircd::log::debug
|
|
||||||
{
|
|
||||||
ircd::mods::log, "handle:%p symbol lookup '%s'",
|
|
||||||
handle,
|
|
||||||
symbol
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return __libc_dlsym(handle, symbol);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// mods::mod
|
// mods::mod
|
||||||
//
|
//
|
||||||
|
|
91
ircd/mods_dl.cc
Normal file
91
ircd/mods_dl.cc
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
// Matrix Construct
|
||||||
|
//
|
||||||
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
||||||
|
// Copyright (C) 2016-2019 Jason Volk <jason@zemos.net>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice is present in all copies. The
|
||||||
|
// full license for this software is available in the LICENSE file.
|
||||||
|
|
||||||
|
#include <RB_INC_LINK_H
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Symbolic dl-error redefinition to throw our C++ exception for the symbol
|
||||||
|
// lookup failure, during the lazy binding, directly from the callsite. THIS IS
|
||||||
|
// BETTER than the default glibc/elf/dl behavior of terminating the program.
|
||||||
|
//
|
||||||
|
// We probably need asynchronous-unwind-tables for an exception to safely
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
// glibc/sysdeps/generic/ldsodefs.h
|
||||||
|
struct dl_exception
|
||||||
|
{
|
||||||
|
const char *objname;
|
||||||
|
const char *errstring;
|
||||||
|
char *message_buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
_dl_exception_free(struct dl_exception *)
|
||||||
|
__attribute__ ((nonnull(1)));
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
__attribute__((noreturn))
|
||||||
|
_dl_signal_exception(int errcode,
|
||||||
|
struct dl_exception *e,
|
||||||
|
const char *occasion)
|
||||||
|
{
|
||||||
|
const ircd::unwind free
|
||||||
|
{
|
||||||
|
std::bind(_dl_exception_free, e)
|
||||||
|
};
|
||||||
|
|
||||||
|
ircd::log::derror
|
||||||
|
{
|
||||||
|
ircd::mods::log, "dynamic linker (%d) %s in `%s' :%s",
|
||||||
|
errcode,
|
||||||
|
occasion,
|
||||||
|
e->objname,
|
||||||
|
e->errstring
|
||||||
|
};
|
||||||
|
|
||||||
|
throw ircd::mods::error
|
||||||
|
{
|
||||||
|
"%s in %s (%d) %s",
|
||||||
|
occasion,
|
||||||
|
e->objname,
|
||||||
|
errcode,
|
||||||
|
e->errstring,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// symbolic dlsym hook
|
||||||
|
//
|
||||||
|
#ifdef IRCD_MODS_HOOK_DLSYM
|
||||||
|
|
||||||
|
extern "C" void *
|
||||||
|
__libc_dlsym(void *, const char *);
|
||||||
|
|
||||||
|
extern "C" void *
|
||||||
|
dlsym(void *const handle,
|
||||||
|
const char *const symbol)
|
||||||
|
{
|
||||||
|
#ifdef RB_DEBUG_MODS_HOOK_DLSYM
|
||||||
|
ircd::log::debug
|
||||||
|
{
|
||||||
|
ircd::mods::log, "handle:%p symbol lookup '%s'",
|
||||||
|
handle,
|
||||||
|
symbol
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return __libc_dlsym(handle, symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif IRCD_MODS_HOOK_DLSYM
|
Loading…
Reference in a new issue