Linux-Fsdevel Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH 0/1] Selecting Load Addresses According to p_align
@ 2020-07-24 17:20 Chris Kennelly
2020-07-24 17:20 ` [PATCH 1/1] fs/binfmt_elf: Use PT_LOAD p_align values for suitable start address Chris Kennelly
0 siblings, 1 reply; 2+ messages in thread
From: Chris Kennelly @ 2020-07-24 17:20 UTC (permalink / raw)
To: Alexey Dobriyan, Song Liu, David Rientjes, Ian Rogers,
linux-fsdevel, linux-kernel
Cc: Chris Kennelly
The current ELF loading mechancism provides page-aligned mappings. This
can lead to the program being loaded in a way unsuitable for
file-backed, transparent huge pages when handling PIE executables.
While specifying -z,max-page-size=0x200000 to the linker will generate
suitably aligned segments for huge pages on x86_64, the executable needs
to be loaded at a suitably aligned address as well. This alignment
requires the binary's cooperation, as distinct segments need to be
appropriately paddded to be eligible for THP.
For binaries built with increased alignment, this limits the number of
bits usable for ASLR, but provides some randomization over using fixed
load addresses/non-PIE binaries.
Chris Kennelly (1):
fs/binfmt_elf: Use PT_LOAD p_align values for suitable start address.
fs/binfmt_elf.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
--
2.28.0.rc0.105.gf9edc3c819-goog
^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH 1/1] fs/binfmt_elf: Use PT_LOAD p_align values for suitable start address.
2020-07-24 17:20 [PATCH 0/1] Selecting Load Addresses According to p_align Chris Kennelly
@ 2020-07-24 17:20 ` Chris Kennelly
0 siblings, 0 replies; 2+ messages in thread
From: Chris Kennelly @ 2020-07-24 17:20 UTC (permalink / raw)
To: Alexey Dobriyan, Song Liu, David Rientjes, Ian Rogers,
linux-fsdevel, linux-kernel
Cc: Chris Kennelly
The current ELF loading mechancism provides page-aligned mappings. This
can lead to the program being loaded in a way unsuitable for
file-backed, transparent huge pages when handling PIE executables.
Tested: verified program with -Wl,-z,max-page-size=0x200000 loading
Signed-off-by: Chris Kennelly <ckennelly@google.com>
---
fs/binfmt_elf.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index f4713ea76e827..83fadf66d25ef 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -418,6 +418,25 @@ static int elf_read(struct file *file, void *buf, size_t len, loff_t pos)
return 0;
}
+static unsigned long maximum_alignment(struct elf_phdr *cmds, int nr)
+{
+ unsigned long alignment = 0;
+ int i;
+
+ for (i = 0; i < nr; i++) {
+ if (cmds[i].p_type == PT_LOAD) {
+ /* skip non-power of two alignments */
+ if (cmds[i].p_align & (cmds[i].p_align - 1))
+ continue;
+ if (cmds[i].p_align > alignment)
+ alignment = cmds[i].p_align;
+ }
+ }
+
+ /* ensure we align to at least one page */
+ return ELF_PAGEALIGN(alignment);
+}
+
/**
* load_elf_phdrs() - load ELF program headers
* @elf_ex: ELF header of the binary whose program headers should be loaded
@@ -883,6 +902,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
int elf_prot, elf_flags;
unsigned long k, vaddr;
unsigned long total_size = 0;
+ unsigned long alignment;
if (elf_ppnt->p_type != PT_LOAD)
continue;
@@ -960,6 +980,10 @@ static int load_elf_binary(struct linux_binprm *bprm)
load_bias = ELF_ET_DYN_BASE;
if (current->flags & PF_RANDOMIZE)
load_bias += arch_mmap_rnd();
+ alignment = maximum_alignment(
+ elf_phdata, elf_ex->e_phnum);
+ if (alignment)
+ load_bias &= ~(alignment - 1);
elf_flags |= MAP_FIXED;
} else
load_bias = 0;
--
2.28.0.rc0.105.gf9edc3c819-goog
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-07-24 17:20 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-24 17:20 [PATCH 0/1] Selecting Load Addresses According to p_align Chris Kennelly
2020-07-24 17:20 ` [PATCH 1/1] fs/binfmt_elf: Use PT_LOAD p_align values for suitable start address Chris Kennelly
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).