fix computation of entry point and main app phdrs when invoking via ldso
authorRich Felker <dalias@aerifal.cx>
Fri, 26 Jul 2013 18:25:51 +0000 (14:25 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 26 Jul 2013 18:25:51 +0000 (14:25 -0400)
entry point was wrong for PIE. e_entry was being treated as an
absolute value, whereas it's actually relative to the load address
(which is zero for non-PIE).

phdr pointer was wrong for non-PIE. e_phoff was being treated as
load-address-relative, whereas it's actually a file offset in the ELF
file. in any case, map_library was already computing it correctly, and
the incorrect code in __dynlink was overwriting it with junk.

src/ldso/dynlink.c

index f4c32ffea52828b8095439c343bc92ab47d446eb..ff416838a65caba4d6493db0729c38303fae1f32 100644 (file)
@@ -940,9 +940,7 @@ void *__dynlink(int argc, char **argv)
                close(fd);
                lib->name = ldname;
                app->name = argv[0];
-               app->phnum = ehdr->e_phnum;
-               app->phdr = (void *)(app->base + ehdr->e_phoff);
-               aux[AT_ENTRY] = ehdr->e_entry;
+               aux[AT_ENTRY] = (size_t)app->base + ehdr->e_entry;
        }
        if (app->tls_size) {
                app->tls_id = tls_cnt = 1;