提交 876748ea 编写于 作者: R Rich Felker

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.
上级 16ac00ac
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册