diff options
author | Maxim Sobolev <sobomax@FreeBSD.org> | 2002-10-19 10:18:29 +0000 |
---|---|---|
committer | Maxim Sobolev <sobomax@FreeBSD.org> | 2002-10-19 10:18:29 +0000 |
commit | d1cf9ea2c4d424f77e8ed5efa5a8c3a2b1db219d (patch) | |
tree | eb76b8b78adf2027e2a011436c20f37be602a2cf /libexec | |
parent | be23b71211eae43b2f4bbddb9213ea0cb3d0d083 (diff) | |
download | src-d1cf9ea2c4d424f77e8ed5efa5a8c3a2b1db219d.tar.gz src-d1cf9ea2c4d424f77e8ed5efa5a8c3a2b1db219d.zip |
Fix a problem with RTLD_TRACE flag to dlopen(3), which sometimes can return
even if there was no error occured (when trying to dlopen(3) object that
already linked into executable which does dlopen(3) call). This is more
proper fix for `ldd /usr/lib/libc.so' problem, because the new behaviour
conforms to documentation.
Remove workaround from ldd.c (rev.1.32).
PR: 35099
Submitted by: Nathan Hawkins <utsl@quic.net>
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=105439
Diffstat (limited to 'libexec')
-rw-r--r-- | libexec/rtld-elf/rtld.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index a007ff5c1d1b..d7f243ac8e52 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -1605,11 +1605,8 @@ dlopen(const char *name, int mode) assert(*old_obj_tail == obj); result = load_needed_objects(obj); - if (result != -1 && ld_tracing) { - trace_loaded_objects(obj); - wlock_release(); - exit(0); - } + if (result != -1 && ld_tracing) + goto trace; if (result == -1 || (init_dag(obj), relocate_objects(obj, mode == RTLD_NOW, @@ -1623,7 +1620,8 @@ dlopen(const char *name, int mode) /* Make list of init functions to call. */ initlist_add_objects(obj, &obj->next, &initlist); } - } + } else if (ld_tracing) + goto trace; } GDB_STATE(RT_CONSISTENT,obj ? &obj->linkmap : NULL); @@ -1635,6 +1633,10 @@ dlopen(const char *name, int mode) objlist_clear(&initlist); wlock_release(); return obj; +trace: + trace_loaded_objects(obj); + wlock_release(); + exit(0); } void * |