BUILD: tools: fix build with static only toolchains

uClibc toolchains built with no dynamic library support don't provide
the dlfcn.h header. That leads to build failure:

  CC      src/tools.o
src/tools.c:15:10: fatal error: dlfcn.h: No such file or directory
 #include <dlfcn.h>
          ^~~~~~~~~
Enable dladdr on Linux platforms only when USE_DL is defined.

This should be backported wherever 109201fc5 ("BUILD: tools: rely on
__ELF__ not USE_DL to enable use of dladdr()") is backported (currently
only 2.2 and 2.1).
This commit is contained in:
Baruch Siach 2020-07-24 07:52:20 +03:00 committed by Willy Tarreau
parent 0f17a4444e
commit e1651b2970

View File

@ -10,7 +10,7 @@
* *
*/ */
#ifdef __ELF__ #if (defined(__ELF__) && !defined(__linux__)) || defined(USE_DL)
#define _GNU_SOURCE #define _GNU_SOURCE
#include <dlfcn.h> #include <dlfcn.h>
#include <link.h> #include <link.h>
@ -4410,7 +4410,7 @@ const char *get_exec_path()
return ret; return ret;
} }
#ifdef __ELF__ #if (defined(__ELF__) && !defined(__linux__)) || defined(USE_DL)
/* calls dladdr() or dladdr1() on <addr> and <dli>. If dladdr1 is available, /* calls dladdr() or dladdr1() on <addr> and <dli>. If dladdr1 is available,
* also returns the symbol size in <size>, otherwise returns 0 there. * also returns the symbol size in <size>, otherwise returns 0 there.
*/ */
@ -4444,7 +4444,7 @@ static int dladdr_and_size(const void *addr, Dl_info *dli, size_t *size)
* The file name (lib or executable) is limited to what lies between the last * The file name (lib or executable) is limited to what lies between the last
* '/' and the first following '.'. An optional prefix <pfx> is prepended before * '/' and the first following '.'. An optional prefix <pfx> is prepended before
* the output if not null. The file is not dumped when it's the same as the one * the output if not null. The file is not dumped when it's the same as the one
* that contains the "main" symbol, or when __ELF__ is not set. * that contains the "main" symbol, or when __ELF__ && USE_DL are not set.
* *
* The symbol's base address is returned, or NULL when unresolved, in order to * The symbol's base address is returned, or NULL when unresolved, in order to
* allow the caller to match it against known ones. * allow the caller to match it against known ones.
@ -4472,7 +4472,7 @@ const void *resolve_sym_name(struct buffer *buf, const char *pfx, void *addr)
#endif #endif
}; };
#ifdef __ELF__ #if (defined(__ELF__) && !defined(__linux__)) || defined(USE_DL)
Dl_info dli, dli_main; Dl_info dli, dli_main;
size_t size; size_t size;
const char *fname, *p; const char *fname, *p;
@ -4489,7 +4489,7 @@ const void *resolve_sym_name(struct buffer *buf, const char *pfx, void *addr)
} }
} }
#ifdef __ELF__ #if (defined(__ELF__) && !defined(__linux__)) || defined(USE_DL)
/* Now let's try to be smarter */ /* Now let's try to be smarter */
if (!dladdr_and_size(addr, &dli, &size)) if (!dladdr_and_size(addr, &dli, &size))
goto unknown; goto unknown;
@ -4529,7 +4529,7 @@ const void *resolve_sym_name(struct buffer *buf, const char *pfx, void *addr)
chunk_appendf(buf, "+%#lx", (long)(addr - dli.dli_fbase)); chunk_appendf(buf, "+%#lx", (long)(addr - dli.dli_fbase));
return NULL; return NULL;
} }
#endif /* __ELF__ */ #endif /* __ELF__ && !__linux__ || USE_DL */
unknown: unknown:
/* unresolved symbol from the main file, report relative offset to main */ /* unresolved symbol from the main file, report relative offset to main */
if ((void*)addr < (void*)main) if ((void*)addr < (void*)main)