]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: tools: add functions to retrieve the address of a symbol
authorWilly Tarreau <w@1wt.eu>
Wed, 5 May 2021 07:06:21 +0000 (09:06 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 5 May 2021 14:24:52 +0000 (16:24 +0200)
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
src/tools.c

index e09e17e644e53146022d8aaaccc3efc631383eca..92d5b7081241ced53eee67e06fa64d36457df630 100644 (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.
index c103817780dac352922eb046280e82017917d693..056c9ca77393c82c97a928e561dd9a2d01b1c7b2 100644 (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: