MINOR: tools: add FreeBSD support to get_exec_path()

FreeBSD stores the absolute path into the auxiliary vector as well.
The auxiliary vector is found in __elf_aux_vector there.

(cherry picked from commit c4e5232db89786bdd12cf8d23cedd17a8c65770c)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/tools.c b/src/tools.c
index 7eaa743..2f3534d 100644
--- a/src/tools.c
+++ b/src/tools.c
@@ -16,6 +16,12 @@
 #include <link.h>
 #endif
 
+#if defined(__FreeBSD__)
+#include <elf.h>
+#include <dlfcn.h>
+extern void *__elf_aux_vector;
+#endif
+
 #if defined(__NetBSD__)
 #include <sys/exec_elf.h>
 #include <dlfcn.h>
@@ -4766,6 +4772,14 @@
 
 	if (execfn && execfn != ENOENT)
 		ret = (const char *)execfn;
+#elif defined(__FreeBSD__)
+	Elf_Auxinfo *auxv;
+	for (auxv = __elf_aux_vector; auxv->a_type != AT_NULL; ++auxv) {
+		if (auxv->a_type == AT_EXECPATH) {
+			ret = (const char *)auxv->a_un.a_ptr;
+			break;
+		}
+	}
 #elif defined(__NetBSD__)
 	AuxInfo *auxv;
 	for (auxv = _dlauxinfo(); auxv->a_type != AT_NULL; ++auxv) {