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.
This commit is contained in:
Willy Tarreau 2021-05-05 09:06:21 +02:00
parent d3a88c1c32
commit 64192392c4
2 changed files with 45 additions and 0 deletions

View File

@ -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.

View File

@ -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 <name>.
* 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 <name>
* 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 <buf> some indications about the symbol at address
* <addr> using the following form: