Make llseek a compat symbol (bug 18471).

The llseek function name is an obsolete, Linux-specific, unprototyped
name for lseek64 with a link-time warning.  This patch completes the
obsoletion of this function name by making it into a compat symbol,
not available for newly linked programs and not included in the ABI
for new ports.

When a compat symbol is defined in syscalls.list, the code for that
function is not built at all for static linking unless some non-compat
symbol for that function is also defined with an explicit symbol
version, so an explicit symbol version for lseek64 is added to the
MIPS n32 syscalls.list.  The case in make-syscalls.sh that handles
such explicit non-compat symbol versions then needs to be changed to
use weak_alias instead of strong_alias when the syscall is built
outside of libc, to avoid linknamespace failures from a strong lseek64
symbol in static libpthread.

The x32 llseek.S was as far as I could tell already unused (nothing
builds an llseek.* source file, at least since the lseek / lseek64 /
llseek consolidation), so is removed in this patch as well.

Tested for x86_64 and x86, and with build-many-glibcs.py.

	[BZ #18471]
	* sysdeps/unix/make-syscalls.sh (emit_weak_aliases): Use weak
	aliases for non-libc case of versioned symbols.
	* sysdeps/unix/sysv/linux/lseek64.c: Include <shlib-compat.h>.
	(llseek): Define as compat symbol if
	[SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_28)], not as weak alias
	with link warning.
	* sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list (llseek):
	Make into a compat symbol, disabled for minimum symbol version
	GLIBC_2.28 and later.
	* sysdeps/unix/sysv/linux/x86_64/x32/llseek.S: Remove file.
This commit is contained in:
Joseph Myers 2018-05-22 15:44:01 +00:00
parent ed0d698870
commit 5c5c0dd747
6 changed files with 26 additions and 9 deletions

View File

@ -1,3 +1,17 @@
2018-05-22 Joseph Myers <joseph@codesourcery.com>
[BZ #18471]
* sysdeps/unix/make-syscalls.sh (emit_weak_aliases): Use weak
aliases for non-libc case of versioned symbols.
* sysdeps/unix/sysv/linux/lseek64.c: Include <shlib-compat.h>.
(llseek): Define as compat symbol if
[SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_28)], not as weak alias
with link warning.
* sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list (llseek):
Make into a compat symbol, disabled for minimum symbol version
GLIBC_2.28 and later.
* sysdeps/unix/sysv/linux/x86_64/x32/llseek.S: Remove file.
2018-05-22 Florian Weimer <fweimer@redhat.com>
* sysdeps/i386/Makefile [$(subdir) == math] (sysdep-CFLAGS): Do

5
NEWS
View File

@ -74,6 +74,11 @@ Deprecated and removed features, and other changes affecting compatibility:
and could not usefully be used with the GNU C Library on systems with
version 3.1 or later of the Linux kernel.
* The obsolete function name llseek is no longer available to newly linked
binaries. This function was specific to systems using the Linux kernel
and was not declared in a header. Programs should use the lseek64 name
for this function instead.
Changes to build and runtime requirements:
[Add changes to build and runtime requirements here]

View File

@ -103,7 +103,7 @@ emit_weak_aliases()
fi
echo " echo 'versioned_symbol (libc, $source, $base, $ver)'; \\"
echo " echo '#else'; \\"
echo " echo 'strong_alias ($strong, $base)'; \\"
echo " echo 'weak_alias ($strong, $base)'; \\"
echo " echo '#endif'; \\"
;;
*@*)

View File

@ -21,6 +21,7 @@
#include <sys/types.h>
#include <sysdep.h>
#include <errno.h>
#include <shlib-compat.h>
off64_t
__lseek64 (int fd, off64_t offset, int whence)
@ -46,9 +47,7 @@ libc_hidden_def (__lseek)
strong_alias (__lseek64, __libc_lseek64)
weak_alias (__lseek64, lseek64)
/* llseek doesn't have a prototype. Since the second parameter is a
64bit type, this results in wrong behaviour if no prototype is
provided. */
weak_alias (__lseek64, llseek)
link_warning (llseek, "\
the `llseek' function may be dangerous; use `lseek64' instead.")
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_28)
strong_alias (__lseek64, __compat_llseek)
compat_symbol (libc, __compat_llseek, llseek, GLIBC_2_0);
#endif

View File

@ -2,7 +2,7 @@
# C syscall macros cannot be used because this syscall has a 64-bit
# return value.
lseek64 - lseek i:iii __lseek64 __libc_lseek64 lseek64 llseek
lseek64 - lseek i:iii __lseek64 __libc_lseek64 lseek64@@GLIBC_2.2 llseek@GLIBC_2.0:GLIBC_2.28
prlimit64 EXTRA prlimit64 i:iipp prlimit64

View File

@ -1 +0,0 @@
/* No llseek for x32. */