diff mbox series

[RFC,v4,14/15] dlsym, dlvsym should be able to look up symbols via DSO proxies

Message ID 9af31d14424b0ededf31a95326135ee8ba83d4a7.1585588166.git.vivek@collabora.com
State New
Headers show
Series Proof-of-Concept implementation of RTLD_SHARED for dlmopen | expand

Commit Message

Vivek Das Mohapatra March 30, 2020, 5:43 p.m. UTC
---
 elf/dl-sym.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
diff mbox series

Patch

diff --git a/elf/dl-sym.c b/elf/dl-sym.c
index b43a50e544..2974efd60a 100644
--- a/elf/dl-sym.c
+++ b/elf/dl-sym.c
@@ -108,6 +108,10 @@  do_sym (void *handle, const char *name, void *who,
     {
       match = find_caller_link_map (caller);
 
+      /* Proxies don't contain any symbols: Need to look at the real DSO.  */
+      if (__glibc_unlikely (match->l_proxy))
+	match = match->l_real;
+
       /* Search the global scope.  We have the simple case where
 	 we look up in the scope of an object which was part of
 	 the initial binary.  And then the more complex part
@@ -152,6 +156,11 @@  RTLD_NEXT used in code not dynamically loaded"));
 	}
 
       struct link_map *l = match;
+
+      /* Proxies don't contain any symbols: Need to look at the real DSO.  */
+      if (__glibc_unlikely (l->l_proxy))
+	l = l->l_real;
+
       while (l->l_loader != NULL)
 	l = l->l_loader;
 
@@ -162,6 +171,11 @@  RTLD_NEXT used in code not dynamically loaded"));
     {
       /* Search the scope of the given object.  */
       struct link_map *map = handle;
+
+      /* Proxies don't contain any symbols: Need to look at the real DSO.  */
+      if (__glibc_unlikely (map->l_proxy))
+	map = map->l_real;
+
       result = GLRO(dl_lookup_symbol_x) (name, map, &ref, map->l_local_scope,
 					 vers, 0, flags, NULL);
     }