From e12fe65c928f038fb8db0caddcf535ab0a980c58 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 23 Jan 2012 02:02:59 -0500 Subject: [PATCH] dynamic linker support for PIE binaries (position-independent main program) even with this change, PIE will not work yet due to deficiencies in the crt1.o startup code. --- src/ldso/dynlink.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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( -- 2.20.1