提交 92ab5d8d 编写于 作者: R Rich Felker

fix resolving symbols in objects loaded in RTLD_LOCAL mode

basically we temporarily make the library and all its dependencies
part of the global namespace but only for the duration of performing
relocations, then return them to their former state.
上级 59ab43f5
......@@ -493,6 +493,9 @@ void *dlopen(const char *file, int mode)
if (setjmp(rtld_fail)) {
/* Clean up anything new that was (partially) loaded */
if (p->deps) for (i=0; p->deps[i]; i++)
if (p->deps[i]->global < 0)
p->deps[i]->global = 0;
for (p=orig_tail->next; p; p=next) {
next = p->next;
munmap(p->map, p->map_len);
......@@ -511,7 +514,15 @@ void *dlopen(const char *file, int mode)
/* First load handling */
if (!p->deps) {
load_deps(p);
for (i=0; p->deps[i]; i++)
if (!p->deps[i]->global)
p->deps[i]->global = -1;
if (!p->global) p->global = -1;
reloc_all(p);
for (i=0; p->deps[i]; i++)
if (p->deps[i]->global < 0)
p->deps[i]->global = 0;
if (p->global < 0) p->global = 0;
}
if (mode & RTLD_GLOBAL) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册