From 79e419de6261c4e04785908828096cb4d56b8680 Mon Sep 17 00:00:00 2001 From: Yaakov Selkowitz Date: Mon, 6 Jul 2015 14:58:51 -0500 Subject: [PATCH] Rework handling of basename variants As a commonly-included header, the #define basename in can affect code which uses "basename" for its own purposes (e.g. struct members or C++ namespaced functions). When such cases occur and some code includes and some not, then errors result. OTOH, is rarely used, and that's where the renaming occurs in glibc, so code using should already be safe. * libc/include/libgen.h (basename): Define as __xpg_basename for source compatibility with glibc. Declare with __ASMNAME("basename") for ABI compatibility. * libc/include/string.h (basename): Define as basename for source compatibility with glibc. Declare with __ASMNAME("__gnu_basename") for ABI compatibility. --- newlib/ChangeLog | 9 +++++++++ newlib/libc/include/libgen.h | 5 +++-- newlib/libc/include/string.h | 4 ++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 994f1ca0e..24a6c9c58 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,12 @@ +2015-07-06 Yaakov Selkowitz + + * libc/include/libgen.h (basename): Define as __xpg_basename + for source compatibility with glibc. + Declare with __ASMNAME("basename") for ABI compatibility. + * libc/include/string.h (basename): Define as basename for + source compatibility with glibc. + Declare with __ASMNAME("__gnu_basename") for ABI compatibility. + 2015-07-06 Corinna Vinschen * libc/include/sys/time.h: Explicitely include sys/cdefs.h. diff --git a/newlib/libc/include/libgen.h b/newlib/libc/include/libgen.h index de70b5b2f..3c717c5b0 100644 --- a/newlib/libc/include/libgen.h +++ b/newlib/libc/include/libgen.h @@ -6,6 +6,7 @@ #define _LIBGEN_H_ #include "_ansi.h" +#include #include #ifdef __cplusplus @@ -24,8 +25,8 @@ extern "C" { this also implies that the POSIX version is used in this case. That's made sure here. */ #undef basename -#define basename basename -char *_EXFUN(basename, (char *)); +#define basename __xpg_basename +char *_EXFUN(basename, (char *)) __asm__(__ASMNAME("basename")); char *_EXFUN(dirname, (char *)); #ifdef __cplusplus diff --git a/newlib/libc/include/string.h b/newlib/libc/include/string.h index 92e08aebc..84dd6b0ce 100644 --- a/newlib/libc/include/string.h +++ b/newlib/libc/include/string.h @@ -175,8 +175,8 @@ int _EXFUN(strtosigno, (const char *__name)); this also implies that the POSIX version is used in this case. That's made sure here. */ #if __GNU_VISIBLE && !defined(basename) -char *_EXFUN(__nonnull (1) __gnu_basename,(const char *)); -# define basename __gnu_basename +# define basename basename +char *_EXFUN(__nonnull (1) basename,(const char *)) __asm__(__ASMNAME("__gnu_basename")); #endif #include -- 2.43.5