X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=elf%2Fdl-misc.c;h=2c8b6c5d405021042aba89948b27720b484ed4c0;hb=174295f41363fc8749a48057c6ca3b3ef2e48613;hp=f80472485deef7bbe3dc343c900e62fff32a4b9d;hpb=ce460d04a5bd10d7353ca37dfa9d34275449fb3b;p=platform%2Fupstream%2Fglibc.git diff --git a/elf/dl-misc.c b/elf/dl-misc.c index f804724..2c8b6c5 100644 --- a/elf/dl-misc.c +++ b/elf/dl-misc.c @@ -1,5 +1,5 @@ /* Miscellaneous support functions for dynamic linker - Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc. + Copyright (C) 1997-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -13,9 +13,8 @@ Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ + License along with the GNU C Library; if not, see + . */ #include #include @@ -26,23 +25,15 @@ #include #include #include +#include #include #include #include #include -#include -#include +#include +#include <_itoa.h> +#include -#ifndef MAP_ANON -/* This is the only dl-sysdep.c function that is actually needed at run-time - by _dl_map_object. */ - -int -_dl_sysdep_open_zero_fill (void) -{ - return __open ("/dev/zero", O_RDONLY); -} -#endif /* Read the whole contents of FILE into new mmap'd space with given protections. *SIZEP gets the size of the file. On error MAP_FAILED @@ -54,7 +45,11 @@ _dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot) { void *result = MAP_FAILED; struct stat64 st; - int fd = __open (file, O_RDONLY); + int flags = O_RDONLY; +#ifdef O_CLOEXEC + flags |= O_CLOEXEC; +#endif + int fd = __open (file, flags); if (fd >= 0) { if (__fxstat64 (_STAT_VER, fd, &st) >= 0) @@ -81,17 +76,17 @@ _dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot) } -/* Bare-bone printf implementation. This function only knows about +/* Bare-bones printf implementation. This function only knows about the formats and flags needed and can handle only up to 64 stripes in the output. */ static void _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg) { - const int niovmax = 64; - struct iovec iov[niovmax]; +# define NIOVMAX 64 + struct iovec iov[NIOVMAX]; int niov = 0; pid_t pid = 0; - char pidbuf[7]; + char pidbuf[12]; while (*fmt != '\0') { @@ -105,17 +100,17 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg) { char *p; pid = __getpid (); - assert (pid >= 0 && pid < 100000); - p = _itoa (pid, &pidbuf[5], 10, 0); + assert (pid >= 0 && sizeof (pid_t) <= 4); + p = _itoa (pid, &pidbuf[10], 10, 0); while (p > pidbuf) - *--p = '0'; - pidbuf[5] = ':'; - pidbuf[6] = '\t'; + *--p = ' '; + pidbuf[10] = ':'; + pidbuf[11] = '\t'; } /* Append to the output. */ - assert (niov < niovmax); - iov[niov].iov_len = 7; + assert (niov < NIOVMAX); + iov[niov].iov_len = 12; iov[niov++].iov_base = pidbuf; /* No more tags until we see the next newline. */ @@ -127,7 +122,7 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg) ++fmt; /* Append constant string. */ - assert (niov < niovmax); + assert (niov < NIOVMAX); if ((iov[niov].iov_len = fmt - startp) != 0) iov[niov++].iov_base = (char *) startp; @@ -246,17 +241,7 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg) } /* Finally write the result. */ -#ifdef INTERNAL_SYSCALL - INTERNAL_SYSCALL (writev, 3, fd, iov, niov); -#elif RTLD_PRIVATE_ERRNO - /* We have to take this lock just to be sure we don't clobber the private - errno when it's being used by another thread that cares about it. */ - __libc_lock_lock_recursive (GL(dl_load_lock)); - __writev (fd, iov, niov); - __libc_lock_unlock_recursive (GL(dl_load_lock)); -#else - __writev (fd, iov, niov); -#endif + _dl_writev (fd, iov, niov); } @@ -267,10 +252,9 @@ _dl_debug_printf (const char *fmt, ...) va_list arg; va_start (arg, fmt); - _dl_debug_vdprintf (GL(dl_debug_fd), 1, fmt, arg); + _dl_debug_vdprintf (GLRO(dl_debug_fd), 1, fmt, arg); va_end (arg); } -INTDEF(_dl_debug_printf) /* Write to debug file but don't start with a tag. */ @@ -280,7 +264,7 @@ _dl_debug_printf_c (const char *fmt, ...) va_list arg; va_start (arg, fmt); - _dl_debug_vdprintf (GL(dl_debug_fd), -1, fmt, arg); + _dl_debug_vdprintf (GLRO(dl_debug_fd), -1, fmt, arg); va_end (arg); } @@ -295,3 +279,88 @@ _dl_dprintf (int fd, const char *fmt, ...) _dl_debug_vdprintf (fd, 0, fmt, arg); va_end (arg); } + + +/* Test whether given NAME matches any of the names of the given object. */ +int +internal_function +_dl_name_match_p (const char *name, const struct link_map *map) +{ + if (strcmp (name, map->l_name) == 0) + return 1; + + struct libname_list *runp = map->l_libname; + + while (runp != NULL) + if (strcmp (name, runp->name) == 0) + return 1; + else + runp = runp->next; + + return 0; +} + + +unsigned long int +internal_function +_dl_higher_prime_number (unsigned long int n) +{ + /* These are primes that are near, but slightly smaller than, a + power of two. */ + static const uint32_t primes[] = { + UINT32_C (7), + UINT32_C (13), + UINT32_C (31), + UINT32_C (61), + UINT32_C (127), + UINT32_C (251), + UINT32_C (509), + UINT32_C (1021), + UINT32_C (2039), + UINT32_C (4093), + UINT32_C (8191), + UINT32_C (16381), + UINT32_C (32749), + UINT32_C (65521), + UINT32_C (131071), + UINT32_C (262139), + UINT32_C (524287), + UINT32_C (1048573), + UINT32_C (2097143), + UINT32_C (4194301), + UINT32_C (8388593), + UINT32_C (16777213), + UINT32_C (33554393), + UINT32_C (67108859), + UINT32_C (134217689), + UINT32_C (268435399), + UINT32_C (536870909), + UINT32_C (1073741789), + UINT32_C (2147483647), + /* 4294967291L */ + UINT32_C (2147483647) + UINT32_C (2147483644) + }; + + const uint32_t *low = &primes[0]; + const uint32_t *high = &primes[sizeof (primes) / sizeof (primes[0])]; + + while (low != high) + { + const uint32_t *mid = low + (high - low) / 2; + if (n > *mid) + low = mid + 1; + else + high = mid; + } + +#if 0 + /* If we've run out of primes, abort. */ + if (n > *low) + { + fprintf (stderr, "Cannot find prime bigger than %lu\n", n); + abort (); + } +#endif + + return *low; +}