On 2024/7/5 03:05, Benjamin Berg wrote:
[...]
>  static int userspace_tramp(void *stack)
>  {
> -     struct sigaction sa;
> -     void *addr;
> -     int fd;
> +     char *const argv[] = { "uml-userspace", NULL };
> +     int pipe_fds[2];
>       unsigned long long offset;
> -     unsigned long segv_handler = STUB_CODE +
> -                                  (unsigned long) stub_segv_handler -
> -                                  (unsigned long) __syscall_stub_start;
> -
> -     ptrace(PTRACE_TRACEME, 0, 0, 0);
> -
> -     signal(SIGTERM, SIG_DFL);
> -     signal(SIGWINCH, SIG_IGN);
> -
> -     fd = phys_mapping(uml_to_phys(__syscall_stub_start), &offset);
> -     addr = mmap64((void *) STUB_CODE, UM_KERN_PAGE_SIZE,
> -                   PROT_EXEC, MAP_FIXED | MAP_PRIVATE, fd, offset);
> -     if (addr == MAP_FAILED) {
> -             os_info("mapping mmap stub at 0x%lx failed, errno = %d\n",
> -                     STUB_CODE, errno);
> -             exit(1);
> +     struct stub_init_data init_data = {
> +             .stub_start = STUB_START,
> +             .segv_handler = STUB_CODE +
> +                             (unsigned long) stub_segv_handler -
> +                             (unsigned long) __syscall_stub_start,
> +     };
> +     struct iomem_region *iomem;
> +     int ret;
> +
> +     init_data.stub_code_fd = phys_mapping(uml_to_phys(__syscall_stub_start),
> +                                           &offset);
> +     init_data.stub_code_offset = MMAP_OFFSET(offset);
> +
> +     init_data.stub_data_fd = phys_mapping(uml_to_phys(stack), &offset);
> +     init_data.stub_data_offset = MMAP_OFFSET(offset);
> +
> +     /* Set CLOEXEC on all FDs and then unset on all memory related FDs */
> +     close_range(0, ~0U, CLOSE_RANGE_CLOEXEC);

I got a link error on Ubuntu 22.04.4 (glibc-2.35) when STATIC_LINK is enabled:

/usr/bin/ld:
/usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libc.a(close_range.o):
in function `__close_range':
(.text+0x0): multiple definition of `__close_range';
fs/file.o:/home/test/linux/fs/file.c:741: first defined here

We probably need something like this:

diff --git a/arch/um/Makefile b/arch/um/Makefile
index 00b63bac5eff..31e367e8ab4d 100644
--- a/arch/um/Makefile
+++ b/arch/um/Makefile
@@ -61,7 +61,8 @@ KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ \
        $(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap      \
        -Dlongjmp=kernel_longjmp -Dsetjmp=kernel_setjmp \
        -Din6addr_loopback=kernel_in6addr_loopback \
-       -Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr
+       -Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr \
+       -D__close_range=kernel__close_range

 KBUILD_RUSTFLAGS += -Crelocation-model=pie

Regards,
Tiwei

Reply via email to