util: Try finding out application name using dladdr if available

This fixes getting the binary name in the Hurd, or any other port using
the GNU C library, but only in the case where the library is directly
linked to. Opening with dlopen will not work.

Change in v3: reorder header includes and definitions
Change in v2: use a weak reference to main, so that we
don't crash when main cannot be found.
This commit is contained in:
Felipe Sateler 2014-10-11 01:34:23 -03:00 committed by David Henningsson
parent c45c0b1490
commit 93c698c9fc
2 changed files with 25 additions and 0 deletions

View file

@ -580,6 +580,8 @@ AC_SYS_LARGEFILE
# Check for open64 to know if the current system does have open64() and similar functions # Check for open64 to know if the current system does have open64() and similar functions
AC_CHECK_FUNCS_ONCE([open64]) AC_CHECK_FUNCS_ONCE([open64])
AC_SEARCH_LIBS([dladdr], [dl], [HAVE_DLADDR=1], [HAVE_DLADDR=0])
AC_DEFINE(HAVE_DLADDR, [1], [Have dladdr?])
################################### ###################################
# External libraries # # External libraries #

View file

@ -64,6 +64,15 @@
#include "util.h" #include "util.h"
#if defined(HAVE_DLADDR) && defined(PA_GCC_WEAKREF)
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
#include <dlfcn.h>
static int _main() PA_GCC_WEAKREF(main);
#endif
char *pa_get_user_name(char *s, size_t l) { char *pa_get_user_name(char *s, size_t l) {
const char *p; const char *p;
char *name = NULL; char *name = NULL;
@ -218,6 +227,20 @@ char *pa_get_binary_name(char *s, size_t l) {
} }
#endif #endif
#if defined(HAVE_DLADDR) && defined(PA_GCC_WEAKREF)
{
Dl_info info;
if(_main) {
int err = dladdr(&_main, &info);
if (err != 0) {
char *p = pa_realpath(info.dli_fname);
if (p)
return p;
}
}
}
#endif
#if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME) #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)
{ {