Re: Update on the glibc segfault issue on Alpha
Adhemerval Zanella Netto via Libc-alpha <[email protected]> Tue, 3 Jan 2023 09:09:04 -0300
| Newsgroups | gmane.comp.lib.glibc.alpha,gmane.linux.debian.ports.alpha,gmane.linux.gentoo.alpha |
|---|---|
| Organization | Linaro |
| Message-ID | <[email protected]> |
On 02/01/23 14:37, John Paul Adrian Glaubitz wrote: > Hello! > > On 1/2/23 12:44, John Paul Adrian Glaubitz wrote: >> Adhemerval from glibc upstream is aware of the problem but he has not found yet a solution >> to this issue as it needs to be debugged further. I will try to bisect which particular >> introduced the regression and file a new upstream bug report. >> >> During our discussion, Adhemerval pointed out that this change [3] might be the culprit >> but I have not been able to verify this yet. > > My latest bisecting has shown this change to be the responsible change, CC'ing the author: > > commit 73fc4e28b9464f0e13edc719a5372839970e7ddb (refs/bisect/bad) > Author: Florian Weimer <[email protected]> > Date: Mon Feb 28 11:50:41 2022 +0100 > > Linux: Consolidate auxiliary vector parsing (redo) > And optimize it slightly. > This is commit 8c8510ab2790039e58995ef3a22309582413d3ff revised. > In _dl_aux_init in elf/dl-support.c, use an explicit loop > and -fno-tree-loop-distribute-patterns to avoid memset. > Reviewed-by: Szabolcs Nagy <[email protected]> Thanks, this commits helps narrow down the issue. The 73fc4e28b9464f0e refactor did not add the GL(dl_phdr) and GL(dl_phnum) for static case, relying on the __ehdr_start symbol to get the correct values. The issue is for some archs, alpha for instance, the hidden weak reference is not making the static linker to define the __ehdr_start address correctly: it is being set to 0 and thus GL(dl_phdr) and GL(dl_phnum) are set to invalid values. And I am not sure if the hidden weak __ehdr_start does work on all architectures, so I think it would be safer to just restore the previous behavior to setup GL(dl_phdr) and GL(dl_phnum) for static and we can simplify __ehdr_start fallback case to not use a weak ref (as for PIE). I am checking if the following patch trigger any regression, at least for alpha it fixes the static failures: diff --git a/csu/libc-start.c b/csu/libc-start.c index 543560f36c..63a3eceaea 100644 --- a/csu/libc-start.c +++ b/csu/libc-start.c @@ -271,18 +271,10 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), 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; - } + extern const ElfW(Ehdr) __ehdr_start attribute_hidden; + 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/sysdeps/unix/sysv/linux/dl-parse_auxv.h b/sysdeps/unix/sysv/linux/dl-parse_auxv.h index bf9374371e..5913c9d6e5 100644 --- a/sysdeps/unix/sysv/linux/dl-parse_auxv.h +++ b/sysdeps/unix/sysv/linux/dl-parse_auxv.h @@ -56,6 +56,10 @@ void _dl_parse_auxv (ElfW(auxv_t) *av, dl_parse_auxv_t auxv_values) if (GLRO(dl_sysinfo_dso) != NULL) GLRO(dl_sysinfo) = auxv_values[AT_SYSINFO]; #endif +#ifndef SHARED + GL(dl_phdr) = (void*) auxv_values[AT_PHDR]; + GL(dl_phnum) = auxv_values[AT_PHENT]; +#endif DL_PLATFORM_AUXV }