[PATCH] libdwfl: use GNU strerror_r only when available.

Érico Nogueira ericonr@disroot.org
Mon Feb 1 23:38:25 GMT 2021


Em 01/02/2021 18:35, Mark Wielaard escreveu:
> Hi Érico,
> 
> On Mon, Feb 01, 2021 at 03:56:26PM -0300, Érico Nogueira via Elfutils-devel wrote:
>> Some C libraries don't provide the GNU version of strerror_r, only the
>> XSI-compliant one. We use the GNU version when available, since it fits
>> the code better, and otherwise use the XSI-compliant one.
> 
> Could you also mention this bug in the commit message?
> https://sourceware.org/bugzilla/show_bug.cgi?id=21010

Will do!

> 
>> If possible, I'd like to get this patch in before the release, otherwise
>> it's an easy one to carry locally.
> 
> One other comment, but this looks good to go otherwise.
> 
>> diff --git a/configure.ac b/configure.ac
>> index 346ab800..baf6faf5 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -428,6 +428,18 @@ AC_CHECK_DECLS([mempcpy],[],[],
>>   
>>   AC_CHECK_FUNCS([process_vm_readv])
>>   
>> +AC_CACHE_CHECK([whether C library provides GNU strerror_r], ac_cv_gnu_strerror_r, [dnl
>> +old_CFLAGS="$CFLAGS"
>> +CFLAGS="$CFLAGS -Werror"
>> +AC_COMPILE_IFELSE([AC_LANG_SOURCE([dnl
>> +#define _GNU_SOURCE
>> +#include <string.h>
>> +char * (*s)(int, char*, size_t) = strerror_r;
>> +])], ac_cv_gnu_strerror_r=yes, ac_cv_gnu_strerror_r=no)
>> +CFLAGS="$old_CFLAGS"])
>> +AS_IF([test "x$ac_cv_gnu_strerror_r" = "xyes"],
>> +      [AC_DEFINE([HAVE_GNU_STRERROR_R], [1], [Defined if libc has GNU style strerror_r])])
>> +
> 
> autoconf comes with the following check:
> 
>   - Macro: AC_FUNC_STRERROR_R
> 
>      If strerror_r is available, define HAVE_STRERROR_R, and if it is
>      declared, define HAVE_DECL_STRERROR_R. If it returns a char *
>      message, define STRERROR_R_CHAR_P; otherwise it returns an int
>      error number. The Thread-Safe Functions option of Posix requires
>      strerror_r to return int, but many systems (including, for
>      example, version 2.2.4 of the GNU C Library) return a char * value
>      that is not necessarily equal to the buffer argument.
> 
> Can we use that instead?

Thank you for pointing me at it :)

I was a bit worried about rolling my own check here, glad to find out 
there is a standard way of doing it.

> 
>> +static const char *
>> +errnomsg(int error)
>> +{
>> +  /* Won't be changed by strerror_r, but not const so compiler doesn't throw warning */
>> +  static char unknown[] = "unknown error";
>> +
>> +#ifdef HAVE_GNU_STRERROR_R
> 
> And use #ifdef STRERROR_R_CHAR_P here?
> 
> Thanks,
> 
> Mark
> 


More information about the Elfutils-devel mailing list