aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2018-05-22 15:44:01 +0000
committerJoseph Myers <joseph@codesourcery.com>2018-05-22 15:44:01 +0000
commit5c5c0dd747070db624c8e2c43691cec854f114ef (patch)
treeb4543a7913ad4f1f6d65171d973f513a37fb33e0
parented0d698870720752986f855a2b3da50e3c89bad5 (diff)
downloadglibc-5c5c0dd747070db624c8e2c43691cec854f114ef.zip
glibc-5c5c0dd747070db624c8e2c43691cec854f114ef.tar.gz
glibc-5c5c0dd747070db624c8e2c43691cec854f114ef.tar.bz2
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.
-rw-r--r--ChangeLog14
-rw-r--r--NEWS5
-rw-r--r--sysdeps/unix/make-syscalls.sh2
-rw-r--r--sysdeps/unix/sysv/linux/lseek64.c11
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list2
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/llseek.S1
6 files changed, 26 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 22785e1..6c9331b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/NEWS b/NEWS
index bade9e4..7838f79 100644
--- a/NEWS
+++ b/NEWS
@@ -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]
diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh
index 874ad69..e39b2d6 100644
--- a/sysdeps/unix/make-syscalls.sh
+++ b/sysdeps/unix/make-syscalls.sh
@@ -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'; \\"
;;
*@*)
diff --git a/sysdeps/unix/sysv/linux/lseek64.c b/sysdeps/unix/sysv/linux/lseek64.c
index 504d008..2ad6a61 100644
--- a/sysdeps/unix/sysv/linux/lseek64.c
+++ b/sysdeps/unix/sysv/linux/lseek64.c
@@ -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
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list b/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list
index 33d968f..9e6a584 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list
@@ -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
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/llseek.S b/sysdeps/unix/sysv/linux/x86_64/x32/llseek.S
deleted file mode 100644
index 5084d0e..0000000
--- a/sysdeps/unix/sysv/linux/x86_64/x32/llseek.S
+++ /dev/null
@@ -1 +0,0 @@
-/* No llseek for x32. */