[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 17/24] linux-user: Use elf_et_dyn_base for ET_DYN with interpreter
From: |
Richard Henderson |
Subject: |
[PULL 17/24] linux-user: Use elf_et_dyn_base for ET_DYN with interpreter |
Date: |
Sat, 5 Aug 2023 20:37:08 -0700 |
Follow the lead of the linux kernel in fs/binfmt_elf.c,
in which an ET_DYN executable which uses an interpreter
(usually a PIE executable) is loaded away from where the
interpreter itself will be loaded.
Tested-by: Helge Deller <deller@gmx.de>
Reviewed-by: Helge Deller <deller@gmx.de>
Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/elfload.c | 27 +++++++++++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 0c64aad8a5..a3aa08a13e 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -3106,6 +3106,8 @@ static void load_elf_image(const char *image_name, int
image_fd,
}
}
+ load_addr = loaddr;
+
if (pinterp_name != NULL) {
/*
* This is the main executable.
@@ -3135,11 +3137,32 @@ static void load_elf_image(const char *image_name, int
image_fd,
*/
probe_guest_base(image_name, loaddr, hiaddr);
} else {
+ abi_ulong align;
+
/*
* The binary is dynamic, but we still need to
* select guest_base. In this case we pass a size.
*/
probe_guest_base(image_name, 0, hiaddr - loaddr);
+
+ /*
+ * Avoid collision with the loader by providing a different
+ * default load address.
+ */
+ load_addr += elf_et_dyn_base;
+
+ /*
+ * TODO: Better support for mmap alignment is desirable.
+ * Since we do not have complete control over the guest
+ * address space, we prefer the kernel to choose some address
+ * rather than force the use of LOAD_ADDR via MAP_FIXED.
+ * But without MAP_FIXED we cannot guarantee alignment,
+ * only suggest it.
+ */
+ align = pow2ceil(info->alignment);
+ if (align) {
+ load_addr &= -align;
+ }
}
}
@@ -3154,13 +3177,13 @@ static void load_elf_image(const char *image_name, int
image_fd,
*
* Otherwise this is ET_DYN, and we are searching for a location
* that can hold the memory space required. If the image is
- * pre-linked, LOADDR will be non-zero, and the kernel should
+ * pre-linked, LOAD_ADDR will be non-zero, and the kernel should
* honor that address if it happens to be free.
*
* In both cases, we will overwrite pages in this range with mappings
* from the executable.
*/
- load_addr = target_mmap(loaddr, (size_t)hiaddr - loaddr + 1, PROT_NONE,
+ load_addr = target_mmap(load_addr, (size_t)hiaddr - loaddr + 1, PROT_NONE,
MAP_PRIVATE | MAP_ANON | MAP_NORESERVE |
(ehdr->e_type == ET_EXEC ? MAP_FIXED_NOREPLACE :
0),
-1, 0);
--
2.34.1
- Re: [PULL 07/24] linux-user: Do not call get_errno() in do_brk(), (continued)
- [PULL 08/24] linux-user: Use MAP_FIXED_NOREPLACE for do_brk(), Richard Henderson, 2023/08/05
- [PULL 09/24] linux-user: Do nothing if too small brk is specified, Richard Henderson, 2023/08/05
- [PULL 10/24] linux-user: Do not align brk with host page size, Richard Henderson, 2023/08/05
- [PULL 11/24] linux-user: Remove last_brk, Richard Henderson, 2023/08/05
- [PULL 12/24] bsd-user: Remove last_brk, Richard Henderson, 2023/08/05
- [PULL 13/24] linux-user: Adjust task_unmapped_base for reserved_va, Richard Henderson, 2023/08/05
- [PULL 14/24] linux-user: Define TASK_UNMAPPED_BASE in $guest/target_mman.h, Richard Henderson, 2023/08/05
- [PULL 15/24] linux-user: Define ELF_ET_DYN_BASE in $guest/target_mman.h, Richard Henderson, 2023/08/05
- [PULL 17/24] linux-user: Use elf_et_dyn_base for ET_DYN with interpreter,
Richard Henderson <=
- [PULL 18/24] linux-user: Adjust initial brk when interpreter is close to executable, Richard Henderson, 2023/08/05
- [PULL 16/24] linux-user: Use MAP_FIXED_NOREPLACE for initial image mmap, Richard Henderson, 2023/08/05
- [PULL 19/24] linux-user: Properly set image_info.brk in flatload, Richard Henderson, 2023/08/05
- [PULL 20/24] linux-user: Do not adjust image mapping for host page size, Richard Henderson, 2023/08/05
- [PULL 21/24] linux-user: Do not adjust zero_bss for host page size, Richard Henderson, 2023/08/05
- [PULL 22/24] linux-user: Use zero_bss for PT_LOAD with no file contents too, Richard Henderson, 2023/08/05
- [PULL 24/24] linux-user/elfload: Set V in ELF_HWCAP for RISC-V, Richard Henderson, 2023/08/05
- [PULL 23/24] accel/tcg: Call save_iotlb_data from io_readx as well., Richard Henderson, 2023/08/05
- Re: [PULL 00/24] tcg + linux-user queue for 8.1-rc3, Richard Henderson, 2023/08/06
- Failing avocado tests in CI (was: Re: [PULL 00/24] tcg + linux-user queue for 8.1-rc3), Thomas Huth, 2023/08/23