OSDN Git Service

Merge commit 'origin/master' into nptl
[uclinux-h8/uClibc.git] / ldso / ldso / ldso.c
index 4852042..74da588 100644 (file)
@@ -38,7 +38,7 @@
 
 #define ALLOW_ZERO_PLTGOT
 
-#if USE_TLS
+#if defined(USE_TLS) && USE_TLS
 #include "dl-tls.c"
 #endif
 
@@ -193,7 +193,7 @@ void *_dl_malloc(size_t size)
 
                _dl_debug_early("mmapping more memory\n");
                _dl_mmap_zero = _dl_malloc_addr = _dl_mmap((void *) 0, rounded_size,
-                               PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+                               PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_UNINITIALIZE, -1, 0);
                if (_dl_mmap_check_error(_dl_mmap_zero)) {
                        _dl_dprintf(_dl_debug_file, "%s: mmap of a spare page failed!\n", _dl_progname);
                        _dl_exit(20);
@@ -219,8 +219,14 @@ static void *_dl_zalloc(size_t size)
        return p;
 }
 
-#if USE_TLS
-void * _dl_memalign (size_t __boundary, size_t __size)
+void _dl_free(void *p)
+{
+       if (_dl_free_function)
+               (*_dl_free_function) (p);
+}
+
+#if defined(USE_TLS) && USE_TLS
+void *_dl_memalign(size_t __boundary, size_t __size)
 {
        void *result;
        int i = 0;
@@ -288,10 +294,9 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
        ElfW(Addr) relro_addr = 0;
        size_t relro_size = 0;
        struct stat st;
-#if USE_TLS
+#if defined(USE_TLS) && USE_TLS
        void *tcbp = NULL;
 #endif
-       
 
        /* Wahoo!!! We managed to make a function call!  Get malloc
         * setup so we can use _dl_dprintf() to print debug noise
@@ -366,24 +371,11 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
                unlazy = RTLD_NOW;
        }
 
-#if USE_TLS
+#if defined(USE_TLS) && USE_TLS
        _dl_error_catch_tsd = &_dl_initial_error_catch_tsd;
        _dl_init_static_tls = &_dl_nothread_init_static_tls;
 #endif
 
-#ifdef __UCLIBC_HAS_SSP__
-       /* Set up the stack checker's canary.  */
-       stack_chk_guard = _dl_setup_stack_chk_guard ();
-# ifdef THREAD_SET_STACK_GUARD
-       THREAD_SET_STACK_GUARD (stack_chk_guard);
-#  ifdef __UCLIBC_HAS_SSP_COMPAT__
-       __guard = stack_chk_guard;
-#  endif
-# else
-       __stack_chk_guard = stack_chk_guard;
-# endif
-#endif
-
        /* At this point we are now free to examine the user application,
         * and figure out which libraries are supposed to be called.  Until
         * we have this list, we will not be completely ready for dynamic
@@ -481,24 +473,25 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
 
                /* OK, fill this in - we did not have this before */
                if (ppnt->p_type == PT_INTERP) {
-                       char *ptmp;
-
                        tpnt->libname = (char *) DL_RELOC_ADDR(app_tpnt->loadaddr, ppnt->p_vaddr);
-
-                       /* Store the path where the shared lib loader was found
-                        * for later use
-                        */
-                       _dl_ldsopath = _dl_strdup(tpnt->libname);
-                       ptmp = _dl_strrchr(_dl_ldsopath, '/');
-                       if (ptmp != _dl_ldsopath)
-                               *ptmp = '\0';
-
+#ifdef __LDSO_SEARCH_INTERP_PATH__
+                       {
+                               char *ptmp;
+                               /* Store the path where the shared lib loader was found
+                                * for later use
+                                */
+                               _dl_ldsopath = _dl_strdup(tpnt->libname);
+                               ptmp = _dl_strrchr(_dl_ldsopath, '/');
+                               if (ptmp != _dl_ldsopath)
+                                       *ptmp = '\0';
+                       }
                        _dl_debug_early("Lib Loader: (%x) %s\n", (unsigned) DL_LOADADDR_BASE(tpnt->loadaddr), tpnt->libname);
+#endif
                }
 
                /* Discover any TLS sections if the target supports them. */
                if (ppnt->p_type == PT_TLS) {
-#if USE_TLS
+#if defined(USE_TLS) && USE_TLS
                        if (ppnt->p_memsz > 0) {
                                app_tpnt->l_tls_blocksize = ppnt->p_memsz;
                                app_tpnt->l_tls_align = ppnt->p_align;
@@ -525,20 +518,17 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
        app_tpnt->relro_addr = relro_addr;
        app_tpnt->relro_size = relro_size;
 
-#if USE_TLS
+#if defined(USE_TLS) && USE_TLS
        /*
         * Adjust the address of the TLS initialization image in
         * case the executable is actually an ET_DYN object.
         */
-       if (app_tpnt->l_tls_initimage != NULL)
-       {
-#ifdef __SUPPORT_LD_DEBUG_EARLY__
-               unsigned int tmp = (unsigned int) app_tpnt->l_tls_initimage;
-#endif
+       if (app_tpnt->l_tls_initimage != NULL) {
                app_tpnt->l_tls_initimage =
                        (char *) app_tpnt->l_tls_initimage + app_tpnt->loadaddr;
-               _dl_debug_early("Relocated TLS initial image from %x to %x (size = %x)\n", tmp, app_tpnt->l_tls_initimage, app_tpnt->l_tls_initimage_size);
-
+               _dl_debug_early("Relocated TLS initial image from %x to %x (size = %x)\n",
+                       (unsigned int)app_tpnt->l_tls_initimage,
+                       app_tpnt->l_tls_initimage, app_tpnt->l_tls_initimage_size);
        }
 #endif
 
@@ -680,7 +670,6 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
 
 #ifdef __LDSO_PRELOAD_FILE_SUPPORT__
        do {
-               struct stat st;
                char *preload;
                int fd;
                char c, *cp, *cp2;
@@ -732,11 +721,11 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
 
                        tpnt1 = _dl_load_shared_library(0, &rpnt, NULL, cp2, trace_loaded_objects);
                        if (!tpnt1) {
-#ifdef __LDSO_LDD_SUPPORT__
+# ifdef __LDSO_LDD_SUPPORT__
                                if (trace_loaded_objects)
                                        _dl_dprintf(1, "\t%s => not found\n", cp2);
                                else
-#endif
+# endif
                                {
                                        _dl_dprintf(_dl_debug_file, "%s: can't load library '%s'\n", _dl_progname, cp2);
                                        _dl_exit(15);
@@ -746,14 +735,14 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
 
                                _dl_debug_early("Loading: (%x) %s\n", DL_LOADADDR_BASE(tpnt1->loadaddr), tpnt1->libname);
 
-#ifdef __LDSO_LDD_SUPPORT__
+# ifdef __LDSO_LDD_SUPPORT__
                                if (trace_loaded_objects &&
                                    tpnt1->usage_count == 1) {
                                        _dl_dprintf(1, "\t%s => %s (%x)\n",
                                                    cp2, tpnt1->libname,
                                                    DL_LOADADDR_BASE(tpnt1->loadaddr));
                                }
-#endif
+# endif
                        }
 
                        /* find start of next library */
@@ -928,7 +917,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
        }
 #endif
 
-#if USE_TLS
+#if defined(USE_TLS) && USE_TLS
        /* We do not initialize any of the TLS functionality unless any of the
         * initial modules uses TLS.  This makes dynamic loading of modules with
         * TLS impossible, but to support it requires either eagerly doing setup
@@ -937,12 +926,24 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
         * used.  Trying to do it lazily is too hairy to try when there could be
         * multiple threads (from a non-TLS-using libpthread).  */
        bool was_tls_init_tp_called = tls_init_tp_called;
-       if (tcbp == NULL)
-       {
+       if (tcbp == NULL) {
                _dl_debug_early("Calling init_tls()!\n");
                tcbp = init_tls ();
        }
 #endif
+#ifdef __UCLIBC_HAS_SSP__
+       /* Set up the stack checker's canary.  */
+       stack_chk_guard = _dl_setup_stack_chk_guard ();
+# ifdef THREAD_SET_STACK_GUARD
+       THREAD_SET_STACK_GUARD (stack_chk_guard);
+#  ifdef __UCLIBC_HAS_SSP_COMPAT__
+       __guard = stack_chk_guard;
+#  endif
+# else
+       __stack_chk_guard = stack_chk_guard;
+# endif
+#endif
+
 
        _dl_debug_early("Beginning relocation fixups\n");
 
@@ -969,7 +970,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
                        _dl_protect_relro (tpnt);
        }
 
-#if USE_TLS
+#if defined(USE_TLS) && USE_TLS
        if (!was_tls_init_tp_called && _dl_tls_max_dtv_idx > 0)
                ++_dl_tls_generation;
 
@@ -982,11 +983,9 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
 
        /* And finally install it for the main thread.  If ld.so itself uses
           TLS we know the thread pointer was initialized earlier.  */
-       if (! tls_init_tp_called)
-       {
+       if (! tls_init_tp_called) {
                const char *lossage = (char *) TLS_INIT_TP (tcbp, USE___THREAD);
-               if (__builtin_expect (lossage != NULL, 0))
-               {
+               if (__builtin_expect (lossage != NULL, 0)) {
                        _dl_debug_early("cannot set up thread-local storage: %s\n", lossage);
                        _dl_exit(30);
                }
@@ -1058,20 +1057,20 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
        _dl_malloc_function = (void* (*)(size_t)) (intptr_t) _dl_find_hash(__C_SYMBOL_PREFIX__ "malloc",
                        _dl_symbol_tables, NULL, ELF_RTYPE_CLASS_PLT, NULL);
 
-#if USE_TLS
+#if defined(USE_TLS) && USE_TLS
        /* Find the real functions and make ldso functions use them from now on */
        _dl_calloc_function = (void* (*)(size_t, size_t)) (intptr_t)
                _dl_find_hash(__C_SYMBOL_PREFIX__ "calloc", _dl_symbol_tables, NULL, ELF_RTYPE_CLASS_PLT, NULL);
-                                       
+
        _dl_realloc_function = (void* (*)(void *, size_t)) (intptr_t)
                _dl_find_hash(__C_SYMBOL_PREFIX__ "realloc", _dl_symbol_tables, NULL, ELF_RTYPE_CLASS_PLT, NULL);
-                                                                               
+
        _dl_free_function = (void (*)(void *)) (intptr_t)
                _dl_find_hash(__C_SYMBOL_PREFIX__ "free", _dl_symbol_tables, NULL, ELF_RTYPE_CLASS_PLT, NULL);
-                                       
+
        _dl_memalign_function = (void* (*)(size_t, size_t)) (intptr_t)
                _dl_find_hash(__C_SYMBOL_PREFIX__ "memalign", _dl_symbol_tables, NULL, ELF_RTYPE_CLASS_PLT, NULL);
-                       
+
 #endif
 
        /* Notify the debugger that all objects are now mapped in.  */