glibc/sysdeps/unix/sysv/linux/errlist-compat.h
Adhemerval Zanella f13d260190 signal: Move sys_errlist to a compat symbol
The symbol is deprecated by strerror since its usage imposes some issues
such as copy relocations.

Its internal name is also changed to _sys_errlist_internal to avoid
static linking usage.  The compat code is also refactored by removing
the over enginered errlist-compat.c generation from manual entried and
extra comment token in linker script file.  It disantangle the code
generation from manual and simplify both Linux and Hurd compat code.

The definitions from errlist.c are moved to errlist.h and a new test
is added to avoid a new errno entry without an associated one in manual.

Checked on x86_64-linux-gnu and i686-linux-gnu. I also run a check-abi
on all affected platforms.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
2020-07-07 14:10:58 -03:00

44 lines
2.0 KiB
C

/* Linux sys_errlist compatibility macro definitions.
Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef _ERRLIST_COMPAT_H
#define _ERRLIST_COMPAT_H
#include <shlib-compat.h>
/* Define new compat symbols for symbols _sys_errlist, sys_errlist,
_sys_nerr, and sys_nerr for version VERSION with NUMBERERR times number of
bytes per long int size.
Both _sys_errlist and sys_errlist alias to _sys_errlist_internal symbol
(defined on errlist.c) while _sys_nerr and sys_nerr created new variable
with the expected size. */
#define DEFINE_COMPAT_ERRLIST(NUMBERERR, VERSION) \
const int __##VERSION##_sys_nerr = NUMBERERR; \
strong_alias (__##VERSION##_sys_nerr, __##VERSION##__sys_nerr); \
declare_symbol_alias (__ ## VERSION ## _sys_errlist, _sys_errlist_internal,\
object, NUMBERERR * (ULONG_WIDTH / UCHAR_WIDTH)); \
declare_symbol_alias (__ ## VERSION ## __sys_errlist, \
_sys_errlist_internal, object, \
NUMBERERR * (ULONG_WIDTH / UCHAR_WIDTH)); \
compat_symbol (libc, __## VERSION ## _sys_nerr, sys_nerr, VERSION); \
compat_symbol (libc, __## VERSION ## __sys_nerr, _sys_nerr, VERSION); \
compat_symbol (libc, __## VERSION ## _sys_errlist, sys_errlist, VERSION); \
compat_symbol (libc, __## VERSION ## __sys_errlist, _sys_errlist, VERSION);\
#endif