57 lines
2.2 KiB
Diff
57 lines
2.2 KiB
Diff
|
Upstream-Status: Inappropriate [embedded specific]
|
||
|
|
||
|
The default lib search path order is:
|
||
|
|
||
|
1) LD_LIBRARY_PATH
|
||
|
2) RPATH from the binary
|
||
|
3) ld.so.cache
|
||
|
4) default search paths embedded in the linker
|
||
|
|
||
|
For nativesdk binaries which are being used alongside binaries on a host system, we
|
||
|
need the search paths to firstly search the shipped nativesdk libs but then also
|
||
|
cover the host system. For example we want the host system's libGL and this may be
|
||
|
in a non-standard location like /usr/lib/mesa. The only place the location is know
|
||
|
about is in the ld.so.cache of the host system.
|
||
|
|
||
|
Since nativesdk has a simple structure and doesn't need to use a cache itself, we
|
||
|
repurpose the cache for use as a last resort in finding host system binaries. This
|
||
|
means we need to switch the order of 3 and 4 above to make this work effectively.
|
||
|
|
||
|
RP 14/10/2010
|
||
|
|
||
|
Index: libc/elf/dl-load.c
|
||
|
===================================================================
|
||
|
--- libc.orig/elf/dl-load.c
|
||
|
+++ libc/elf/dl-load.c
|
||
|
@@ -2107,6 +2107,15 @@ _dl_map_object (struct link_map *loader,
|
||
|
&loader->l_runpath_dirs, &realname, &fb, loader,
|
||
|
LA_SER_RUNPATH, &found_other_class);
|
||
|
|
||
|
+ /* try the default path. */
|
||
|
+ if (fd == -1
|
||
|
+ && ((l = loader ?: GL(dl_ns)[nsid]._ns_loaded) == NULL
|
||
|
+ || __builtin_expect (!(l->l_flags_1 & DF_1_NODEFLIB), 1))
|
||
|
+ && rtld_search_dirs.dirs != (void *) -1)
|
||
|
+ fd = open_path (name, namelen, mode & __RTLD_SECURE, &rtld_search_dirs,
|
||
|
+ &realname, &fb, l, LA_SER_DEFAULT, &found_other_class);
|
||
|
+
|
||
|
+ /* Finally try ld.so.cache */
|
||
|
if (fd == -1
|
||
|
&& (__builtin_expect (! (mode & __RTLD_SECURE), 1)
|
||
|
|| ! INTUSE(__libc_enable_secure)))
|
||
|
@@ -2169,14 +2178,6 @@ _dl_map_object (struct link_map *loader,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- /* Finally, try the default path. */
|
||
|
- if (fd == -1
|
||
|
- && ((l = loader ?: GL(dl_ns)[nsid]._ns_loaded) == NULL
|
||
|
- || __builtin_expect (!(l->l_flags_1 & DF_1_NODEFLIB), 1))
|
||
|
- && rtld_search_dirs.dirs != (void *) -1)
|
||
|
- fd = open_path (name, namelen, mode & __RTLD_SECURE, &rtld_search_dirs,
|
||
|
- &realname, &fb, l, LA_SER_DEFAULT, &found_other_class);
|
||
|
-
|
||
|
/* Add another newline when we are tracing the library loading. */
|
||
|
if (__builtin_expect (GLRO_dl_debug_mask & DL_DEBUG_LIBS, 0))
|
||
|
_dl_debug_printf ("\n");
|