From 64192392c45f40b2a4eb17900a6a638576e1fa67 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 5 May 2021 09:06:21 +0200 Subject: [PATCH] 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. --- include/haproxy/tools.h | 2 ++ src/tools.c | 43 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) 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: -- 2.39.5