This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH 1/3] New --inhibit-ldcache option to ld.so to prevent itform reading ld.so.cache
On Fri, 6 Apr 2012 09:37:05 -0700 (PDT)
Roland McGrath <roland@hack.frob.com> wrote:
> Call the option just --inhibit-cache and the variable
> _dl_inhibit_cache. Use string concatenation to use LD_SO_CACHE rather
> than a hard-coded name in the help text.
>
Thanks, updated patch attached.
--
Siddhesh
ChangeLog:
2012-04-09 Siddhesh Poyarekar <siddhesh@redhat.com>
* elf/dl-support.c (_dl_inhibit_cache): New variable.
* elf/rtld.c (_rtld_global_ro): New member
_dl_inhibit_cache. (dl_main): Handle --inhibit-cache.
* sysdeps/generic/ldsodefs.h (struct rtld_global_ro): New
member _dl_inhibit_cache
* elf/dl-load.c (_dl_map_object): Use it.
* elf/Makefile: Define SYSCONFDIR when building rtld.c.
---
elf/Makefile | 1 +
elf/dl-load.c | 3 ++-
elf/dl-support.c | 2 ++
elf/rtld.c | 9 +++++++++
sysdeps/generic/ldsodefs.h | 3 +++
5 files changed, 17 insertions(+), 1 deletions(-)
diff --git a/elf/Makefile b/elf/Makefile
index 59a3936..7453f17 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -419,6 +419,7 @@ CFLAGS-ldconfig.c = $(SYSCONF-FLAGS) -D'LIBDIR="$(libdir)"' \
-D'SLIBDIR="$(slibdir)"' -DIS_IN_ldconfig=1
CFLAGS-dl-cache.c = $(SYSCONF-FLAGS)
CFLAGS-cache.c = $(SYSCONF-FLAGS)
+CFLAGS-rtld.c = $(SYSCONF-FLAGS)
CPPFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),-DNOT_IN_libc=1 -DIS_IN_rtld=1)
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 41d48ee..d005244 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -2194,7 +2194,8 @@ _dl_map_object (struct link_map *loader, const char *name,
if (fd == -1
&& (__builtin_expect (! (mode & __RTLD_SECURE), 1)
- || ! INTUSE(__libc_enable_secure)))
+ || ! INTUSE(__libc_enable_secure))
+ && __builtin_expect (GLRO(dl_inhibit_cache) == 0, 1))
{
/* Check the list of libraries in the file /etc/ld.so.cache,
for compatibility with Linux's ldconfig program. */
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 565f342..5d5ab4a 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -107,6 +107,8 @@ void (*_dl_init_static_tls) (struct link_map *) = &_dl_nothread_init_static_tls;
size_t _dl_pagesize = EXEC_PAGESIZE;
+int _dl_inhibit_cache;
+
unsigned int _dl_osversion;
/* All known directories in sorted order. */
diff --git a/elf/rtld.c b/elf/rtld.c
index 0362b14..88a340d 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -161,6 +161,7 @@ struct rtld_global_ro _rtld_global_ro attribute_relro =
._dl_fpu_control = _FPU_DEFAULT,
._dl_pointer_guard = 1,
._dl_pagesize = EXEC_PAGESIZE,
+ ._dl_inhibit_cache = 0,
/* Function pointers. */
._dl_debug_printf = _dl_debug_printf,
@@ -973,6 +974,13 @@ dl_main (const ElfW(Phdr) *phdr,
--_dl_argc;
++INTUSE(_dl_argv);
}
+ else if (! strcmp (INTUSE(_dl_argv)[1], "--inhibit-cache"))
+ {
+ GLRO(dl_inhibit_cache) = 1;
+ ++_dl_skip_args;
+ --_dl_argc;
+ ++INTUSE(_dl_argv);
+ }
else if (! strcmp (INTUSE(_dl_argv)[1], "--library-path")
&& _dl_argc > 2)
{
@@ -1022,6 +1030,7 @@ of this helper program; chances are you did not intend to run this program.\n\
--list list all dependencies and how they are resolved\n\
--verify verify that given object really is a dynamically linked\n\
object we can handle\n\
+ --inhibit-cache Do not use " LD_SO_CACHE "\n\
--library-path PATH use given PATH instead of content of the environment\n\
variable LD_LIBRARY_PATH\n\
--inhibit-rpath LIST ignore RUNPATH and RPATH information in object names\n\
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 9955430..c9e17b9 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -560,6 +560,9 @@ struct rtld_global_ro
/* Cached value of `getpagesize ()'. */
EXTERN size_t _dl_pagesize;
+ /* Do we read from ld.so.cache? */
+ EXTERN int _dl_inhibit_cache;
+
/* Copy of the content of `_dl_main_searchlist' at startup time. */
EXTERN struct r_scope_elem _dl_initial_searchlist;
--
1.7.7.6