summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel@linux.vnet.ibm.com>2014-01-07 09:36:31 +0100
committerAndreas Krebbel <krebbel@linux.vnet.ibm.com>2014-01-07 09:36:31 +0100
commit93a45ff1ca6d459618bb0cf93580c4b2809a4b61 (patch)
tree01ba50a65134ba45d974f63156617392dabfd430 /sysdeps/unix/sysv/linux
parentd5780febe69c2fe42d857e2feed54e9f4ba9ab87 (diff)
S/390: Make jmp_buf extendible.
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r--sysdeps/unix/sysv/linux/s390/Makefile6
-rw-r--r--sysdeps/unix/sysv/linux/s390/Versions3
-rw-r--r--sysdeps/unix/sysv/linux/s390/longjmp_chk.c44
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c24
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist10
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/nptl/libpthread.abilist4
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c25
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist10
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/nptl/libpthread.abilist4
-rw-r--r--sysdeps/unix/sysv/linux/s390/v1-longjmp_chk.c35
10 files changed, 159 insertions, 6 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/Makefile b/sysdeps/unix/sysv/linux/s390/Makefile
index 45b1922338..f91179d0fc 100644
--- a/sysdeps/unix/sysv/linux/s390/Makefile
+++ b/sysdeps/unix/sysv/linux/s390/Makefile
@@ -16,3 +16,9 @@ endif
ifeq ($(subdir),elf)
sysdep_routines += dl-vdso
endif
+
+ifeq ($(subdir),debug)
+ifeq (yes,$(build-shared))
+sysdep_routines += v1-longjmp_chk
+endif
+endif
diff --git a/sysdeps/unix/sysv/linux/s390/Versions b/sysdeps/unix/sysv/linux/s390/Versions
index 627ff53529..95778235bf 100644
--- a/sysdeps/unix/sysv/linux/s390/Versions
+++ b/sysdeps/unix/sysv/linux/s390/Versions
@@ -1,4 +1,7 @@
libc {
+ GLIBC_2.19 {
+ __longjmp_chk;
+ }
GLIBC_PRIVATE {
__vdso_clock_gettime;
__vdso_clock_getres;
diff --git a/sysdeps/unix/sysv/linux/s390/longjmp_chk.c b/sysdeps/unix/sysv/linux/s390/longjmp_chk.c
new file mode 100644
index 0000000000..10f542d61c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/longjmp_chk.c
@@ -0,0 +1,44 @@
+/* Copyright (C) 2013 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
+ <http://www.gnu.org/licenses/>.
+
+ This is a copy of debug/longjmp_chk.c extended for symbol
+ versioning. */
+
+#include <shlib-compat.h>
+#include <setjmp.h>
+
+/* This place is the only user of these functions. */
+extern void ____v2__longjmp_chk (__jmp_buf __env, int __val)
+ __attribute__ ((__noreturn__));
+
+#if defined NOT_IN_libc
+
+# define __v2__longjmp ____longjmp_chk
+# define __v2__libc_siglongjmp __longjmp_chk
+
+# include <longjmp.c>
+
+#else
+
+# define __v2__longjmp ____v2__longjmp_chk
+# define __v2__libc_siglongjmp __v2__libc_siglongjmp_chk
+
+# include <longjmp.c>
+
+versioned_symbol (libc, __v2__libc_siglongjmp_chk, __longjmp_chk, GLIBC_2_19);
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c b/sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c
index e74f335768..a1b7a6a1ae 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c
@@ -26,8 +26,8 @@
#include <stdint.h>
#include <signal.h>
#include <sys/syscall.h>
-
-#define __longjmp ____longjmp_chk
+#include <libc-symbols.h>
+#include <shlib-compat.h>
#define CHECK_SP(env, guard) \
do \
@@ -51,4 +51,22 @@
} \
} while (0)
-#include "__longjmp.c"
+
+#if defined NOT_IN_libc
+/* Build a non-versioned object for rtld-*. */
+# define __longjmp ____longjmp_chk
+# include "__longjmp-common.c"
+
+#else /* !NOT_IN_libc */
+# define __longjmp ____v2__longjmp_chk
+# include "__longjmp-common.c"
+
+# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_11, GLIBC_2_19)
+# undef __longjmp
+# define __V1_JMPBUF
+# define __longjmp ____v1__longjmp_chk
+# include "__longjmp-common.c"
+# undef __longjmp
+
+# endif
+#endif /* !NOT_IN_libc */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist
index b6256d5c25..18ec9944e1 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist
@@ -1774,6 +1774,16 @@ GLIBC_2.17
GLIBC_2.18
GLIBC_2.18 A
__cxa_thread_atexit_impl F
+GLIBC_2.19
+ GLIBC_2.19 A
+ __longjmp_chk F
+ __setjmp F
+ __sigsetjmp F
+ _longjmp F
+ _setjmp F
+ longjmp F
+ setjmp F
+ siglongjmp F
GLIBC_2.2
GLIBC_2.2 A
_IO_adjust_wcolumn F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/nptl/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/nptl/libpthread.abilist
index 865364e130..699de0160c 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/nptl/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/nptl/libpthread.abilist
@@ -178,6 +178,10 @@ GLIBC_2.18
GLIBC_2.18 A
pthread_getattr_default_np F
pthread_setattr_default_np F
+GLIBC_2.19
+ GLIBC_2.19 A
+ longjmp F
+ siglongjmp F
GLIBC_2.2
GLIBC_2.2 A
__open64 F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c b/sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c
index a3b1375a0d..bc27b08728 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c
@@ -26,8 +26,8 @@
#include <stdint.h>
#include <signal.h>
#include <sys/syscall.h>
-
-#define __longjmp ____longjmp_chk
+#include <libc-symbols.h>
+#include <shlib-compat.h>
#define CHECK_SP(env, guard) \
do \
@@ -51,4 +51,23 @@
} \
} while (0)
-#include "__longjmp.c"
+
+#if defined NOT_IN_libc
+/* Build a non-versioned object for rtld-*. */
+# define __longjmp ____longjmp_chk
+# include "__longjmp-common.c"
+
+#else /* !NOT_IN_libc */
+# define __longjmp ____v2__longjmp_chk
+# include "__longjmp-common.c"
+# undef __longjmp
+
+# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_11, GLIBC_2_19)
+# undef __longjmp
+# define __V1_JMPBUF
+# define __longjmp ____v1__longjmp_chk
+# include "__longjmp-common.c"
+# undef __longjmp
+
+# endif
+#endif /* !NOT_IN_libc */
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist
index 265f66d905..05b5286058 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist
@@ -95,6 +95,16 @@ GLIBC_2.17
GLIBC_2.18
GLIBC_2.18 A
__cxa_thread_atexit_impl F
+GLIBC_2.19
+ GLIBC_2.19 A
+ __longjmp_chk F
+ __setjmp F
+ __sigsetjmp F
+ _longjmp F
+ _setjmp F
+ longjmp F
+ setjmp F
+ siglongjmp F
GLIBC_2.2
GLIBC_2.2 A
_Exit F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/nptl/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/nptl/libpthread.abilist
index 6613c09b06..51a8a7ff60 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/nptl/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/nptl/libpthread.abilist
@@ -12,6 +12,10 @@ GLIBC_2.18
GLIBC_2.18 A
pthread_getattr_default_np F
pthread_setattr_default_np F
+GLIBC_2.19
+ GLIBC_2.19 A
+ longjmp F
+ siglongjmp F
GLIBC_2.2
GLIBC_2.2 A
_IO_flockfile F
diff --git a/sysdeps/unix/sysv/linux/s390/v1-longjmp_chk.c b/sysdeps/unix/sysv/linux/s390/v1-longjmp_chk.c
new file mode 100644
index 0000000000..bd80acfe66
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/v1-longjmp_chk.c
@@ -0,0 +1,35 @@
+/* Copyright (C) 2013 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
+ <http://www.gnu.org/licenses/>.
+
+ This went into a separate source file since we would otherwise be
+ needed to include two different versions of setjmp.h into the same
+ file. */
+
+#include <shlib-compat.h>
+
+#if !defined NOT_IN_libc && defined SHARED
+# if SHLIB_COMPAT (libc, GLIBC_2_11, GLIBC_2_19)
+
+# define __v1__longjmp ____v1__longjmp_chk
+# define __v1__libc_siglongjmp __v1__libc_siglongjmp_chk
+
+# include <v1-longjmp.c>
+
+compat_symbol (libc, __v1__libc_siglongjmp_chk, __longjmp_chk, GLIBC_2_11);
+
+# endif
+#endif