diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | elf/Makefile | 3 | ||||
-rw-r--r-- | elf/dl-load.c | 5 | ||||
-rw-r--r-- | elf/dl-support.c | 4 | ||||
-rw-r--r-- | elf/rtld.c | 9 | ||||
-rw-r--r-- | sysdeps/generic/ldsodefs.h | 5 |
6 files changed, 31 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index cede7b8ee3..80b38fc2ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2012-04-10 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. + 2012-04-09 Joseph Myers <joseph@codesourcery.com> [BZ #13872] diff --git a/elf/Makefile b/elf/Makefile index 59a3936a1b..a77e792cb4 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1995-2011, 2012 Free Software Foundation, Inc. +# Copyright (C) 1995-2012 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -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 41d48ee138..fe83f87eb9 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1,5 +1,5 @@ /* Map in a shared object's segments from the file. - Copyright (C) 1995-2007, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1995-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -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 565f342e6b..a0f2122071 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -1,5 +1,5 @@ /* Support for dynamic linking code in static libc. - Copyright (C) 1996-2008,2009,2010,2011 Free Software Foundation, Inc. + Copyright (C) 1996-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -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 0362b14968..88a340d1ee 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 9955430e3c..602b429cea 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -1,5 +1,5 @@ /* Run-time dynamic linker data structures for loaded ELF shared objects. - Copyright (C) 1995-2009, 2010, 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 1995-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -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; |