From 362c582340190934a67a9de92e4ac791b65d7554 Mon Sep 17 00:00:00 2001 From: Zhou Kang Date: Fri, 7 Jul 2023 01:12:44 +0000 Subject: [PATCH] fix flag for direct call layout --- src/binfmt_rto/binfmt_rto.c | 8 ++++++-- src/elf_hugepage.c | 5 ++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/binfmt_rto/binfmt_rto.c b/src/binfmt_rto/binfmt_rto.c index cd511d8..bd2c886 100644 --- a/src/binfmt_rto/binfmt_rto.c +++ b/src/binfmt_rto/binfmt_rto.c @@ -301,6 +301,8 @@ int __arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp, un // without ld.so // vvar | vdso | app // 8K | 4K | 2M+ + if (debug) + printk("binfmt_rto: base 0x%lx vdso 0x%lx\n", load_bias, load_bias - (PAGE_SIZE * 3)); return g_sym.map_vdso(g_sym.vdso_image_64, load_bias - (PAGE_SIZE * 3)); } @@ -888,8 +890,10 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, // vvar | vdso | app // 8K | 4K | 2M+ if (is_rto_format) { - load_addr = no_base - (PAGE_SIZE * 3) - ELF_PAGESTART(total_size); + load_addr = no_base - (PAGE_SIZE * 3) - ELF_PAGEALIGN(total_size); load_addr_set = 1; + if (debug) + printk("binfmt_rto: base 0x%lx ld_so_addr 0x%lx total_size 0x%lx", no_base, load_addr, total_size); } #endif @@ -1244,7 +1248,7 @@ load_rto: goto out; } } - if (!is_rto_format) + if (!is_rto_format && !(elf_ex->e_flags & OS_SPECIFIC_FLAG_HUGEPAGE)) goto out; if (debug) { printk("exec in rto mode, is_rto_format %d\n", is_rto_format); diff --git a/src/elf_hugepage.c b/src/elf_hugepage.c index 02b6d4d..1d7280b 100644 --- a/src/elf_hugepage.c +++ b/src/elf_hugepage.c @@ -128,5 +128,8 @@ void elf_set_hugepage(elf_link_t *elf_link) phdr[i].p_flags |= PF_HUGEPAGE; } - ef->hdr->e_flags |= OS_SPECIFIC_FLAG_HUGEPAGE | OS_SPECIFIC_FLAG_RTO; + ef->hdr->e_flags |= OS_SPECIFIC_FLAG_HUGEPAGE; + if (is_direct_vdso_optimize(elf_link)) { + ef->hdr->e_flags |= OS_SPECIFIC_FLAG_RTO; + } } -- Gitee