M4 Experts:
Since this issue seems to be in a standstill, I've put together a patch
that I can use locally.
I'm seeking input for this patch I've produced for m4 package. I'd
appreciate your thoughts.
Carol
On Tue, Mar 16, 2021 at 3:46 PM Carol Bouchard <[email protected]> wrote:
> Folks:
>
> I misstated earlier that the latest Fedora is going in this direction.
> This appears to be a glibc only issue as my build is pulling in glibc and
> not playing nicely with m4.
> According to https://pkgs.org/download/glibc-devel, fedora rawhide is
> pulling in the latest version glibc-devel 2.33.
> I'm wondering if there is a short-term work-around I can use.
>
> Carol
>
> On Tue, Mar 9, 2021 at 4:30 PM Scott Lurndal <[email protected]> wrote:
>
>> On Tue, Mar 09, 2021 at 08:58:38PM +0100, Bruno Haible via austin-group-l
>> at The Open Group wrote:
>> > Eric Blake wrote:
>> > > I can open a defect against POSIX if we decide that is needed, but
>> want
>> > > some consensus first on whether it is glibc's change that went too
>> far,
>> > > or POSIX's requirements that are too restrictive for what glibc wants
>> to do.
>> >
>> > Thanks for opening the discussion, Eric.
>> >
>> > Here are a couple of questions, to understand the motivation and the
>> possible
>> > alternative solutions to the problem:
>> >
>> > 1) As far as I understand, the issue occurs with certain x86 or x86_64
>> > processors.
>> >
>> > 1.1) What has been the value of MINSIGSTKSZ on x86 and x86_64 so far?
>> > 1.2) What value of MINSIGSTKSZ is needed for AVX-512F support?
>> > 1.3) Will the trend to larger MINSIGSTKSZ values continue for Intel
>> > processors?
>>
>> It's not just Intel processors.
>>
>> 64-bit ARM processors that support scalable vectors (SVE) support
>> vectors of up to 2084 bits, and they have 32 vector registers which would
>> require 8Kbytes for the SVE state alone if the implementation supports
>> the full 2kbits.
>>
>> scott
>>
>>
diff --git a/third-party/m4-1.4.18-glibc-sigstksz.patch b/third-party/m4-1.4.18-glibc-sigstksz.patch
new file mode 100644
index 0000000..c506603
--- /dev/null
+++ b/third-party/m4-1.4.18-glibc-sigstksz.patch
@@ -0,0 +1,65 @@
+diff --git a/lib/c-stack.c b/lib/c-stack.c
+index 5353c08..863f764 100644
+--- a/lib/c-stack.c
++++ b/lib/c-stack.c
+@@ -51,13 +51,14 @@
+ typedef struct sigaltstack stack_t;
+ #endif
+ #ifndef SIGSTKSZ
+-# define SIGSTKSZ 16384
+-#elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384
++#define get_sigstksz() (16384)
++#elif HAVE_LIBSIGSEGV
+ /* libsigsegv 2.6 through 2.8 have a bug where some architectures use
+ more than the Linux default of an 8k alternate stack when deciding
+ if a fault was caused by stack overflow. */
+-# undef SIGSTKSZ
+-# define SIGSTKSZ 16384
++#define get_sigstksz() ((SIGSTKSZ) < 16384 ? 16384 : (SIGSTKSZ))
++#else
++#define get_sigstksz() ((SIGSTKSZ))
+ #endif
+
+ #include <stdlib.h>
+@@ -131,7 +132,8 @@ die (int signo)
+ /* Storage for the alternate signal stack. */
+ static union
+ {
+- char buffer[SIGSTKSZ];
++ /* allocate buffer with size from get_sigstksz() */
++ char *buffer;
+
+ /* These other members are for proper alignment. There's no
+ standard way to guarantee stack alignment, but this seems enough
+@@ -203,10 +205,11 @@ c_stack_action (void (*action) (int))
+ program_error_message = _("program error");
+ stack_overflow_message = _("stack overflow");
+
++ alternate_signal_stack.buffer = malloc(get_sigstksz());
+ /* Always install the overflow handler. */
+ if (stackoverflow_install_handler (overflow_handler,
+ alternate_signal_stack.buffer,
+- sizeof alternate_signal_stack.buffer))
++ get_sigstksz()))
+ {
+ errno = ENOTSUP;
+ return -1;
+@@ -279,14 +282,15 @@ c_stack_action (void (*action) (int))
+ stack_t st;
+ struct sigaction act;
+ st.ss_flags = 0;
++ alternate_signal_stack.buffer = malloc(get_sigstksz());
+ # if SIGALTSTACK_SS_REVERSED
+ /* Irix mistakenly treats ss_sp as the upper bound, rather than
+ lower bound, of the alternate stack. */
+- st.ss_sp = alternate_signal_stack.buffer + SIGSTKSZ - sizeof (void *);
+- st.ss_size = sizeof alternate_signal_stack.buffer - sizeof (void *);
++ st.ss_sp = alternate_signal_stack.buffer + get_sigstksz() - sizeof (void *);
++ st.ss_size = get_sigstksz() - sizeof (void *);
+ # else
+ st.ss_sp = alternate_signal_stack.buffer;
+- st.ss_size = sizeof alternate_signal_stack.buffer;
++ st.ss_size = get_sigstksz();
+ # endif
+ r = sigaltstack (&st, NULL);
+ if (r != 0)