From: Willy Tarreau Date: Wed, 5 May 2021 07:06:21 +0000 (+0200) Subject: MINOR: tools: add functions to retrieve the address of a symbol X-Git-Tag: v2.4-dev19~145 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64192392c;p=thirdparty%2Fhaproxy.git MINOR: tools: add functions to retrieve the address of a symbol get_sym_curr_addr() will return the address of the first occurrence of the given symbol while get_sym_next_addr() will return the address of the next occurrence of the symbol. These ones return NULL on non-linux, non-ELF, non-USE_DL. --- diff --git a/include/haproxy/tools.h b/include/haproxy/tools.h index e09e17e644..92d5b70812 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 c103817780..056c9ca773 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: