diff --git a/include/haproxy/tools.h b/include/haproxy/tools.h index e09e17e64..92d5b7081 100644 --- a/include/haproxy/tools.h +++ b/include/haproxy/tools.h @@ -1003,6 +1003,8 @@ void dump_hex(struct buffer *out, const char *pfx, const void *buf, int len, int int may_access(const void *ptr); const void *resolve_sym_name(struct buffer *buf, const char *pfx, const void *addr); const char *get_exec_path(); +void *get_sym_curr_addr(const char *name); +void *get_sym_next_addr(const char *name); /* Note that this may result in opening libgcc() on first call, so it may need * to have been called once before chrooting. diff --git a/src/tools.c b/src/tools.c index c10381778..056c9ca77 100644 --- a/src/tools.c +++ b/src/tools.c @@ -4740,7 +4740,50 @@ static int dladdr_and_size(const void *addr, Dl_info *dli, size_t *size) #endif return ret; } + +/* Tries to retrieve the address of the first occurrence symbol . + * Note that NULL in return is not always an error as a symbol may have that + * address in special situations. + */ +void *get_sym_curr_addr(const char *name) +{ + void *ptr = NULL; + +#ifdef RTLD_DEFAULT + ptr = dlsym(RTLD_DEFAULT, name); #endif + return ptr; +} + + +/* Tries to retrieve the address of the next occurrence of symbol + * Note that NULL in return is not always an error as a symbol may have that + * address in special situations. + */ +void *get_sym_next_addr(const char *name) +{ + void *ptr = NULL; + +#ifdef RTLD_NEXT + ptr = dlsym(RTLD_NEXT, name); +#endif + return ptr; +} + +#else /* elf & linux & dl */ + +/* no possible resolving on other platforms at the moment */ +void *get_sym_curr_addr(const char *name) +{ + return NULL; +} + +void *get_sym_next_addr(const char *name) +{ + return NULL; +} + +#endif /* elf & linux & dl */ /* Tries to append to buffer some indications about the symbol at address * using the following form: