X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fldso%2Fdynlink.c;h=df54230c8cf2517ce9941f14b711f51297b3fcae;hp=e1c2ad7d883a4eaa3abc1d1baee7a85095ec18ec;hb=e12fe65c928f038fb8db0caddcf535ab0a980c58;hpb=c82f4a32ec694903a37d3f9e48da52486a470aa2 diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index e1c2ad7d..df54230c 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -511,10 +511,13 @@ void *__dynlink(int argc, char **argv) ehdr->e_phnum, ehdr->e_phentsize)); decode_dyn(lib); - /* Assume base address of 0 for the main program. This is not - * valid for PIE code; we will have to search the PHDR to get - * the correct load address in the PIE case (not yet supported). */ + /* Find load address of the main program, via AT_PHDR vs PT_PHDR. */ app->base = 0; + phdr = (void *)aux[AT_PHDR]; + for (i=aux[AT_PHNUM]; i; i--, phdr=(void *)((char *)phdr + aux[AT_PHENT])) { + if (phdr->p_type == PT_PHDR) + app->base = (void *)(aux[AT_PHDR] - phdr->p_vaddr); + } app->name = argv[0]; app->global = 1; app->dynv = (void *)(app->base + find_dyn(