summaryrefslogtreecommitdiff
path: root/src/ldso/dynlink.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-07-26 14:25:51 -0400
committerRich Felker <dalias@aerifal.cx>2013-07-26 14:25:51 -0400
commit876748ead3de7798623c09af835a4b56dcc28e0f (patch)
treed15d30c3b088e55ded494a437923448072df46ca /src/ldso/dynlink.c
parent16ac00ac46a14a568ce836db09ffc3f21799690d (diff)
downloadmusl-876748ead3de7798623c09af835a4b56dcc28e0f.tar.gz
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.
Diffstat (limited to 'src/ldso/dynlink.c')
-rw-r--r--src/ldso/dynlink.c4
1 files changed, 1 insertions, 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;