浏览代码

fix dlsym RTLD_NEXT support

previously this was being handled the same as a library-specific,
dependency-order lookup on the next library in the global chain, which
is likely to be utterly meaningless. instead the lookup needs to be in
the global namespace, but omitting the initial portion of the global
library chain up through the calling library.
Rich Felker 12 年之前
父节点
当前提交
d93e028c6b
共有 1 个文件被更改,包括 3 次插入1 次删除
  1. 3 1
      src/ldso/dynlink.c

+ 3 - 1
src/ldso/dynlink.c

@@ -766,7 +766,9 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra)
 	if (p == RTLD_NEXT) {
 		for (p=head; p && (unsigned char *)ra-p->map>p->map_len; p=p->next);
 		if (!p) p=head;
-		p=p->next;
+		void *res = find_sym(p->next, s, 0);
+		if (!res) goto failed;
+		return res;
 	}
 	if (p == head || p == RTLD_DEFAULT) {
 		void *res = find_sym(head, s, 0);