[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1028200: marked as done (glibc: FTBFS on alpha due to buggy GL(dl_phdr) and GL(dl_phnum) [BZ #29864])



Your message dated Thu, 13 Jul 2023 20:35:58 +0000
with message-id <E1qK32c-00CNRe-Ar@fasolo.debian.org>
and subject line Bug#1028200: fixed in glibc 2.36-9+deb12u1
has caused the Debian Bug report #1028200,
regarding glibc: FTBFS on alpha due to buggy GL(dl_phdr) and GL(dl_phnum) [BZ #29864]
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
1028200: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1028200
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Source: glibc
Version: 2.36-8
Severity: normal
Tags: patch upstream
User: debian-alpha@lists.debian.org
Usertags: alpha
X-Debbugs-Cc: debian-alpha@lists.debian.org

Hello!

glibc fails to build from source on alpha with many testsuite failures [1]
due to a regression introduced in glibc 2.34 [2].

According to the discussion on the libc-alpha mailing list, this issue
affects multiple architectures for static builds. It just happens that
it causes segmentation faults on alpha [3].

A proposed patch by Adhemveral Zanella has been posted on the list [4]
but not been merged yet. I tested the first version of the patch [3] and
can confirm that it works. I will test the posted version [4] now.

Adhemerval said that he plans to backport the patch down to 2.34, so it
will eventually show up in 2.36 as well. Either way, it might be a good
idea to already carry the patch in Debian but I'm not sure.

Thanks,
Adrian

> [1] https://buildd.debian.org/status/logs.php?pkg=glibc&arch=alpha
> [2] https://sourceware.org/pipermail/libc-alpha/2023-January/144445.html
> [3] https://sourceware.org/pipermail/libc-alpha/2023-January/144452.html
> [4] https://sourceware.org/pipermail/libc-alpha/2023-January/144457.html

--
 .''`.  John Paul Adrian Glaubitz
: :' :  Debian Developer
`. `'   Physicist
  `-    GPG: 62FF 8A75 84E0 2956 9546  0006 7426 3B37 F5B5 F913
--- Begin Message ---
The 73fc4e28b9464f0e refactor did not add the GL(dl_phdr) and
GL(dl_phnum) for static build, relying on the __ehdr_start symbol,
which is always added by the static linker, to get the correct values.

This is problematic in some ways:

  - The segment may see its in-memory size differ from its in-file
    size (or the binary may have holes).  The Linux has fixed is to
    provide concise values for both AT_PHDR and AT_PHNUM (commit
    0da1d5002745c - "fs/binfmt_elf: Fix AT_PHDR for unusual ELF files")

  - Some archs (alpha for instance) the hidden weak reference is not
    correctly pulled by the static linker and  __ehdr_start address
    end up being 0, which makes GL(dl_phdr) and GL(dl_phnum) have both
    invalid values (and triggering a segfault later on libc.so while
    accessing TLS variables).

The safer fix is to just restore the previous behavior to setup
GL(dl_phdr) and GL(dl_phnum) for static based on kernel auxv.  The
__ehdr_start fallback can also be simplified by not assuming weak
linkage (as for PIE).

The libc-static.c auxv init logic is moved to dl-support.c, since
the later is build without SHARED and then GLRO macro is defined
to access the variables directly.

The _dl_phdr is also assumed to be always non NULL, since an invalid
NULL values does not trigger TLS initialization (which is used in
various libc systems).

Checked on aarch64-linux-gnu, x86_64-linux-gnu, and i686-linux-gnu.
---
 csu/libc-start.c                        | 21 ----------
 csu/libc-tls.c                          | 25 ++++++------
 elf/dl-support.c                        | 52 ++++++++++++++++---------
 sysdeps/unix/sysv/linux/dl-parse_auxv.h |  1 +
 4 files changed, 46 insertions(+), 53 deletions(-)

diff --git a/csu/libc-start.c b/csu/libc-start.c
index 543560f36c..bfeee6d851 100644
--- a/csu/libc-start.c
+++ b/csu/libc-start.c
@@ -262,28 +262,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
   }
 #  endif
   _dl_aux_init (auxvec);
-  if (GL(dl_phdr) == NULL)
 # endif
-    {
-      /* Starting from binutils-2.23, the linker will define the
-         magic symbol __ehdr_start to point to our own ELF header
-         if it is visible in a segment that also includes the phdrs.
-         So we can set up _dl_phdr and _dl_phnum even without any
-         information from auxv.  */
-
-      extern const ElfW(Ehdr) __ehdr_start
-# if BUILD_PIE_DEFAULT
-	__attribute__ ((visibility ("hidden")));
-# else
-	__attribute__ ((weak, visibility ("hidden")));
-      if (&__ehdr_start != NULL)
-# endif
-        {
-          assert (__ehdr_start.e_phentsize == sizeof *GL(dl_phdr));
-          GL(dl_phdr) = (const void *) &__ehdr_start + __ehdr_start.e_phoff;
-          GL(dl_phnum) = __ehdr_start.e_phnum;
-        }
-    }
 
   __tunables_init (__environ);
 
diff --git a/csu/libc-tls.c b/csu/libc-tls.c
index ca4def2613..51d3cf99bf 100644
--- a/csu/libc-tls.c
+++ b/csu/libc-tls.c
@@ -119,19 +119,18 @@ __libc_setup_tls (void)
   __tls_pre_init_tp ();
 
   /* Look through the TLS segment if there is any.  */
-  if (_dl_phdr != NULL)
-    for (phdr = _dl_phdr; phdr < &_dl_phdr[_dl_phnum]; ++phdr)
-      if (phdr->p_type == PT_TLS)
-	{
-	  /* Remember the values we need.  */
-	  memsz = phdr->p_memsz;
-	  filesz = phdr->p_filesz;
-	  initimage = (void *) phdr->p_vaddr + main_map->l_addr;
-	  align = phdr->p_align;
-	  if (phdr->p_align > max_align)
-	    max_align = phdr->p_align;
-	  break;
-	}
+  for (phdr = _dl_phdr; phdr < &_dl_phdr[_dl_phnum]; ++phdr)
+    if (phdr->p_type == PT_TLS)
+      {
+	/* Remember the values we need.  */
+	memsz = phdr->p_memsz;
+	filesz = phdr->p_filesz;
+	initimage = (void *) phdr->p_vaddr + main_map->l_addr;
+	align = phdr->p_align;
+	if (phdr->p_align > max_align)
+	  max_align = phdr->p_align;
+	break;
+      }
 
   /* Calculate the size of the static TLS surplus, with 0 auditors.  */
   _dl_tls_static_surplus_init (0);
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 614b5b3e0c..b5ec5bd6d1 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -250,12 +250,27 @@ _dl_aux_init (ElfW(auxv_t) *av)
 #endif
 
   _dl_auxv = av;
-  dl_parse_auxv_t auxv_values;
-  /* Use an explicit initialization loop here because memset may not
-     be available yet.  */
-  for (int i = 0; i < array_length (auxv_values); ++i)
-    auxv_values[i] = 0;
+  dl_parse_auxv_t auxv_values = { 0, };
   _dl_parse_auxv (av, auxv_values);
+
+  _dl_phdr = (void*) auxv_values[AT_PHDR];
+  _dl_phnum = auxv_values[AT_PHNUM];
+
+  if (_dl_phdr == NULL)
+    {
+      /* Starting from binutils-2.23, the linker will define the
+         magic symbol __ehdr_start to point to our own ELF header
+         if it is visible in a segment that also includes the phdrs.
+         So we can set up _dl_phdr and _dl_phnum even without any
+         information from auxv.  */
+
+      extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
+      assert (__ehdr_start.e_phentsize == sizeof *GL(dl_phdr));
+      _dl_phdr = (const void *) &__ehdr_start + __ehdr_start.e_phoff;
+      _dl_phnum = __ehdr_start.e_phnum;
+    }
+
+  assert (_dl_phdr != NULL);
 }
 #endif
 
@@ -324,20 +339,19 @@ _dl_non_dynamic_init (void)
   if (_dl_platform != NULL)
     _dl_platformlen = strlen (_dl_platform);
 
-  if (_dl_phdr != NULL)
-    for (const ElfW(Phdr) *ph = _dl_phdr; ph < &_dl_phdr[_dl_phnum]; ++ph)
-      switch (ph->p_type)
-	{
-	/* Check if the stack is nonexecutable.  */
-	case PT_GNU_STACK:
-	  _dl_stack_flags = ph->p_flags;
-	  break;
-
-	case PT_GNU_RELRO:
-	  _dl_main_map.l_relro_addr = ph->p_vaddr;
-	  _dl_main_map.l_relro_size = ph->p_memsz;
-	  break;
-	}
+  for (const ElfW(Phdr) *ph = _dl_phdr; ph < &_dl_phdr[_dl_phnum]; ++ph)
+    switch (ph->p_type)
+      {
+      /* Check if the stack is nonexecutable.  */
+      case PT_GNU_STACK:
+	_dl_stack_flags = ph->p_flags;
+	break;
+
+      case PT_GNU_RELRO:
+	_dl_main_map.l_relro_addr = ph->p_vaddr;
+	_dl_main_map.l_relro_size = ph->p_memsz;
+	break;
+      }
 
   call_function_static_weak (_dl_find_object_init);
 
diff --git a/sysdeps/unix/sysv/linux/dl-parse_auxv.h b/sysdeps/unix/sysv/linux/dl-parse_auxv.h
index bf9374371e..2bf3a0ca6b 100644
--- a/sysdeps/unix/sysv/linux/dl-parse_auxv.h
+++ b/sysdeps/unix/sysv/linux/dl-parse_auxv.h
@@ -21,6 +21,7 @@
 #include <fpu_control.h>
 #include <ldsodefs.h>
 #include <link.h>
+#include <dl-auxv.h>  /* For DL_PLATFORM_AUXV  */
 
 typedef ElfW(Addr) dl_parse_auxv_t[AT_MINSIGSTKSZ + 1];
 
-- 
2.34.1

--- End Message ---

--- End Message ---
--- Begin Message ---
Source: glibc
Source-Version: 2.36-9+deb12u1
Done: Aurelien Jarno <aurel32@debian.org>

We believe that the bug you reported is fixed in the latest version of
glibc, which is due to be installed in the Debian FTP archive.

A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to 1028200@bugs.debian.org,
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Aurelien Jarno <aurel32@debian.org> (supplier of updated glibc package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing ftpmaster@ftp-master.debian.org)


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Thu, 13 Jul 2023 20:07:47 +0200
Source: glibc
Architecture: source
Version: 2.36-9+deb12u1
Distribution: bookworm
Urgency: medium
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Changed-By: Aurelien Jarno <aurel32@debian.org>
Closes: 1028200
Changes:
 glibc (2.36-9+deb12u1) bookworm; urgency=medium
 .
   [ Aurelien Jarno ]
   * debian/patches/git-updates.diff: update from upstream stable branch:
     - Affecting bookworm release architectures:
       - Improve mcount overflow handling in gmon.
       - Fix a buffer overflow in gmon (CVE-2023-0687).
       - Fix a memory corruption when incorrectly calling gmon functions
         repeatedly on in wrong order.
       - Fix a deadlock in getaddrinfo (__check_pf) with deferred cancellation.
       - Fix y2038 support in strftime on 32-bit architectures.
       - Fix corner case parsing of /etc/gshadow which can return bad pointers
         causing segfaults in applications.
       - Fix a deadlock in system() when called concurrently from multiple
         threads.
       - cdefs: limit definition of fortification macros to __FORTIFY_LEVEL > 0
         to support old C90 compilers.
     - Not affecting bookworm release architectures:
       - Fix LFS POSIX lock constants for powerpc64.
       - Fix GL(dl_phdr) and GL(dl_phnum) for static builds.  Closes: #1028200.
     - Not affecting debian architectures:
       - Fix LFS POSIX lock constants on 32 bit arch with 64 bit default
         time_t.
     - No change in the generated code:
       - Fix asm constraints in amd64 version of feraiseexcept (bug not visible
         with GCC 12).
 .
   [ Andrej Shadura ]
   * debian/po/sk.po: Fix typos in the Slovak translation.
Checksums-Sha1:
 98fea0b876f70918284172264f1208ce5e8e0646 9761 glibc_2.36-9+deb12u1.dsc
 975732fd6b446bb038b7f8a20c83b53085e83aff 847736 glibc_2.36-9+deb12u1.debian.tar.xz
 9bbeb69bb6307a2c1ec0c8204201a5234eb73e1d 9365 glibc_2.36-9+deb12u1_source.buildinfo
Checksums-Sha256:
 03836129b0adc6e3aba725e59f9c5fb220c152c1366a7ecbe6eeb7bd0b67df1e 9761 glibc_2.36-9+deb12u1.dsc
 8986cea1e8592d804d21f21162b4cfabb782164098b156d9422f962cef79b1be 847736 glibc_2.36-9+deb12u1.debian.tar.xz
 c64c2fedd289c20c2235c353d22de2e6a21c06ee5034075430836aefb23a7643 9365 glibc_2.36-9+deb12u1_source.buildinfo
Files:
 28363985035cd0f0e1d8dec688da917f 9761 libs required glibc_2.36-9+deb12u1.dsc
 cc76b3433a846a278da8a01d5f14d550 847736 libs required glibc_2.36-9+deb12u1.debian.tar.xz
 573913d588a73b9fbabbbc74c57d9931 9365 libs required glibc_2.36-9+deb12u1_source.buildinfo

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEUryGlb40+QrX1Ay4E4jA+JnoM2sFAmSwPhcACgkQE4jA+Jno
M2tK1BAAnRCy8p+ymJgq0zDJw0YsccDd9zNmS7qNKG9Sac+cXL8d0Zcp/9oQ95uL
nCZ7gOzGoClJCQeViN/9+dQFpVJr7uuXl8swTifWRQSRKgDNyVRJ5pQ4ZXFDSGAa
RH20ZwLPshUZ3XawRxJoEcEbkTgr31mwZgjBrxzJGscLqQRGvK/4w1TgbVyklXW1
JWgzjr4+ITD9Xjh6QQXZEPk/A4UF7KrHSoQu5xjabDKk8phFpPWz3/Bp9OCnxz/O
PWNywgX+TeFA48TPygzU2r9FjmHRNTl9bX9aAlCnqrR70daqAnFndE3YjdbnuHuF
1ueg74h7MsMFBHdI+tyMeovl8v2n4rhOnztwLEmF8sBC+uqxy1P5VdOXAOlYSWMT
4/UFbDFJhDobrkTDM9WQF3XQNVe3+Wb5nPJyyjwqR2/YEUXOXsyqVI3QpASYTv6+
pJKgNfSw36Hl5suB6gWBbdHTyqoX3KoWpQrgMtKqku2NnTRPT+t2xNaRyshL/EpG
BzueBtk7MewvS031qRR4jgWRzqKuv3NjdrB8g6Ekmf8mJA0FrBAOGtv0fr5RDSnd
s/J/9Fp2XOBiN5gLEWG650SFITagzAHRqZ+u6rH6Ki5ZZU3px7HJaeZgLJLVIAVs
ncSELy075dcJGAMvUDZTt+GZELYugakyJmkQnQeFWAdkvh4O6YI=
=jZWC
-----END PGP SIGNATURE-----

--- End Message ---

Reply to: