fix broken copy relocations from dynamic linker cleanup
authorRich Felker <dalias@aerifal.cx>
Mon, 23 Jan 2012 23:32:40 +0000 (18:32 -0500)
committerRich Felker <dalias@aerifal.cx>
Mon, 23 Jan 2012 23:32:40 +0000 (18:32 -0500)
this issue affected programs which use global variables exported by
non-libc libraries.

src/ldso/dynlink.c

index df54230..28b86bf 100644 (file)
@@ -563,10 +563,13 @@ void *__dynlink(int argc, char **argv)
                ehdr->e_phentsize, ehdr->e_phnum);
 
        /* Load preload/needed libraries, add their symbols to the global
-        * namespace, and perform all remaining relocations. */
+        * namespace, and perform all remaining relocations. The main
+        * program must be relocated LAST since it may contain copy
+        * relocations which depend on libraries' relocations. */
        if (env_preload) load_preload(env_preload);
        load_deps(app);
        make_global(app);
+       reloc_all(app->next);
        reloc_all(app);
 
        /* Switch to runtime mode: any further failures in the dynamic