mirror of git://git.musl-libc.org/musl
treat null vdso base same as missing
On s390x, the kernel provides AT_SYSINFO_EHDR, but sets it to zero, if the program being run does not have a program interpreter. This causes problems when running the dynamic linker directly.
This commit is contained in:
parent
b418ea1b66
commit
54482898ab
|
@ -1550,7 +1550,7 @@ _Noreturn void __dls3(size_t *sp)
|
|||
}
|
||||
|
||||
/* Attach to vdso, if provided by the kernel */
|
||||
if (search_vec(auxv, &vdso_base, AT_SYSINFO_EHDR)) {
|
||||
if (search_vec(auxv, &vdso_base, AT_SYSINFO_EHDR) && vdso_base) {
|
||||
Ehdr *ehdr = (void *)vdso_base;
|
||||
Phdr *phdr = vdso.phdr = (void *)(vdso_base + ehdr->e_phoff);
|
||||
vdso.phnum = ehdr->e_phnum;
|
||||
|
|
|
@ -45,6 +45,7 @@ void *__vdsosym(const char *vername, const char *name)
|
|||
size_t i;
|
||||
for (i=0; libc.auxv[i] != AT_SYSINFO_EHDR; i+=2)
|
||||
if (!libc.auxv[i]) return 0;
|
||||
if (!libc.auxv[i+1]) return 0;
|
||||
Ehdr *eh = (void *)libc.auxv[i+1];
|
||||
Phdr *ph = (void *)((char *)eh + eh->e_phoff);
|
||||
size_t *dynv=0, base=-1;
|
||||
|
|
Loading…
Reference in New Issue