#ifndef UCM_UTIL_RELOC_H_
#define UCM_UTIL_RELOC_H_
#include <ucs/datastruct/list.h>
#include <ucs/type/status.h>
#include <ucm/util/log.h>
#include <dlfcn.h>
typedef struct ucm_reloc_patch {
const char *symbol;
void *value;
void *prev_value;
ucs_list_link_t list;
char **blacklist;
} ucm_reloc_patch_t;
ucs_status_t ucm_reloc_modify(ucm_reloc_patch_t* patch);
static void* UCS_F_MAYBE_UNUSED
ucm_reloc_get_orig(const char *symbol, void *replacement)
{
const char *error;
void *func_ptr;
func_ptr = dlsym(RTLD_NEXT, symbol);
if (func_ptr == NULL) {
(void)dlerror();
func_ptr = dlsym(RTLD_DEFAULT, symbol);
if (func_ptr == replacement) {
error = dlerror();
ucm_fatal("could not find address of original %s(): %s", symbol,
error ? error : "Unknown error");
}
}
ucm_debug("original %s() is at %p", symbol, func_ptr);
return func_ptr;
}
#endif