mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 14:50:05 +00:00
Update.
* elf/dl-deps.c (struct openaux_args): Add open_mode element. (openaux): Pass open_mode as new last argument to _dl_map_object. (_dl_map_object_deps): Add new argument open_mode. Initialize open_mode element of args variable with it. * elf/dl-open.c (dl_open_worker): Pass __RTLD_DLOPEN flag is set to _dl_map_object_deps. * elf/rtld.c (dl_main): Add zero as last parameter to _dl_map_object_deps call. * sysdeps/generic/ldsodefs.h: Adjust prototype of _dl_map_object_deps. * elf/nodlopen2.c: New file. * elf/nodlopenmod2.c: New file. * elf/Makefile: Add rules to build and run nodlopen2. * elf/tls-macros.hgg: ...here. New file. 2002-02-08 Richard Henderson <rth@redhat.com>
This commit is contained in:
parent
2cef4257d0
commit
87837aace9
17
ChangeLog
17
ChangeLog
@ -1,7 +1,20 @@
|
|||||||
2002-02-10 Ulrich Drepper <drepper@redhat.com>
|
2002-02-10 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* elf/dl-deps.c (struct openaux_args): Add open_mode element.
|
||||||
|
(openaux): Pass open_mode as new last argument to _dl_map_object.
|
||||||
|
(_dl_map_object_deps): Add new argument open_mode. Initialize
|
||||||
|
open_mode element of args variable with it.
|
||||||
|
* elf/dl-open.c (dl_open_worker): Pass __RTLD_DLOPEN flag is set to
|
||||||
|
_dl_map_object_deps.
|
||||||
|
* elf/rtld.c (dl_main): Add zero as last parameter to
|
||||||
|
_dl_map_object_deps call.
|
||||||
|
* sysdeps/generic/ldsodefs.h: Adjust prototype of _dl_map_object_deps.
|
||||||
|
* elf/nodlopen2.c: New file.
|
||||||
|
* elf/nodlopenmod2.c: New file.
|
||||||
|
* elf/Makefile: Add rules to build and run nodlopen2.
|
||||||
|
|
||||||
* elf/tst-tls1.c: Move TLS helper macros to...
|
* elf/tst-tls1.c: Move TLS helper macros to...
|
||||||
* elf/tls-macros.h: ...here. New file.
|
* elf/tls-macros.hgg: ...here. New file.
|
||||||
* elf/tst-tls2.c: New file.
|
* elf/tst-tls2.c: New file.
|
||||||
* elf/Makefile (tests): Add tst-tls2.
|
* elf/Makefile (tests): Add tst-tls2.
|
||||||
(distribute): Add tls-macros.h.
|
(distribute): Add tls-macros.h.
|
||||||
@ -27,7 +40,7 @@
|
|||||||
* sysdeps/generic/dl-tls.c (_dl_allocate_tls): Correctly terminate
|
* sysdeps/generic/dl-tls.c (_dl_allocate_tls): Correctly terminate
|
||||||
loop to initialize TLS block.
|
loop to initialize TLS block.
|
||||||
|
|
||||||
2002-02-08 Richard Henderson <rth@twiddle.net>
|
2002-02-08 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
* sysdeps/generic/ldsodefs.h (struct rtld_global): Also include
|
* sysdeps/generic/ldsodefs.h (struct rtld_global): Also include
|
||||||
_dl_cpuclock_offset if HP_SMALL_TIMING_AVAIL.
|
_dl_cpuclock_offset if HP_SMALL_TIMING_AVAIL.
|
||||||
|
@ -122,7 +122,7 @@ tests = loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
|
|||||||
test-srcs = tst-pathopt
|
test-srcs = tst-pathopt
|
||||||
tests-vis-yes = vismain
|
tests-vis-yes = vismain
|
||||||
tests-nodelete-yes = nodelete
|
tests-nodelete-yes = nodelete
|
||||||
tests-nodlopen-yes = nodlopen
|
tests-nodlopen-yes = nodlopen nodlopen2
|
||||||
endif
|
endif
|
||||||
modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||||
testobj1_1 failobj constload2 constload3 unloadmod \
|
testobj1_1 failobj constload2 constload3 unloadmod \
|
||||||
@ -138,7 +138,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
|||||||
reldep6mod0 reldep6mod1 reldep6mod2 reldep6mod3 reldep6mod4
|
reldep6mod0 reldep6mod1 reldep6mod2 reldep6mod3 reldep6mod4
|
||||||
modules-vis-yes = vismod1 vismod2 vismod3
|
modules-vis-yes = vismod1 vismod2 vismod3
|
||||||
modules-nodelete-yes = nodelmod1 nodelmod2 nodelmod3 nodelmod4
|
modules-nodelete-yes = nodelmod1 nodelmod2 nodelmod3 nodelmod4
|
||||||
modules-nodlopen-yes = nodlopenmod
|
modules-nodlopen-yes = nodlopenmod nodlopenmod2
|
||||||
extra-objs += $(addsuffix .os,$(strip $(modules-names)))
|
extra-objs += $(addsuffix .os,$(strip $(modules-names)))
|
||||||
|
|
||||||
include ../Rules
|
include ../Rules
|
||||||
@ -382,6 +382,10 @@ LDFLAGS-nodlopenmod.so = -Wl,--enable-new-dtags,-z,nodlopen
|
|||||||
$(objpfx)nodlopen: $(libdl)
|
$(objpfx)nodlopen: $(libdl)
|
||||||
$(objpfx)nodlopen.out: $(objpfx)nodlopenmod.so
|
$(objpfx)nodlopen.out: $(objpfx)nodlopenmod.so
|
||||||
|
|
||||||
|
$(objpfx)nodlopenmod2.so: $(objpfx)nodlopenmod.so
|
||||||
|
$(objpfx)nodlopen2: $(libdl)
|
||||||
|
$(objpfx)nodlopen2.out: $(objpfx)nodlopenmod2.so
|
||||||
|
|
||||||
$(objpfx)filtmod1.so: $(objpfx)filtmod1.os $(objpfx)filtmod2.so
|
$(objpfx)filtmod1.so: $(objpfx)filtmod1.os $(objpfx)filtmod2.so
|
||||||
$(LINK.o) -shared -o $@ -B$(csu-objpfx) $(LDFLAGS.so) \
|
$(LINK.o) -shared -o $@ -B$(csu-objpfx) $(LDFLAGS.so) \
|
||||||
-L$(subst :, -L,$(rpath-link)) \
|
-L$(subst :, -L,$(rpath-link)) \
|
||||||
|
@ -47,6 +47,7 @@ struct openaux_args
|
|||||||
/* The arguments to openaux. */
|
/* The arguments to openaux. */
|
||||||
struct link_map *map;
|
struct link_map *map;
|
||||||
int trace_mode;
|
int trace_mode;
|
||||||
|
int open_mode;
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
@ -62,7 +63,7 @@ openaux (void *a)
|
|||||||
args->aux = INTUSE(_dl_map_object) (args->map, args->name, 0,
|
args->aux = INTUSE(_dl_map_object) (args->map, args->name, 0,
|
||||||
(args->map->l_type == lt_executable
|
(args->map->l_type == lt_executable
|
||||||
? lt_library : args->map->l_type),
|
? lt_library : args->map->l_type),
|
||||||
args->trace_mode, 0);
|
args->trace_mode, args->open_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ptrdiff_t
|
static ptrdiff_t
|
||||||
@ -107,8 +108,8 @@ struct list
|
|||||||
\
|
\
|
||||||
/* DST must not appear in SUID/SGID programs. */ \
|
/* DST must not appear in SUID/SGID programs. */ \
|
||||||
if (__libc_enable_secure) \
|
if (__libc_enable_secure) \
|
||||||
INTUSE(_dl_signal_error) (0, __str, NULL, \
|
INTUSE(_dl_signal_error) (0, __str, NULL, N_("\
|
||||||
N_("DST not allowed in SUID/SGID programs"));\
|
DST not allowed in SUID/SGID programs")); \
|
||||||
\
|
\
|
||||||
__newp = (char *) alloca (DL_DST_REQUIRED (l, __str, strlen (__str), \
|
__newp = (char *) alloca (DL_DST_REQUIRED (l, __str, strlen (__str), \
|
||||||
__cnt)); \
|
__cnt)); \
|
||||||
@ -141,7 +142,7 @@ void
|
|||||||
internal_function
|
internal_function
|
||||||
_dl_map_object_deps (struct link_map *map,
|
_dl_map_object_deps (struct link_map *map,
|
||||||
struct link_map **preloads, unsigned int npreloads,
|
struct link_map **preloads, unsigned int npreloads,
|
||||||
int trace_mode)
|
int trace_mode, int open_mode)
|
||||||
{
|
{
|
||||||
struct list known[1 + npreloads + 1];
|
struct list known[1 + npreloads + 1];
|
||||||
struct list *runp, *tail;
|
struct list *runp, *tail;
|
||||||
@ -225,6 +226,7 @@ _dl_map_object_deps (struct link_map *map,
|
|||||||
args.strtab = strtab;
|
args.strtab = strtab;
|
||||||
args.map = l;
|
args.map = l;
|
||||||
args.trace_mode = trace_mode;
|
args.trace_mode = trace_mode;
|
||||||
|
args.open_mode = open_mode;
|
||||||
orig = runp;
|
orig = runp;
|
||||||
|
|
||||||
for (d = l->l_ld; d->d_tag != DT_NULL; ++d)
|
for (d = l->l_ld; d->d_tag != DT_NULL; ++d)
|
||||||
@ -292,14 +294,15 @@ _dl_map_object_deps (struct link_map *map,
|
|||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS,
|
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS,
|
||||||
0))
|
0))
|
||||||
INTUSE(_dl_debug_printf) ("load auxiliary object=%s"
|
INTUSE(_dl_debug_printf) ("load auxiliary object=%s"
|
||||||
" requested by file=%s\n", name,
|
" requested by file=%s\n",
|
||||||
|
name,
|
||||||
l->l_name[0]
|
l->l_name[0]
|
||||||
? l->l_name : _dl_argv[0]);
|
? l->l_name : _dl_argv[0]);
|
||||||
|
|
||||||
/* We must be prepared that the addressed shared
|
/* We must be prepared that the addressed shared
|
||||||
object is not available. */
|
object is not available. */
|
||||||
err = INTUSE(_dl_catch_error) (&objname, &errstring, openaux,
|
err = INTUSE(_dl_catch_error) (&objname, &errstring,
|
||||||
&args);
|
openaux, &args);
|
||||||
if (__builtin_expect (errstring != NULL, 0))
|
if (__builtin_expect (errstring != NULL, 0))
|
||||||
{
|
{
|
||||||
/* We are not interested in the error message. */
|
/* We are not interested in the error message. */
|
||||||
@ -319,13 +322,14 @@ _dl_map_object_deps (struct link_map *map,
|
|||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS,
|
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS,
|
||||||
0))
|
0))
|
||||||
INTUSE(_dl_debug_printf) ("load filtered object=%s"
|
INTUSE(_dl_debug_printf) ("load filtered object=%s"
|
||||||
" requested by file=%s\n", name,
|
" requested by file=%s\n",
|
||||||
|
name,
|
||||||
l->l_name[0]
|
l->l_name[0]
|
||||||
? l->l_name : _dl_argv[0]);
|
? l->l_name : _dl_argv[0]);
|
||||||
|
|
||||||
/* For filter objects the dependency must be available. */
|
/* For filter objects the dependency must be available. */
|
||||||
err = INTUSE(_dl_catch_error) (&objname, &errstring, openaux,
|
err = INTUSE(_dl_catch_error) (&objname, &errstring,
|
||||||
&args);
|
openaux, &args);
|
||||||
if (__builtin_expect (errstring != NULL, 0))
|
if (__builtin_expect (errstring != NULL, 0))
|
||||||
{
|
{
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -158,7 +158,7 @@ dl_open_worker (void *a)
|
|||||||
|
|
||||||
/* Maybe we have to expand a DST. */
|
/* Maybe we have to expand a DST. */
|
||||||
dst = strchr (file, '$');
|
dst = strchr (file, '$');
|
||||||
if (dst != NULL)
|
if (__builtin_expect (dst != NULL, 0))
|
||||||
{
|
{
|
||||||
const void *caller = args->caller;
|
const void *caller = args->caller;
|
||||||
size_t len = strlen (file);
|
size_t len = strlen (file);
|
||||||
@ -208,8 +208,7 @@ dl_open_worker (void *a)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Load the named object. */
|
/* Load the named object. */
|
||||||
args->map = new = _dl_map_object (NULL, file, 0, lt_loaded, 0,
|
args->map = new = _dl_map_object (NULL, file, 0, lt_loaded, 0, mode);
|
||||||
mode);
|
|
||||||
|
|
||||||
/* If the pointer returned is NULL this means the RTLD_NOLOAD flag is
|
/* If the pointer returned is NULL this means the RTLD_NOLOAD flag is
|
||||||
set and the object is not already loaded. */
|
set and the object is not already loaded. */
|
||||||
@ -243,7 +242,7 @@ dl_open_worker (void *a)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Load that object's dependencies. */
|
/* Load that object's dependencies. */
|
||||||
_dl_map_object_deps (new, NULL, 0, 0);
|
_dl_map_object_deps (new, NULL, 0, 0, mode & __RTLD_DLOPEN);
|
||||||
|
|
||||||
/* So far, so good. Now check the versions. */
|
/* So far, so good. Now check the versions. */
|
||||||
for (i = 0; i < new->l_searchlist.r_nlist; ++i)
|
for (i = 0; i < new->l_searchlist.r_nlist; ++i)
|
||||||
@ -413,7 +412,7 @@ _dl_open (const char *file, int mode, const void *caller)
|
|||||||
/* Release the lock. */
|
/* Release the lock. */
|
||||||
__libc_lock_unlock_recursive (GL(dl_load_lock));
|
__libc_lock_unlock_recursive (GL(dl_load_lock));
|
||||||
|
|
||||||
if (errstring)
|
if (__builtin_expect (errstring != NULL, 0))
|
||||||
{
|
{
|
||||||
/* Some error occurred during loading. */
|
/* Some error occurred during loading. */
|
||||||
char *local_errstring;
|
char *local_errstring;
|
||||||
|
15
elf/nodlopen2.c
Normal file
15
elf/nodlopen2.c
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#include <dlfcn.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
if (dlopen ("nodlopenmod2.so", RTLD_LAZY) != NULL)
|
||||||
|
{
|
||||||
|
puts ("opening \"nodlopenmod2.so\" succeeded, FAIL");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
puts ("opening \"nodlopenmod2.so\" failed, OK");
|
||||||
|
return 0;
|
||||||
|
}
|
7
elf/nodlopenmod2.c
Normal file
7
elf/nodlopenmod2.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
extern int a;
|
||||||
|
|
||||||
|
int
|
||||||
|
foo (void)
|
||||||
|
{
|
||||||
|
return a;
|
||||||
|
}
|
13
elf/rtld.c
13
elf/rtld.c
@ -821,8 +821,9 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
&& (__builtin_expect (! __libc_enable_secure, 1)
|
&& (__builtin_expect (! __libc_enable_secure, 1)
|
||||||
|| strchr (p, '/') == NULL))
|
|| strchr (p, '/') == NULL))
|
||||||
{
|
{
|
||||||
struct link_map *new_map = INTUSE(_dl_map_object) (GL(dl_loaded), p,
|
struct link_map *new_map = INTUSE(_dl_map_object) (GL(dl_loaded),
|
||||||
1, lt_library,
|
p, 1,
|
||||||
|
lt_library,
|
||||||
0, 0);
|
0, 0);
|
||||||
if (++new_map->l_opencount == 1)
|
if (++new_map->l_opencount == 1)
|
||||||
/* It is no duplicate. */
|
/* It is no duplicate. */
|
||||||
@ -903,8 +904,9 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
if (problem != NULL)
|
if (problem != NULL)
|
||||||
{
|
{
|
||||||
char *p = strndupa (problem, file_size - (problem - file));
|
char *p = strndupa (problem, file_size - (problem - file));
|
||||||
struct link_map *new_map = INTUSE(_dl_map_object) (GL(dl_loaded), p, 1,
|
struct link_map *new_map = INTUSE(_dl_map_object) (GL(dl_loaded), p,
|
||||||
lt_library, 0, 0);
|
1, lt_library,
|
||||||
|
0, 0);
|
||||||
if (++new_map->l_opencount == 1)
|
if (++new_map->l_opencount == 1)
|
||||||
/* It is no duplicate. */
|
/* It is no duplicate. */
|
||||||
++npreloads;
|
++npreloads;
|
||||||
@ -937,7 +939,8 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
specified some libraries to load, these are inserted before the actual
|
specified some libraries to load, these are inserted before the actual
|
||||||
dependencies in the executable's searchlist for symbol resolution. */
|
dependencies in the executable's searchlist for symbol resolution. */
|
||||||
HP_TIMING_NOW (start);
|
HP_TIMING_NOW (start);
|
||||||
INTUSE(_dl_map_object_deps) (GL(dl_loaded), preloads, npreloads, mode == trace);
|
INTUSE(_dl_map_object_deps) (GL(dl_loaded), preloads, npreloads,
|
||||||
|
mode == trace, 0);
|
||||||
HP_TIMING_NOW (stop);
|
HP_TIMING_NOW (stop);
|
||||||
HP_TIMING_DIFF (diff, start, stop);
|
HP_TIMING_DIFF (diff, start, stop);
|
||||||
HP_TIMING_ACCUM_NT (load_time, diff);
|
HP_TIMING_ACCUM_NT (load_time, diff);
|
||||||
|
@ -462,12 +462,13 @@ extern struct link_map *_dl_map_object_internal (struct link_map *loader,
|
|||||||
but before its dependencies. */
|
but before its dependencies. */
|
||||||
extern void _dl_map_object_deps (struct link_map *map,
|
extern void _dl_map_object_deps (struct link_map *map,
|
||||||
struct link_map **preloads,
|
struct link_map **preloads,
|
||||||
unsigned int npreloads, int trace_mode)
|
unsigned int npreloads, int trace_mode,
|
||||||
|
int open_mode)
|
||||||
internal_function;
|
internal_function;
|
||||||
extern void _dl_map_object_deps_internal (struct link_map *map,
|
extern void _dl_map_object_deps_internal (struct link_map *map,
|
||||||
struct link_map **preloads,
|
struct link_map **preloads,
|
||||||
unsigned int npreloads,
|
unsigned int npreloads,
|
||||||
int trace_mode)
|
int trace_mode, int open_mode)
|
||||||
internal_function;
|
internal_function;
|
||||||
|
|
||||||
/* Cache the locations of MAP's hash table. */
|
/* Cache the locations of MAP's hash table. */
|
||||||
|
Loading…
Reference in New Issue
Block a user