Add utility lib with dlsym hooking

pull/139/head
jackun 4 years ago
parent ebdaa901b9
commit 934dc31e44
No known key found for this signature in database
GPG Key ID: 119DB3F1D05A9ED3

@ -1,8 +1,8 @@
#!/bin/sh
MANGOHUD_LIB_NAME="libMangoHud.so"
if [ "$MANGOHUD_NODLSYM" = "1" ]; then
MANGOHUD_LIB_NAME="libMangoHud_nodlsym.so"
if [ "$MANGOHUD_DLSYM" = "1" ]; then
MANGOHUD_LIB_NAME="libMangoHud_dlsym.so:${MANGOHUD_LIB_NAME}"
fi
if [ "$#" -eq 0 ]; then

@ -185,6 +185,8 @@ install() {
/usr/bin/install -vm644 -D ./build/release/usr/lib/mangohud/lib32/libMangoHud.so /usr/lib/mangohud/lib32/libMangoHud.so
/usr/bin/install -vm644 -D ./build/release/usr/lib/mangohud/lib64/libMangoHud.so /usr/lib/mangohud/lib64/libMangoHud.so
/usr/bin/install -vm644 -D ./build/release/usr/lib/mangohud/lib32/libMangoHud_dlsym.so /usr/lib/mangohud/lib32/libMangoHud_dlsym.so
/usr/bin/install -vm644 -D ./build/release/usr/lib/mangohud/lib64/libMangoHud_dlsym.so /usr/lib/mangohud/lib64/libMangoHud_dlsym.so
/usr/bin/install -vm644 -D ./build/release/usr/share/vulkan/implicit_layer.d/MangoHud.x86.json /usr/share/vulkan/implicit_layer.d/MangoHud.x86.json
/usr/bin/install -vm644 -D ./build/release/usr/share/vulkan/implicit_layer.d/MangoHud.x86_64.json /usr/share/vulkan/implicit_layer.d/MangoHud.x86_64.json
/usr/bin/install -vm644 -D ./build/release/usr/share/doc/mangohud/MangoHud.conf.example /usr/share/doc/mangohud/MangoHud.conf.example

@ -84,7 +84,7 @@ static std::array<const func_ptr, 1> name_to_funcptr_map = {{
#undef ADD_HOOK
}};
void *find_egl_ptr(const char *name)
EXPORT_C_(void *) mangohud_find_egl_ptr(const char *name)
{
if (is_blacklisted())
return nullptr;
@ -100,7 +100,7 @@ void *find_egl_ptr(const char *name)
EXPORT_C_(void *) eglGetProcAddress(const char* procName) {
//std::cerr << __func__ << ": " << procName << std::endl;
void* func = find_egl_ptr(procName);
void* func = mangohud_find_egl_ptr(procName);
if (func)
return func;

@ -200,7 +200,7 @@ static std::array<const func_ptr, 9> name_to_funcptr_map = {{
#undef ADD_HOOK
}};
void *find_glx_ptr(const char *name)
EXPORT_C_(void *) mangohud_find_glx_ptr(const char *name)
{
if (is_blacklisted())
return nullptr;
@ -216,7 +216,7 @@ void *find_glx_ptr(const char *name)
EXPORT_C_(void *) glXGetProcAddress(const unsigned char* procName) {
//std::cerr << __func__ << ":" << procName << std::endl;
void* func = find_glx_ptr( (const char*)procName );
void* func = mangohud_find_glx_ptr( (const char*)procName );
if (func)
return func;
@ -226,7 +226,7 @@ EXPORT_C_(void *) glXGetProcAddress(const unsigned char* procName) {
EXPORT_C_(void *) glXGetProcAddressARB(const unsigned char* procName) {
//std::cerr << __func__ << ":" << procName << std::endl;
void* func = find_glx_ptr( (const char*)procName );
void* func = mangohud_find_glx_ptr( (const char*)procName );
if (func)
return func;

@ -0,0 +1,37 @@
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include "real_dlsym.h"
EXPORT_C_(void*) dlsym(void * handle, const char * name)
{
void *(*find_glx_ptr)(const char *name) = nullptr;
void *(*find_egl_ptr)(const char *name) = nullptr;
if (!find_glx_ptr)
find_glx_ptr = reinterpret_cast<decltype(find_glx_ptr)> (real_dlsym(RTLD_NEXT, "mangohud_find_glx_ptr"));
if (!find_egl_ptr)
find_egl_ptr = reinterpret_cast<decltype(find_egl_ptr)> (real_dlsym(RTLD_NEXT, "mangohud_find_egl_ptr"));
void* func = nullptr;
if (find_glx_ptr) {
func = find_glx_ptr(name);
if (func) {
//fprintf(stderr,"%s: local: %s\n", __func__ , name);
return func;
}
}
if (find_egl_ptr) {
func = find_egl_ptr(name);
if (func) {
//fprintf(stderr,"%s: local: %s\n", __func__ , name);
return func;
}
}
//fprintf(stderr,"%s: foreign: %s\n", __func__ , name);
return real_dlsym(handle, name);
}

@ -140,6 +140,29 @@ vklayer_mesa_overlay = shared_library(
install : true
)
mangohud_dlsym = shared_library(
'MangoHud_dlsym',
files(
'elfhacks.cpp',
'real_dlsym.cpp',
'hook_dlsym.cpp',
),
c_args : [
pre_args,
c_vis_args,
no_override_init_args,
],
cpp_args : [
pre_args,
cpp_vis_args,
],
dependencies : [dep_dl],
include_directories : [inc_common],
link_args : cc.get_supported_link_arguments(['-Wl,-Bsymbolic-functions', '-Wl,-z,relro', '-Wl,--exclude-libs,ALL']),
install_dir : libdir_mangohud,
install : true
)
configure_file(input : 'mangohud.json.in',
output : '@0@.@1@.json'.format(meson.project_name(), target_machine.cpu_family()),
configuration : {'libdir_mangohud' : libdir_mangohud + '/',

@ -91,21 +91,21 @@ void* get_proc_address(const char* name) {
}
#ifdef HOOK_DLSYM
extern void *find_glx_ptr(const char *name);
extern void *find_egl_ptr(const char *name);
EXPORT_C_(void *) mangohud_find_glx_ptr(const char *name);
EXPORT_C_(void *) mangohud_find_egl_ptr(const char *name);
EXPORT_C_(void*) dlsym(void * handle, const char * name)
{
void* func = nullptr;
#ifdef HAVE_X11
func = find_glx_ptr(name);
func = mangohud_find_glx_ptr(name);
if (func) {
//fprintf(stderr,"%s: local: %s\n", __func__ , name);
return func;
}
#endif
func = find_egl_ptr(name);
func = mangohud_find_egl_ptr(name);
if (func) {
//fprintf(stderr,"%s: local: %s\n", __func__ , name);
return func;

Loading…
Cancel
Save