aboutsummaryrefslogtreecommitdiff
path: root/bsd-user/elfload.c
diff options
context:
space:
mode:
authorBlue Swirl <blauwirbel@gmail.com>2009-09-27 19:30:51 +0000
committerBlue Swirl <blauwirbel@gmail.com>2009-09-27 19:30:51 +0000
commit2fa5d9ba56e93dd80b71127025d8467fc1bafff5 (patch)
tree5945a1ca60fb8662d92b6687e1b989ad67bd8df9 /bsd-user/elfload.c
parent17cf428f2e1f6970296b4c0ddcb054e4bc3f2355 (diff)
BSD user: implement GUEST_BASE
Based on 379f6698d73f476de38682b3ff96ecb226728c43. Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Diffstat (limited to 'bsd-user/elfload.c')
-rw-r--r--bsd-user/elfload.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/bsd-user/elfload.c b/bsd-user/elfload.c
index 48ec4ac150..06e6c63efb 100644
--- a/bsd-user/elfload.c
+++ b/bsd-user/elfload.c
@@ -1337,6 +1337,29 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
info->mmap = 0;
elf_entry = (abi_ulong) elf_ex.e_entry;
+#if defined(CONFIG_USE_GUEST_BASE)
+ /*
+ * In case where user has not explicitly set the guest_base, we
+ * probe here that should we set it automatically.
+ */
+ if (!have_guest_base) {
+ /*
+ * Go through ELF program header table and find out whether
+ * any of the segments drop below our current mmap_min_addr and
+ * in that case set guest_base to corresponding address.
+ */
+ for (i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum;
+ i++, elf_ppnt++) {
+ if (elf_ppnt->p_type != PT_LOAD)
+ continue;
+ if (HOST_PAGE_ALIGN(elf_ppnt->p_vaddr) < mmap_min_addr) {
+ guest_base = HOST_PAGE_ALIGN(mmap_min_addr);
+ break;
+ }
+ }
+ }
+#endif /* CONFIG_USE_GUEST_BASE */
+
/* Do this so that we can load the interpreter, if need be. We will
change some of these later */
info->rss = 0;