disable global visibility override hack (vis.h) by default
[musl] / ldso / dynlink.c
index 239007f..35a90ae 100644 (file)
@@ -1437,6 +1437,7 @@ _Noreturn void __dls3(size_t *sp)
        size_t aux[AUX_CNT], *auxv;
        size_t i;
        char *env_preload=0;
+       char *replace_argv0=0;
        size_t vdso_base;
        int argc = *sp;
        char **argv = (void *)(sp+1);
@@ -1521,6 +1522,10 @@ _Noreturn void __dls3(size_t *sp)
                                if (opt[7]=='=') env_preload = opt+8;
                                else if (opt[7]) *argv = 0;
                                else if (*argv) env_preload = *argv++;
+                       } else if (!memcmp(opt, "argv0", 5)) {
+                               if (opt[5]=='=') replace_argv0 = opt+6;
+                               else if (opt[5]) *argv = 0;
+                               else if (*argv) replace_argv0 = *argv++;
                        } else {
                                argv[0] = 0;
                        }
@@ -1677,6 +1682,8 @@ _Noreturn void __dls3(size_t *sp)
        debug.state = 0;
        _dl_debug_state();
 
+       if (replace_argv0) argv[0] = replace_argv0;
+
        errno = 0;
 
        CRTJMP((void *)aux[AT_ENTRY], argv-1);
@@ -1771,7 +1778,8 @@ void *dlopen(const char *file, int mode)
        }
 
        /* First load handling */
-       if (!p->deps) {
+       int first_load = !p->deps;
+       if (first_load) {
                load_deps(p);
                if (!p->relocated && (mode & RTLD_LAZY)) {
                        prepare_lazy(p);
@@ -1779,11 +1787,15 @@ void *dlopen(const char *file, int mode)
                                if (!p->deps[i]->relocated)
                                        prepare_lazy(p->deps[i]);
                }
+       }
+       if (first_load || (mode & RTLD_GLOBAL)) {
                /* Make new symbols global, at least temporarily, so we can do
                 * relocations. If not RTLD_GLOBAL, this is reverted below. */
                add_syms(p);
                for (i=0; p->deps[i]; i++)
                        add_syms(p->deps[i]);
+       }
+       if (first_load) {
                reloc_all(p);
        }