提交 54482898 编写于 作者: B Bobby Bingham 提交者: Rich Felker

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.
上级 b418ea1b
...@@ -1550,7 +1550,7 @@ _Noreturn void __dls3(size_t *sp) ...@@ -1550,7 +1550,7 @@ _Noreturn void __dls3(size_t *sp)
} }
/* Attach to vdso, if provided by the kernel */ /* 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; Ehdr *ehdr = (void *)vdso_base;
Phdr *phdr = vdso.phdr = (void *)(vdso_base + ehdr->e_phoff); Phdr *phdr = vdso.phdr = (void *)(vdso_base + ehdr->e_phoff);
vdso.phnum = ehdr->e_phnum; vdso.phnum = ehdr->e_phnum;
......
...@@ -45,6 +45,7 @@ void *__vdsosym(const char *vername, const char *name) ...@@ -45,6 +45,7 @@ void *__vdsosym(const char *vername, const char *name)
size_t i; size_t i;
for (i=0; libc.auxv[i] != AT_SYSINFO_EHDR; i+=2) for (i=0; libc.auxv[i] != AT_SYSINFO_EHDR; i+=2)
if (!libc.auxv[i]) return 0; if (!libc.auxv[i]) return 0;
if (!libc.auxv[i+1]) return 0;
Ehdr *eh = (void *)libc.auxv[i+1]; Ehdr *eh = (void *)libc.auxv[i+1];
Phdr *ph = (void *)((char *)eh + eh->e_phoff); Phdr *ph = (void *)((char *)eh + eh->e_phoff);
size_t *dynv=0, base=-1; size_t *dynv=0, base=-1;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册