From 876748ead3de7798623c09af835a4b56dcc28e0f Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Fri, 26 Jul 2013 14:25:51 -0400 Subject: fix computation of entry point and main app phdrs when invoking via ldso 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 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index f4c32ffe..ff416838 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -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; -- cgit v1.2.1