1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-10-18 02:19:39 +00:00

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
This commit is contained in:
Maxim Sobolev 2002-10-19 10:18:29 +00:00
parent be23b71211
commit d1cf9ea2c4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=105439
2 changed files with 12 additions and 11 deletions

View File

@ -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 *

View File

@ -220,13 +220,12 @@ main(int argc, char *argv[])
}
break;
case 0:
if (is_shlib) {
if (dlopen(*argv, RTLD_TRACE))
_exit(0); /* libc.so */
warnx("%s: %s", *argv, dlerror());
} else {
if (is_shlib == 0) {
execl(*argv, *argv, (char *)NULL);
warn("%s", *argv);
} else {
dlopen(*argv, RTLD_TRACE);
warnx("%s: %s", *argv, dlerror());
}
_exit(1);
}