diff options
-rw-r--r-- | Makefile.in | 67 | ||||
-rw-r--r-- | include/sys/mman.h | 2 | ||||
-rw-r--r-- | ldso/ldso/sh/elfinterp.c | 43 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/Makefile.in | 6 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/statfs.c | 3 |
5 files changed, 59 insertions, 62 deletions
diff --git a/Makefile.in b/Makefile.in index 348bc0c3f..227ddb4be 100644 --- a/Makefile.in +++ b/Makefile.in @@ -220,71 +220,56 @@ HEADERS_RM- := \ rpc/des_crypt.h \ rpc/key_prot.h \ rpc/rpc_des.h -HEADERS_RM-$(UCLIBC_HAS_UTMPX) += \ - bits/utmpx.h \ - utmpx.h -HEADERS_RM-$(UCLIBC_HAS_FLOATS) += \ - complex.h \ - fpu_control.h \ - ieee754.h \ - math.h \ - tgmath.h \ - bits/uClibc_fpmax.h \ - bits/math*.h -HEADERS_RM-$(UCLIBC_HAS_GNU_GETOPT)$(UCLIBC_HAS_GETOPT_LONG) += getopt.h -HEADERS_RM-$(UCLIBC_HAS_REALTIME) += \ - mqueue.h \ - bits/mqueue.h \ - sched.h \ - bits/sched.h \ - semaphore.h -HEADERS_RM-$(UCLIBC_HAS_THREADS) += \ - *thread*.h \ - semaphore.h \ - bits/*thread*.h \ - bits/initspin.h -HEADERS_RM-$(UCLIBC_LINUX_SPECIFIC) += \ - sys/fsuid.h \ - sys/inotify.h \ - sys/perm.h \ - sys/personality.h \ - sys/prctl.h \ - sys/reboot.h \ - sys/sendfile.h \ - sys/signalfd.h \ - bits/statfs.h \ - sys/statfs.h \ - sys/swap.h \ - sys/sysctl.h \ - sys/sysinfo.h \ - sys/vfs.h -HEADERS_RM-$(UCLIBC_HAS_THREADS_NATIVE) += \ - atomic.h \ - bits/atomic.h HEADERS_RM-$(HAVE_SHARED) += dlfcn.h bits/dlfcn.h HEADERS_RM-$(PTHREADS_DEBUG_SUPPORT) += thread_db.h HEADERS_RM-$(UCLIBC_HAS_BSD_ERR) += err.h HEADERS_RM-$(UCLIBC_HAS_CRYPT) += crypt.h HEADERS_RM-$(UCLIBC_HAS_EPOLL) += sys/epoll.h HEADERS_RM-$(UCLIBC_HAS_FENV) += fenv.h bits/fenv.h bits/fenvinline.h +HEADERS_RM-$(UCLIBC_HAS_FLOATS) += complex.h fpu_control.h ieee754.h \ + math.h \ + tgmath.h \ + bits/uClibc_fpmax.h \ + bits/math*.h HEADERS_RM-$(findstring y,$(UCLIBC_HAS_FTW)$(UCLIBC_HAS_NFTW)) += ftw.h HEADERS_RM-$(UCLIBC_HAS_GETTEXT_AWARENESS) += libintl.h HEADERS_RM-$(UCLIBC_HAS_GLIBC_CUSTOM_PRINTF) += printf.h HEADERS_RM-$(UCLIBC_HAS_GLOB) += glob.h HEADERS_RM-$(UCLIBC_HAS_GNU_ERROR) += error.h +HEADERS_RM-$(UCLIBC_HAS_GNU_GETOPT)$(UCLIBC_HAS_GETOPT_LONG) += getopt.h HEADERS_RM-$(UCLIBC_HAS_IPV6) += netinet/ip6.h netinet/icmp6.h HEADERS_RM-$(UCLIBC_HAS_BACKTRACE) += execinfo.h HEADERS_RM-$(UCLIBC_HAS_LOCALE) += iconv.h HEADERS_RM-$(UCLIBC_HAS_PTY) += pty.h +HEADERS_RM-$(UCLIBC_HAS_REALTIME) += mqueue.h bits/mqueue.h sched.h \ + bits/sched.h \ + semaphore.h HEADERS_RM-$(UCLIBC_HAS_REGEX) += regex.h regexp.h HEADERS_RM-$(UCLIBC_HAS_RPC) += rpc HEADERS_RM-$(UCLIBC_HAS_SHADOW) += shadow.h HEADERS_RM-$(UCLIBC_HAS_SOCKET) += sys/socket.h bits/socket.h sys/socketvar.h HEADERS_RM-$(UCLIBC_HAS_SYSLOG) += syslog.h sys/syslog.h bits/syslog*.h +HEADERS_RM-$(UCLIBC_HAS_THREADS) += *thread*.h semaphore.h \ + bits/*thread*.h \ + bits/initspin.h +HEADERS_RM-$(UCLIBC_HAS_THREADS_NATIVE) += atomic.h bits/atomic.h +HEADERS_RM-$(UCLIBC_HAS_UTMPX) += bits/utmpx.h utmpx.h HEADERS_RM-$(UCLIBC_HAS_WCHAR) += wchar.h wctype.h HEADERS_RM-$(UCLIBC_HAS_WORDEXP) += wordexp.h HEADERS_RM-$(UCLIBC_HAS_XATTR) += sys/xattr.h HEADERS_RM-$(UCLIBC_HAS_XLOCALE) += xlocale.h +HEADERS_RM-$(UCLIBC_LINUX_SPECIFIC) += sys/fsuid.h sys/inotify.h sys/perm.h \ + sys/personality.h \ + sys/prctl.h \ + sys/reboot.h \ + sys/sendfile.h \ + sys/signalfd.h \ + bits/statfs.h \ + sys/statfs.h \ + sys/swap.h \ + sys/sysctl.h \ + sys/sysinfo.h \ + sys/vfs.h HEADERS_RM-$(UCLIBC_SUPPORT_AI_ADDRCONFIG) += ifaddrs.h HEADERS_RM-$(UCLIBC_SV4_DEPRECATED) += ustat.h sys/ustat.h bits/ustat.h HEADERS_RM-$(UCLIBC_SUSV3_LEGACY) += sys/timeb.h regexp.h diff --git a/include/sys/mman.h b/include/sys/mman.h index d46b92258..470209ed5 100644 --- a/include/sys/mman.h +++ b/include/sys/mman.h @@ -100,7 +100,7 @@ static __inline__ int msync (void *__addr, size_t __len, int __flags) { return 0 #endif -#if defined __USE_BSD && defined __UCLIBC_LINUX_SPECIFIC__ +#if defined __USE_BSD && (defined __UCLIBC_LINUX_SPECIFIC__ || defined __UCLIBC_HAS_THREADS_NATIVE__) /* Advise the system about particular usage patterns the program follows for the region starting at ADDR and extending LEN bytes. */ extern int madvise (void *__addr, size_t __len, int __advice) __THROW; diff --git a/ldso/ldso/sh/elfinterp.c b/ldso/ldso/sh/elfinterp.c index e94c44dad..928a84b40 100644 --- a/ldso/ldso/sh/elfinterp.c +++ b/ldso/ldso/sh/elfinterp.c @@ -167,26 +167,33 @@ _dl_do_reloc (struct elf_resolve *tpnt, struct r_scope_elem *scope, reloc_type = ELF32_R_TYPE(rpnt->r_info); symtab_index = ELF32_R_SYM(rpnt->r_info); symbol_addr = 0; - symname = strtab + symtab[symtab_index].st_name; if (symtab_index) { - symbol_addr = (unsigned long) _dl_find_hash(symname, scope, tpnt, ¤t_value, - elf_machine_type_class(reloc_type), &tls_tpnt); - /* - * We want to allow undefined references to weak symbols - this might - * have been intentional. We should not be linking local symbols - * here, so all bases should be covered. - */ - - if (!symbol_addr - && (ELF_ST_TYPE(symtab[symtab_index].st_info) != STT_TLS) - && (ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK)) { - _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", - _dl_progname, strtab + symtab[symtab_index].st_name); - - /* Let the caller to handle the error: it may be non fatal if called from dlopen */ - return 1; - } + symname = strtab + symtab[symtab_index].st_name; + if (ELF32_ST_VISIBILITY(symtab[symtab_index].st_other) + != STV_PROTECTED) { + symbol_addr = (unsigned long) _dl_find_hash(symname, scope, tpnt, ¤t_value, + elf_machine_type_class(reloc_type), &tls_tpnt); + /* + * We want to allow undefined references to weak symbols - this might + * have been intentional. We should not be linking local symbols + * here, so all bases should be covered. + */ + + if (!symbol_addr + && (ELF_ST_TYPE(symtab[symtab_index].st_info) != STT_TLS) + && (ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK)) { + _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", + _dl_progname, strtab + symtab[symtab_index].st_name); + + /* Let the caller to handle the error: it may be non fatal if called from dlopen */ + return 1; + } + } else + /* Resolve protected symbols locally */ + symbol_addr = DL_FIND_HASH_VALUE(tpnt, elf_machine_type_class(reloc_type), + &symtab[symtab_index]); + if (_dl_trace_prelink) _dl_debug_lookup (symname, tpnt, &symtab[symtab_index], ¤t_value, elf_machine_type_class(reloc_type)); diff --git a/libc/sysdeps/linux/common/Makefile.in b/libc/sysdeps/linux/common/Makefile.in index 1711e8025..4222912fc 100644 --- a/libc/sysdeps/linux/common/Makefile.in +++ b/libc/sysdeps/linux/common/Makefile.in @@ -26,12 +26,16 @@ endif ifneq ($(UCLIBC_LINUX_SPECIFIC),y) # we need these internally: fstatfs.c statfs.c -CSRC := $(filter-out capget.c capset.c inotify.c ioperm.c iopl.c madvise.c \ +CSRC := $(filter-out capget.c capset.c inotify.c ioperm.c iopl.c \ modify_ldt.c personality.c ppoll.c prctl.c readahead.c reboot.c \ remap_file_pages.c sched_getaffinity.c sched_setaffinity.c \ sendfile64.c sendfile.c setfsgid.c setfsuid.c setresuid.c \ splice.c vmsplice.c tee.c signalfd.c swapoff.c swapon.c \ sync_file_range.c sysctl.c sysinfo.c timerfd.c uselib.c vhangup.c,$(CSRC)) +ifneq ($(UCLIBC_HAS_THREADS_NATIVE),y) +# we need madvise.c in NPTL +CSRC := $(filter-pout madvise.c,$(CSRC)) +endif endif ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y) diff --git a/libc/sysdeps/linux/common/statfs.c b/libc/sysdeps/linux/common/statfs.c index 2f8548d0d..d24bc9d0c 100644 --- a/libc/sysdeps/linux/common/statfs.c +++ b/libc/sysdeps/linux/common/statfs.c @@ -16,6 +16,7 @@ extern __typeof(statfs) __libc_statfs attribute_hidden; #define __NR___libc_statfs __NR_statfs _syscall2(int, __libc_statfs, const char *, path, struct statfs *, buf) -#if defined __UCLIBC_LINUX_SPECIFIC__ +#if defined __UCLIBC_LINUX_SPECIFIC__ || defined __UCLIBC_HAS_THREADS_NATIVE__ +/* statfs is used by NPTL, so it must exported in case */ weak_alias(__libc_statfs,statfs) #endif |