]> sourceware.org Git - glibc.git/commit
elf: Move vDSO setup to rtld (BZ#24967)
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 29 Nov 2019 13:44:59 +0000 (10:44 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 3 Jan 2020 14:22:07 +0000 (11:22 -0300)
commit1bdda52fe92fd01b424cd6fbb63e3df96a95015c
treed25214e63bf5c96ab48c11ec0df28b5d96ca99da
parent57013650f7e796428ac2c0b7512757e99327bfc9
elf: Move vDSO setup to rtld (BZ#24967)

This patch moves the vDSO setup from libc to loader code, just after
the vDSO link_map setup.  For static case the initialization
is moved to _dl_non_dynamic_init instead.

Instead of using the mangled pointer, the vDSO data is set as
attribute_relro (on _rtld_global_ro for shared or _dl_vdso_* for
static).  It is read-only even with partial relro.

It fixes BZ#24967 now that the vDSO pointer is setup earlier than
malloc interposition is called.

Also, vDSO calls should not be a problem for static dlopen as
indicated by BZ#20802.  The vDSO pointer would be zero-initialized
and the syscall will be issued instead.

Checked on x86_64-linux-gnu, i686-linux-gnu, aarch64-linux-gnu,
arm-linux-gnueabihf, powerpc64le-linux-gnu, powerpc64-linux-gnu,
powerpc-linux-gnu, s390x-linux-gnu, sparc64-linux-gnu, and
sparcv9-linux-gnu.  I also run some tests on mips.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
31 files changed:
csu/init-first.c
elf/dl-support.c
elf/rtld.c
malloc/tst-interpose-aux.c
sysdeps/generic/dl-vdso-setup.c [new file with mode: 0644]
sysdeps/generic/dl-vdso-setup.h [new file with mode: 0644]
sysdeps/generic/dl-vdso.h [new file with mode: 0644]
sysdeps/generic/ldsodefs.h
sysdeps/powerpc/powerpc32/backtrace.c
sysdeps/powerpc/powerpc64/backtrace.c
sysdeps/unix/sysv/linux/aarch64/Makefile
sysdeps/unix/sysv/linux/arm/Makefile
sysdeps/unix/sysv/linux/dl-vdso-setup.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/dl-vdso-setup.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/dl-vdso.c [deleted file]
sysdeps/unix/sysv/linux/dl-vdso.h
sysdeps/unix/sysv/linux/gettimeofday.c
sysdeps/unix/sysv/linux/init-first.c [deleted file]
sysdeps/unix/sysv/linux/libc-vdso.h
sysdeps/unix/sysv/linux/mips/Makefile
sysdeps/unix/sysv/linux/powerpc/Makefile
sysdeps/unix/sysv/linux/powerpc/get_timebase_freq.c
sysdeps/unix/sysv/linux/powerpc/init-first.c [deleted file]
sysdeps/unix/sysv/linux/powerpc/libc-vdso.h
sysdeps/unix/sysv/linux/riscv/Makefile
sysdeps/unix/sysv/linux/riscv/flush-icache.c
sysdeps/unix/sysv/linux/s390/Makefile
sysdeps/unix/sysv/linux/sparc/Makefile
sysdeps/unix/sysv/linux/sysdep-vdso.h
sysdeps/unix/sysv/linux/time.c
sysdeps/unix/sysv/linux/x86/Makefile
This page took 0.052445 seconds and 5 git commands to generate.