MINOR: tools: use public interface for FreeBSD get_exec_path()

Where possible (FreeBSD 13+), use the public, documented interface to
the ELF auxiliary argument vector: elf_aux_info().

__elf_aux_vector is a private interface exported so that the runtime
linker can set its value during process startup and not intended for
public consumption.  In FreeBSD 15 it has been removed from libc and
moved to libsys.
This commit is contained in:
Brooks Davis 2024-02-28 18:12:40 +00:00 committed by Willy Tarreau
parent 3262c2ddcd
commit c03a023882

View File

@ -17,9 +17,14 @@
#endif
#if defined(__FreeBSD__)
#include <sys/param.h>
#if __FreeBSD_version < 1300058
#include <elf.h>
#include <dlfcn.h>
extern void *__elf_aux_vector;
#else
#include <sys/auxv.h>
#endif
#endif
#if defined(__NetBSD__)
@ -5018,6 +5023,7 @@ const char *get_exec_path()
if (execfn && execfn != ENOENT)
ret = (const char *)execfn;
#elif defined(__FreeBSD__)
#if __FreeBSD_version < 1300058
Elf_Auxinfo *auxv;
for (auxv = __elf_aux_vector; auxv->a_type != AT_NULL; ++auxv) {
if (auxv->a_type == AT_EXECPATH) {
@ -5025,6 +5031,14 @@ const char *get_exec_path()
break;
}
}
#else
static char execpath[MAXPATHLEN];
if (execpath[0] == '\0')
elf_aux_info(AT_EXECPATH, execpath, MAXPATHLEN);
if (execpath[0] != '\0')
ret = execpath;
#endif
#elif defined(__NetBSD__)
AuxInfo *auxv;
for (auxv = _dlauxinfo(); auxv->a_type != AT_NULL; ++auxv) {