Source: glibc Version: 2.19-11 Severity: important Tags: patch
Dear debian glibc maintainers, Can you please apply this hppa-arch-specific patch to debian glibc and keep it until you upgrade to sources of glibc 2.21 ? Main reason for this patch is to make it possible to use systemd on hppa. Without this patch people who will by mistake install systemd (e.g. because of dependencies) will render their machines unbootable. The patch breaks the ABI on hppa, but in a way which will not affect people, because it changes the signals which are usually not used. This has been tested by installing and booting mixtures of glibc and kernel with corresponding patches. I'll send in a bug report with patch for debian kernel shortly too. Upstream Linux kernel commit is 1f25df2eff5b25f52c139d3ff31bc883eee9a0ab http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1f25df2eff5b25f52c139d3ff31bc883eee9a0ab&utm_source=anzwix Upstream glibc commit is: https://sourceware.org/git/?p=glibc.git;a=commit;h=13d845549e41823e6658122dcf268154bcbbcfde I've adjusted the attached patch (only changes path names) so that it applies to debian's glibc 2.19 To better understand what we fix here, the glibc changelog description of Carlos is probably best (copied in here): This is a conscious ABI break for hppa. We find ourselves unable to run systemd because it expects SIGRTMIN+29 signals to be available and with hppa starting at 37 that exceeds the 64 signals available. It is arguable that the systemd code could compact their signal usage (the have a gap and don't check SIGRTMAX to see if they are over). However, that would require pursuing this upstream with systemd. The least work option is to make hppa more like other arches. The best option is to free up 3 signals for use with SIGXCPU, SIGXFSZ and SIGSTKFLT, and move those below 31. We make SIGSYS equal to SIGUNUSED as is expected. We remove SIGEMT and SIGLOST as HPUX signal we won't ever use. With that change we match all other machines. Given that these signals are so esoteric, testing by other users building minimal systems from scratch showed no problems. In fact Tcl fails to build if you make SIGEMT == SIGABRT, so we just removed SIGEMT (they use a large switch statement in C to handle signals, and I don't think it's valid to assume they will all have distinct values to fit into a switch). Committed as the only solution we possibly have here. Signed-off-by: Carlos O'Donell <car...@systemhalted.org> Signed-off-by: Helge Deller <del...@gmx.de>
>From 13d845549e41823e6658122dcf268154bcbbcfde Mon Sep 17 00:00:00 2001 From: Carlos O'Donell <car...@redhat.com> Date: Thu, 23 Oct 2014 23:14:12 -0400 Subject: [PATCH] hppa: Make __SIGRTMIN 32 (ABI break). In the Linux kernel version 3.17 the signal numbers were rearranged in order to make hppa like every other arch. Previously we started __SIGRTMIN at 37, and that meant several pieces of important software, including systemd, would fail to build. To support systemd we removed SIGEMT and SIGLOST, and rearranged the others according to expected values. This is technically an ABI incompatible change, but because zero applications use SIGSTKFLT, SIGXCPU, SIGXFSZ and SIGSYS nothing broke. Nothing uses SIGEMT and SIGLOST, and they were present for HPUX compatibility which is no longer supported. Thus because nothing breaks we don't do any compatibility work here. Upstream kernel commit is 1f25df2eff5b25f52c139d3ff31bc883eee9a0ab. Signed-off-by: Carlos O'Donell <car...@systemhalted.org> Signed-off-by: Helge Deller <del...@gmx.de> 2014-10-23 Carlos O'Donell <car...@systemhalted.org> Helge Deller <del...@gmx.de> [BZ #17508] * sysdeps/unix/sysv/linux/hppa/bits/signum.h: Remove SIGEMT. Define SIGSTKFLT as 7. Define SIGSYS as 31. Define SIGXCPU as 12. Remove SIGLOST. Define SIGXFSZ as 30. Define __SIGRTMIN as 32. --- diff -up ./ports/sysdeps/unix/sysv/linux/hppa/bits/signum.h.org ./ports/sysdeps/unix/sysv/linux/hppa/bits/signum.h --- ./ports/sysdeps/unix/sysv/linux/hppa/bits/signum.h.org 2014-10-24 12:47:51.039590372 +0200 +++ ./ports/sysdeps/unix/sysv/linux/hppa/bits/signum.h 2014-10-24 12:47:59.707589170 +0200 @@ -36,12 +36,12 @@ #define SIGTRAP 5 /* Trace trap (POSIX). */ #define SIGABRT 6 /* Abort (ANSI). */ #define SIGIOT 6 /* IOT trap (4.2 BSD). */ -#define SIGEMT 7 +#define SIGSTKFLT 7 /* Stack fault. */ #define SIGFPE 8 /* Floating-point exception (ANSI). */ #define SIGKILL 9 /* Kill, unblockable (POSIX). */ #define SIGBUS 10 /* BUS error (4.2 BSD). */ #define SIGSEGV 11 /* Segmentation violation (ANSI). */ -#define SIGSYS 12 /* Bad system call. */ +#define SIGXCPU 12 /* CPU limit exceeded (4.2 BSD). */ #define SIGPIPE 13 /* Broken pipe (POSIX). */ #define SIGALRM 14 /* Alarm clock (POSIX). */ #define SIGTERM 15 /* Termination (ANSI). */ @@ -61,11 +61,9 @@ #define SIGTTIN 27 /* Background read from tty (POSIX). */ #define SIGTTOU 28 /* Background write to tty (POSIX). */ #define SIGURG 29 /* Urgent condition on socket (4.2 BSD). */ -#define SIGLOST 30 /* Operating System Has Lost (HP/UX). */ +#define SIGXFSZ 30 /* File size limit exceeded (4.2 BSD). */ +#define SIGSYS 31 /* Bad system call. */ #define SIGUNUSED 31 -#define SIGXCPU 33 /* CPU limit exceeded (4.2 BSD). */ -#define SIGXFSZ 34 /* File size limit exceeded (4.2 BSD). */ -#define SIGSTKFLT 36 /* Stack fault. */ #define _NSIG 65 /* Biggest signal number + 1 (including real-time signals). */ @@ -75,7 +73,17 @@ /* These are the hard limits of the kernel. These values should not be used directly at user level. */ -#define __SIGRTMIN 37 +/* In the Linux kernel version 3.17, and glibc 2.21, the signal numbers + were rearranged in order to make hppa like every other arch. Previously + we started __SIGRTMIN at 37, and that meant several pieces of important + software, including systemd, would fail to build. To support systemd we + removed SIGEMT and SIGLOST, and rearranged the others according to + expected values. This is technically an ABI incompatible change, but + because zero applications use SIGSTKFLT, SIGXCPU, SIGXFSZ and SIGSYS + nothing broke. Nothing uses SIGEMT and SIGLOST, and they were present + for HPUX compatibility which is no longer supported. Thus because + nothing breaks we don't do any compatibility work here. */ +#define __SIGRTMIN 32 /* Kernel > 3.17. */ #define __SIGRTMAX (_NSIG - 1) #endif /* <signal.h> included. */