diff options
Diffstat (limited to 'meta/recipes-core/uclibc/uclibc-0.9.32/rtld_no.patch')
-rw-r--r-- | meta/recipes-core/uclibc/uclibc-0.9.32/rtld_no.patch | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/meta/recipes-core/uclibc/uclibc-0.9.32/rtld_no.patch b/meta/recipes-core/uclibc/uclibc-0.9.32/rtld_no.patch new file mode 100644 index 0000000000..30cb7f6ef6 --- /dev/null +++ b/meta/recipes-core/uclibc/uclibc-0.9.32/rtld_no.patch @@ -0,0 +1,215 @@ +Patch is backported from +http://lists.busybox.net/pipermail/uclibc/2011-March/045004.html + +Upstream-Status: Pending + +diff --git a/ldso/include/dl-elf.h b/ldso/include/dl-elf.h +index 7fbb373..7102351 100644 +--- a/ldso/include/dl-elf.h ++++ b/ldso/include/dl-elf.h +@@ -25,16 +25,18 @@ static __inline__ void _dl_map_cache(void) { } + static __inline__ void _dl_unmap_cache(void) { } + #endif + ++#define DL_RESOLVE_SECURE 0x0001 ++#define DL_RESOLVE_NOLOAD 0x0002 + + /* Function prototypes for non-static stuff in readelflib1.c */ + extern void _dl_parse_lazy_relocation_information(struct dyn_elf *rpnt, + unsigned long rel_addr, unsigned long rel_size); + extern int _dl_parse_relocation_information(struct dyn_elf *rpnt, + unsigned long rel_addr, unsigned long rel_size); +-extern struct elf_resolve * _dl_load_shared_library(int secure, ++extern struct elf_resolve * _dl_load_shared_library(int resolve_flags, + struct dyn_elf **rpnt, struct elf_resolve *tpnt, char *full_libname, + int trace_loaded_objects); +-extern struct elf_resolve * _dl_load_elf_shared_library(int secure, ++extern struct elf_resolve * _dl_load_elf_shared_library(int resolve_flags, + struct dyn_elf **rpnt, char *libname); + extern struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname, + int trace_loaded_objects); +diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c +index 2b2d429..6d35bf2 100644 +--- a/ldso/ldso/dl-elf.c ++++ b/ldso/ldso/dl-elf.c +@@ -132,7 +132,7 @@ _dl_protect_relro (struct elf_resolve *l) + /* This function's behavior must exactly match that + * in uClibc/ldso/util/ldd.c */ + static struct elf_resolve * +-search_for_named_library(const char *name, int secure, const char *path_list, ++search_for_named_library(const char *name, int resolve_flags, const char *path_list, + struct dyn_elf **rpnt, const char *origin) + { + char *mylibname; +@@ -162,7 +162,7 @@ search_for_named_library(const char *name, int secure, const char *path_list, + + if (plen >= 7 && _dl_memcmp(p, "$ORIGIN", 7) == 0) { + int olen; +- if (secure && plen != 7) ++ if ((resolve_flags & DL_RESOLVE_SECURE) && plen != 7) + continue; + if (origin == NULL) + continue; +@@ -182,7 +182,7 @@ search_for_named_library(const char *name, int secure, const char *path_list, + _dl_strcat(mylibname, "/"); + _dl_strcat(mylibname, name); + +- tpnt = _dl_load_elf_shared_library(secure, rpnt, mylibname); ++ tpnt = _dl_load_elf_shared_library(resolve_flags, rpnt, mylibname); + if (tpnt != NULL) + return tpnt; + } +@@ -194,7 +194,7 @@ search_for_named_library(const char *name, int secure, const char *path_list, + unsigned long _dl_error_number; + unsigned long _dl_internal_error_number; + +-struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, ++struct elf_resolve *_dl_load_shared_library(int resolve_flags, struct dyn_elf **rpnt, + struct elf_resolve *tpnt, char *full_libname, int attribute_unused trace_loaded_objects) + { + char *pnt; +@@ -223,7 +223,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + + if (libname != full_libname) { + _dl_if_debug_dprint("\ttrying file='%s'\n", full_libname); +- tpnt1 = _dl_load_elf_shared_library(secure, rpnt, full_libname); ++ tpnt1 = _dl_load_elf_shared_library(resolve_flags, rpnt, full_libname); + if (tpnt1) { + return tpnt1; + } +@@ -238,7 +238,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + if (pnt) { + pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; + _dl_if_debug_dprint("\tsearching RPATH='%s'\n", pnt); +- if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt, ++ if ((tpnt1 = search_for_named_library(libname, resolve_flags, pnt, rpnt, + tpnt->libname)) != NULL) + return tpnt1; + } +@@ -247,7 +247,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ + if (_dl_library_path) { + _dl_if_debug_dprint("\tsearching LD_LIBRARY_PATH='%s'\n", _dl_library_path); +- if ((tpnt1 = search_for_named_library(libname, secure, _dl_library_path, rpnt, NULL)) != NULL) ++ if ((tpnt1 = search_for_named_library(libname, resolve_flags, _dl_library_path, rpnt, NULL)) != NULL) + { + return tpnt1; + } +@@ -261,7 +261,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + if (pnt) { + pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; + _dl_if_debug_dprint("\tsearching RUNPATH='%s'\n", pnt); +- if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt, NULL)) != NULL) ++ if ((tpnt1 = search_for_named_library(libname, resolve_flags, pnt, rpnt, NULL)) != NULL) + return tpnt1; + } + #endif +@@ -284,7 +284,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + || libent[i].flags == LIB_ELF_LIBC0 + || libent[i].flags == LIB_ELF_LIBC5) + && _dl_strcmp(libname, strs + libent[i].sooffset) == 0 +- && (tpnt1 = _dl_load_elf_shared_library(secure, rpnt, strs + libent[i].liboffset)) ++ && (tpnt1 = _dl_load_elf_shared_library(resolve_flags, rpnt, strs + libent[i].liboffset)) + ) { + return tpnt1; + } +@@ -295,14 +295,14 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + /* Look for libraries wherever the shared library loader + * was installed */ + _dl_if_debug_dprint("\tsearching ldso dir='%s'\n", _dl_ldsopath); +- tpnt1 = search_for_named_library(libname, secure, _dl_ldsopath, rpnt, NULL); ++ tpnt1 = search_for_named_library(libname, resolve_flags, _dl_ldsopath, rpnt, NULL); + if (tpnt1 != NULL) + return tpnt1; + + /* Lastly, search the standard list of paths for the library. + This list must exactly match the list in uClibc/ldso/util/ldd.c */ + _dl_if_debug_dprint("\tsearching full lib path list\n"); +- tpnt1 = search_for_named_library(libname, secure, ++ tpnt1 = search_for_named_library(libname, resolve_flags, + UCLIBC_RUNTIME_PREFIX "lib:" + UCLIBC_RUNTIME_PREFIX "usr/lib" + #ifndef __LDSO_CACHE_SUPPORT__ +@@ -329,7 +329,7 @@ goof: + * are required. + */ + +-struct elf_resolve *_dl_load_elf_shared_library(int secure, ++struct elf_resolve *_dl_load_elf_shared_library(int resolve_flags, + struct dyn_elf **rpnt, char *libname) + { + ElfW(Ehdr) *epnt; +@@ -368,7 +368,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, + } + /* If we are in secure mode (i.e. a setu/gid binary using LD_PRELOAD), + we don't load the library if it isn't setuid. */ +- if (secure) { ++ if (resolve_flags & DL_RESOLVE_SECURE) { + if (!(st.st_mode & S_ISUID)) { + _dl_close(infile); + return NULL; +@@ -384,6 +384,10 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, + return tpnt; + } + } ++ if (resolve_flags & DL_RESOLVE_NOLOAD) { ++ _dl_close(infile); ++ return NULL; ++ } + header = _dl_mmap((void *) 0, _dl_pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_UNINITIALIZE, -1, 0); + if (_dl_mmap_check_error(header)) { +diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c +index 9423670..b71af34 100644 +--- a/ldso/ldso/ldso.c ++++ b/ldso/ldso/ldso.c +@@ -646,7 +646,9 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, + if (!_dl_secure || _dl_strchr(str, '/') == NULL) { + _dl_if_debug_dprint("\tfile='%s'; needed by '%s'\n", str, _dl_progname); + +- tpnt1 = _dl_load_shared_library(_dl_secure, &rpnt, NULL, str, trace_loaded_objects); ++ tpnt1 = _dl_load_shared_library( ++ _dl_secure ? DL_RESOLVE_SECURE : 0, ++ &rpnt, NULL, str, trace_loaded_objects); + if (!tpnt1) { + #ifdef __LDSO_LDD_SUPPORT__ + if (trace_loaded_objects) +diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c +index 68cd579..edf38d2 100644 +--- a/ldso/libdl/libdl.c ++++ b/ldso/libdl/libdl.c +@@ -288,7 +288,7 @@ void *dlopen(const char *libname, int flag) + #endif + + /* A bit of sanity checking... */ +- if (!(flag & (RTLD_LAZY|RTLD_NOW))) { ++ if (!(flag & (RTLD_LAZY|RTLD_NOW|RTLD_NOLOAD))) { + _dl_error_number = LD_BAD_HANDLE; + return NULL; + } +@@ -358,8 +358,9 @@ void *dlopen(const char *libname, int flag) + /* Try to load the specified library */ + _dl_if_debug_print("Trying to dlopen '%s', RTLD_GLOBAL:%d RTLD_NOW:%d\n", + (char*)libname, (flag & RTLD_GLOBAL ? 1:0), (now_flag & RTLD_NOW ? 1:0)); +- tpnt = _dl_load_shared_library(0, &rpnt, tfrom, (char*)libname, 0); + ++ tpnt = _dl_load_shared_library((flag & RTLD_NOLOAD) ? DL_RESOLVE_NOLOAD : 0, ++ &rpnt, tfrom, (char*)libname, 0); + if (tpnt == NULL) { + _dl_unmap_cache(); + return NULL; +diff --git a/libc/sysdeps/linux/common/bits/dlfcn.h b/libc/sysdeps/linux/common/bits/dlfcn.h +index 4bfbbff..47b42ad 100644 +--- a/libc/sysdeps/linux/common/bits/dlfcn.h ++++ b/libc/sysdeps/linux/common/bits/dlfcn.h +@@ -24,9 +24,9 @@ + /* The MODE argument to `dlopen' contains one of the following: */ + #define RTLD_LAZY 0x00001 /* Lazy function call binding. */ + #define RTLD_NOW 0x00002 /* Immediate function call binding. */ +-#if 0 /* uClibc doesnt support these */ +-#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */ ++#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */ + #define RTLD_NOLOAD 0x00004 /* Do not load the object. */ ++#if 0 /* uClibc doesnt support these */ + #define RTLD_DEEPBIND 0x00008 /* Use deep binding. */ + #endif |