[pulseaudio-discuss] [PATCH] util: Try finding out application name using dladdr if available

Felipe Sateler fsateler at debian.org
Wed Sep 10 06:03:36 PDT 2014


On Wed, Sep 10, 2014 at 4:37 AM, David Henningsson
<david.henningsson at canonical.com> wrote:
>
>
> On 2014-08-30 02:00, Felipe Sateler wrote:
>>
>> 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.
>
>
> Hi Felipe,
>
> Do you recognise this code would help something else than hurd? If not, I
> think it would be safer to other OSes and compilers to have everything you
> add inside an "ifdef hurd" section.

In theory, it helps, in practice it doesn't. This should work with any
glibc-based build. However, at the moment there are only linux (with
other code path), kfreebsd (same) and hurd (addressed by this patch)
systems using glibc. I heard some people were trying to build a debian
GNU/Minix, but I don't think they have gone very far yet.

>
> If it would help other OSes, at least the
>
> #ifndef _GNU_SOURCE
> #define _GNU_SOURCE 1
> #endif
>
> and
>
> #include <dlfcn.h>
>
> ...should be inside "#if defined(HAVE_DLADDR) && defined(PA_GCC_WEAKREF)"
> quotes just like the rest of code you add, preferable all in one section,
> like this:
>
>
> #if defined(HAVE_DLADDR) && defined(PA_GCC_WEAKREF)
>  /* This makes pa_get_binary_name work on Hurd */
> #ifndef _GNU_SOURCE
> #define _GNU_SOURCE 1
> #endif
> #include <dlfcn.h>
> static int _main() PA_GCC_WEAKREF(main);
> #endif
>

OK, will do this.

>>
>> Change since last version: use a weak reference to main, so that we
>> don't crash when main cannot be found.
>> ---
>>   configure.ac     |  2 ++
>>   src/pulse/util.c | 24 ++++++++++++++++++++++++
>>   2 files changed, 26 insertions(+)
>>
>> diff --git a/configure.ac b/configure.ac
>> index 7b56210..e8e2034 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -580,6 +580,8 @@ AC_SYS_LARGEFILE
>>   # Check for open64 to know if the current system does have open64() and
>> similar functions
>>   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         #
>> diff --git a/src/pulse/util.c b/src/pulse/util.c
>> index ace698c..9b76661 100644
>> --- a/src/pulse/util.c
>> +++ b/src/pulse/util.c
>> @@ -24,6 +24,10 @@
>>   #include <config.h>
>>   #endif
>>
>> +#ifndef _GNU_SOURCE
>> +#define _GNU_SOURCE 1
>> +#endif
>> +
>>   #include <errno.h>
>>   #include <limits.h>
>>   #include <stdio.h>
>> @@ -32,6 +36,7 @@
>>   #include <time.h>
>>   #include <unistd.h>
>>   #include <sys/types.h>
>> +#include <dlfcn.h>
>>
>>   #ifdef HAVE_PWD_H
>>   #include <pwd.h>
>> @@ -64,6 +69,10 @@
>>
>>   #include "util.h"
>>
>> +#if defined(HAVE_DLADDR) && defined(PA_GCC_WEAKREF)
>> +static int _main() PA_GCC_WEAKREF(main);
>> +#endif
>> +
>>   char *pa_get_user_name(char *s, size_t l) {
>>       const char *p;
>>       char *name = NULL;
>> @@ -218,6 +227,21 @@ char *pa_get_binary_name(char *s, size_t l) {
>>       }
>>   #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;
>> +                }
>
>
> Unnecessary parenthesis around "return p".

Oops, will fix.

>
>> +            }
>> +        }
>> +    }
>> +#endif
>> +
>>   #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)
>>       {
>>
>>
>


-- 

Saludos,
Felipe Sateler


More information about the pulseaudio-discuss mailing list