Merge commit 'fde8642fc43bdd224e43e5ee9583a49a758fb03c'
* commit 'fde8642fc43bdd224e43e5ee9583a49a758fb03c':
bionic/linker: keep track of opened libraries by basename
Merge commit '22b5eb858dcbb537f2522ad920ca793348d574a2'
* commit '22b5eb858dcbb537f2522ad920ca793348d574a2':
linker: remove newlines from DL_ERR so that dlerror works correctly
Prior to this change, the dynamic loader kept track of opened libraries
either by their base name (i.e., libfoo.so instead of /system/lib/libfoo.so)
when the shared library was loaded through the DT_NEEDED tag in an ELF header,
or by whatever name was passed to dlopen(). This created a number of problems,
among which:
1. dlopen("libfoo.so") and dlopen("/path/to/libfoo.so") would open the same
library twice;
2. dlopen("/path/to/libfoo.so") and then dlopen("libbar.so"), where libbar.so
depends on libfoo.so, would open libfoo.so twice.
This patch makes the dynamic loader keep track of each loaded library by
basename, which resolves the above ambiguity. The patch also enforces
library lookup by base name, which means that it will refuse to load another
library that has the same name.
Thanks for the inspiration Iliyan.
Signed-off-by: Erik Gilling <konkers@android.com>
Cc: Iliyan Malchev <malchev@google.com>
Merge commit '3773d35eb98e22b5edab4d82fb72bdf86ff80494'
* commit '3773d35eb98e22b5edab4d82fb72bdf86ff80494':
Make the DNS resolver accept domain names with an underscore.
More precisely, this accepts domain labels with an underscore in
the middle (i.e. not at the start or the end of the label). This
is needed to perform complex CNAME chain resolution in certain
VPN networks.
Some libc changes were preventing the initialization call from being made.
The basic problem appears to be that libc_init_common.c is only built once,
and it's only built for the non-debug libc.
Merge commit 'ef0bd1857041ffde069cf52138aaf22c1af7130e'
* commit 'ef0bd1857041ffde069cf52138aaf22c1af7130e':
Pass the elfdata pointer in a slot of the temporary TLS area.
This allows libc.so to run the C runtime initializer as soon as the
dynamic linker loads the shared library, i.e. before any other initializers
(e.g. static C++ constructors in other shared libraries the executable depends
on).
This also removes the bug where the initializers from the executable itself
were run twice: once by the dynamic linker, and another time by __libc_init
as defined by libc_init_dynamic.c
This is needed to properly initialize the C runtime when libc.so
is loaded by the dynamic linker.
Move the temporary TLS setup before the first system call, just
in case something really horrible happens, we won't crash when
trying to write an error code in 'errno'
Remove the broken TLS_SLOT_THREAD_ID setup. First, this slot
should normally receive the address of a pthread_internal_t,
not a kernel thread identifier. Second, it is never used by
the linker anyway.
Also remove an obsolete comment.
Merge commit 'c4eee3765bf9dd81ff055e70ff7daa83a3926d2a'
* commit 'c4eee3765bf9dd81ff055e70ff7daa83a3926d2a':
Prevent a crash in the memory leak checker (which happened in chk_free())
Simplify the code a little, removing un-necessary mutex locks/unlocks.
Provide slightly better diagnostic message in case of corruption.
Use snprintf/strlcat instead of sprintf/strcat
Merge commit '09baf4e881c78e67c7849aa81432ceb34e72e913'
* commit '09baf4e881c78e67c7849aa81432ceb34e72e913':
Add Glibc-compatible macro aliases for the nanosecond time accessors in stat structure