summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/siglist.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/siglist.c')
-rw-r--r--sysdeps/unix/sysv/linux/siglist.c42
1 files changed, 36 insertions, 6 deletions
diff --git a/sysdeps/unix/sysv/linux/siglist.c b/sysdeps/unix/sysv/linux/siglist.c
index a10b273db0..d14a1b92f1 100644
--- a/sysdeps/unix/sysv/linux/siglist.c
+++ b/sysdeps/unix/sysv/linux/siglist.c
@@ -18,28 +18,58 @@
 
 #include <stddef.h>
 #include <signal.h>
+#include <sizes.h>
 
-const char * const __new_sys_siglist[NSIG] =
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+# define SYS_SIGLIST	__new_sys_siglist
+# define SYS_SIGABBREV	__new_sys_sigabbrev
+#else
+# define SYS_SIGLIST	_sys_siglist
+# define SYS_SIGABBREV	_sys_sigabbrev
+#endif
+
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+asm (".data; .globl __old_sys_siglist;  __old_sys_siglist:");
+#endif
+
+const char *const SYS_SIGLIST[NSIG] =
 {
 #define init_sig(sig, abbrev, desc)   [sig] desc,
 #include "siglist.h"
 #undef init_sig
 };
 
-const char * const __new_sys_sigabbrev[NSIG] =
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+asm (".type __old_sys_siglist,@object;.size __old_sys_siglist,"
+        OLD_SIGLIST_SIZE_STR "*" PTR_SIZE_STR);
+
+asm (".data; .globl __old_sys_sigabbrev;  __old_sys_sigabbrev:");
+#endif
+
+const char *const SYS_SIGABBREV[NSIG] =
 {
 #define init_sig(sig, abbrev, desc)   [sig] abbrev,
 #include "siglist.h"
 #undef init_sig
 };
 
-#ifdef DO_VERSIONING
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+asm (".type __old_sys_sigabbrev,@object;.size __old_sys_sigabbrev,"
+        OLD_SIGLIST_SIZE_STR "*" PTR_SIZE_STR);
+
+extern const char *const *__old_sys_siglist;
+extern const char *const *__old_sys_sigabbrev;
+
+strong_alias (__old_sys_siglist, _old_sys_siglist)
+symbol_version (__old_sys_siglist, _sys_siglist, GLIBC_2.0);
+symbol_version (_old_sys_siglist, sys_siglist, GLIBC_2.0);
+symbol_version (__old_sys_sigabbrev, sys_sigabbrev, GLIBC_2.0);
+
 strong_alias (__new_sys_siglist, _new_sys_siglist)
 default_symbol_version (__new_sys_siglist, _sys_siglist, GLIBC_2.1);
 default_symbol_version (_new_sys_siglist, sys_siglist, GLIBC_2.1);
 default_symbol_version (__new_sys_sigabbrev, sys_sigabbrev, GLIBC_2.1);
 #else
-weak_alias(__new_sys_siglist, _sys_siglist)
-weak_alias(__new_sys_siglist, sys_siglist)
-weak_alias(__new_sys_sigabbrev, sys_sigabbrev)
+weak_alias (_sys_siglist, sys_siglist)
+weak_alias (_sys_sigabbrev, sys_sigabbrev)
 #endif