Hi Willy, On Fri, Jul 24 2020, Willy Tarreau wrote: > On Fri, Jul 24, 2020 at 07:40:01AM +0200, Willy Tarreau wrote: >> On Fri, Jul 24, 2020 at 07:52:20AM +0300, Baruch Siach wrote: >> > 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 only when USE_DL is defined. >> >> Oh thank you, I've encountered it as well a few days ago while working >> on something else and forgot to note it on my todo list! However, I'm >> looking at the original commit which introduced this and it's almost a >> revert. We used to rely on USE_DL and turned it into __ELF__ because >> some platforms don't need USE_DL. >> >> I wanted to turn to sets of WANT/NEED/HAVE instead of the generic USE, >> and I think this one will be one of the first benefiting from this. I'll >> have a look at this. > > In order to make something less intrusive that may be backported to 2.2 > and 2.1, what do you think about this: > > -#ifdef __ELF__ > +#if (defined(__ELF__) && !defined(__linux__)) || defined(USE_DL) > > => __ELF__ is enough on all non-linux platforms > USE_DL is required on linux > > This would not change much from your patch and limit the scope of changes > for stable versions. If you can confirm that it works for you, I can adapt > your patch to do that and commit it (unless you prefer to send a v2, of > course).
I can confirm that the patch below also fixes the same build issue. Thanks, baruch diff --git a/src/tools.c b/src/tools.c index 1c664852ad73..21bb1efbeeb0 100644 --- a/src/tools.c +++ b/src/tools.c @@ -10,7 +10,7 @@ * */ -#ifdef __ELF__ +#if (defined(__ELF__) && !defined(__linux__)) || defined(USE_DL) #define _GNU_SOURCE #include <dlfcn.h> #include <link.h> @@ -4410,7 +4410,7 @@ const char *get_exec_path() return ret; } -#ifdef __ELF__ +#if (defined(__ELF__) && !defined(__linux__)) || defined(USE_DL) /* calls dladdr() or dladdr1() on <addr> and <dli>. If dladdr1 is available, * 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 * '/' 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 - * 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 * 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 }; -#ifdef __ELF__ +#if (defined(__ELF__) && !defined(__linux__)) || defined(USE_DL) Dl_info dli, dli_main; size_t size; 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 */ if (!dladdr_and_size(addr, &dli, &size)) 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)); return NULL; } -#endif /* __ELF__ */ +#endif /* __ELF__ && USE_DL */ unknown: /* unresolved symbol from the main file, report relative offset to main */ if ((void*)addr < (void*)main) -- ~. .~ Tk Open Systems =}------------------------------------------------ooO--U--Ooo------------{= - bar...@tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -