From patchwork Mon Dec 4 13:39:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Ungerer X-Patchwork-Id: 1871857 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20201202 header.b=gUImAYWm; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=uclibc-ng.org (client-ip=2a00:1828:2000:679::23; helo=helium.openadk.org; envelope-from=devel-bounces@uclibc-ng.org; receiver=patchwork.ozlabs.org) Received: from helium.openadk.org (helium.openadk.org [IPv6:2a00:1828:2000:679::23]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4SksrQ694Hz23mf for ; Tue, 5 Dec 2023 18:40:03 +1100 (AEDT) Received: from helium.openadk.org (localhost [IPv6:::1]) by helium.openadk.org (Postfix) with ESMTP id E47523520FC1; Tue, 5 Dec 2023 08:39:51 +0100 (CET) Authentication-Results: helium.openadk.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20201202 header.b=gUImAYWm; dkim-atps=neutral Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by helium.openadk.org (Postfix) with ESMTPS id DF7F43520F3F; Mon, 4 Dec 2023 14:39:13 +0100 (CET) Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 624CACE1099; Mon, 4 Dec 2023 13:39:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 46808C433C7; Mon, 4 Dec 2023 13:39:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1701697148; bh=Ru3+eMzkMuTqWR/P6yDWrFuj89Wx+QSJmrf33uTmQ00=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=gUImAYWmdgUj0V2goslab5v1dRXjbhQIJPhBxftDrvElz+nnq/XtH6bAjEIFhMbqN VuNvKSE0e4jbRzcmMuaN4xEXuIh2ZcYFe0c7yWHd37VPM4lRdrG47FQW9JmSTv6C4i 7Yif5fuSNPQOG4FyD1hvyQ/kpNw+2kUo3cpn818jOrUnCGNP6nu/bGNNZa0MTdA4AZ yhLAuifKV39olLZl+BIUDSoU6tAgc2SUh7+oFCyZaORv0DT8tCjQ5Rd8J3Bm/xjdRA He30wIq27KWo3rr4eGkKn7h1DJjGImDqaDd8HitXLoh/hilx1vZZDEiD6jXmB4PnUi rJNujv8/MYTtw== Message-ID: <3c9e82d8-f46e-4fd5-8e74-b654a2e3772b@kernel.org> Date: Mon, 4 Dec 2023 23:39:04 +1000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: Waldemar Brodkorb References: <20231128132943.4176918-1-gerg@kernel.org> From: Greg Ungerer In-Reply-To: X-MailFrom: gerg@kernel.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation Message-ID-Hash: MF53FLAYAB7R5NP5JDHCV3QL6N6DLD33 X-Message-ID-Hash: MF53FLAYAB7R5NP5JDHCV3QL6N6DLD33 X-Mailman-Approved-At: Tue, 05 Dec 2023 08:39:27 +0100 CC: devel@uclibc-ng.org, Greg Ungerer X-Mailman-Version: 3.3.3 Precedence: list Subject: [uclibc-ng-devel] Re: [PATCH] elf: support ELF binaries in noMMU List-Id: uClibc-ng Development Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Hi Waldemar, On 1/12/23 18:31, Waldemar Brodkorb wrote: > THis breaks static building of target alpha: > > /home/wbx/embedded-test/openadk/toolchain_qemu-alpha_uclibc-ng/usr/bin/alpha-openadk-linux-uclibc-gcc -c libc/misc/auxvt/getauxval.c -o libc/misc/auxvt/getauxval.os -Wall -Wstrict-prototypes -Wstrict-aliasing -Wp > In file included from ./ldso/include/ldso.h:189, > from libc/misc/auxvt/getauxval.c:21: > ./ldso/include/dl-defs.h:76:10: fatal error: dl-sysdep.h: No such file or directory > 76 | #include > | ^~~~~~~~~~~~~ > compilation terminated. > gmake[6]: *** [Makerules:372: libc/misc/auxvt/getauxval.os] Error 1 > > I think it is this part of the patch: > diff --git a/ldso/include/dl-defs.h b/ldso/include/dl-defs.h > index daa6685cb..e404f17ec 100644 > --- a/ldso/include/dl-defs.h > +++ b/ldso/include/dl-defs.h > @@ -72,10 +72,8 @@ typedef struct { > #endif > > #ifdef _LIBC > -#ifndef __ARCH_HAS_NO_SHARED__ > /* arch specific defines */ > #include > -#endif > #ifdef __TARGET_c6x__ > #include > #endif > > Any idea? Yes, that is definitely the cause. I mis-understood the implications of removing that "#ifndef __ARCH_HAS_NO_SHARED__" conditional. I am testing a different change here that I think might do ther job better: Regards Greg > best regards > Waldemar > > Greg Ungerer wrote, > >> The Linux kernels ELF-FDPIC binfmt program loader can support loading and >> running conventional ELF format binaries on noMMU kernels when compiled >> appropriately. That is when they are constant displacement binaries such >> as generated using the -pie compile option. >> >> Add a configure option to allow selecting ELF binary support in noMMU >> mode configurations on architectures that support this. The main >> requirement is to generate the ldso run-time loader to perform relocation >> at load time. These configurations do not support shared libraries, so >> there is no need to generate a full shared library, only the static >> version is required. >> >> The use of ELF format binaries does mean a slightly simpler toolchain >> generation (does not require a -uclinux- for some architectures) and does >> not require an extra tool like elf2flt. >> >> This initial support targets M68K, ARM and RISC-V architectures. No kernel >> changes are required, the required support for this is already in mainline >> kernels (certainly as of linux-6.6). >> >> Note that for the M68K and ARM architectures that the initialized >> registers and stack layout at process startup is slightly different for >> the flat format loader and the ELF/ELF-FDPIC loaders. So we need some >> changes to the startup code (crt1.S) for them. >> >> I have not done extensive testing outside of M68K, ARM and RISC-V. >> I had to make changes to a couple of the dl-startup.h architecture files >> to get them to build for this noMMU case. I did not dig down too deep on >> the reasons, but they still seem ok for the MMU case as well. >> >> Signed-off-by: Greg Ungerer >> --- >> Makerules | 3 +++ >> Rules.mak | 2 ++ >> extra/Configs/Config.in | 9 +++++++-- >> extra/Configs/Config.in.arch | 8 ++++++++ >> ldso/include/dl-defs.h | 2 -- >> ldso/include/ldso.h | 2 +- >> ldso/ldso/arm/dl-startup.h | 2 ++ >> ldso/ldso/m68k/dl-startup.h | 3 +++ >> ldso/ldso/m68k/dl-sysdep.h | 2 ++ >> ldso/ldso/riscv64/dl-startup.h | 2 ++ >> libc/sysdeps/linux/arm/crt1.S | 2 +- >> libc/sysdeps/linux/m68k/crt1.S | 10 +++++++--- >> 12 files changed, 38 insertions(+), 9 deletions(-) >> >> diff --git a/Makerules b/Makerules >> index 845d81897..1a7443c39 100644 >> --- a/Makerules >> +++ b/Makerules >> @@ -22,6 +22,9 @@ ifeq ($(UCLIBC_FORMAT_SHARED_FLAT),y) >> libs: $(lib-gdb-y) >> endif >> libs: $(lib-a-y) >> +ifeq ($(HAVE_LDSO),y) >> +$(lib-a-y): | $(ldso) >> +endif >> endif >> objs: all_objs >> $(lib-so-y) $(lib-a-y): | $(top_builddir)lib >> diff --git a/Rules.mak b/Rules.mak >> index 5b9154b72..2aacee521 100644 >> --- a/Rules.mak >> +++ b/Rules.mak >> @@ -167,6 +167,8 @@ endif >> >> ifneq ($(HAVE_SHARED),y) >> libc := >> +endif >> +ifneq ($(HAVE_LDSO),y) >> interp := >> ldso := >> endif >> diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in >> index 287db13d2..18748d54b 100644 >> --- a/extra/Configs/Config.in >> +++ b/extra/Configs/Config.in >> @@ -333,8 +333,9 @@ config STATIC_PIE >> bool "Add support for Static Position Independent Executables (PIE)" >> default n >> depends on DOPIC && !UCLIBC_FORMAT_FDPIC_ELF && \ >> - (TARGET_arm || TARGET_i386 || TARGET_x86_64 || TARGET_aarch64 || \ >> - TARGET_mips || TARGET_xtensa || TARGET_powerpc) >> + (TARGET_aarch64 || TARGET_arm || TARGET_i386 || \ >> + TARGET_m68k || TARGET_mips || TARGET_powerpc || \ >> + TARGET_riscv64 || TARGET_x86_64 || TARGET_xtensa) >> >> config ARCH_HAS_NO_SHARED >> bool >> @@ -346,9 +347,13 @@ config ARCH_HAS_NO_LDSO >> config ARCH_HAS_UCONTEXT >> bool >> >> +config HAVE_LDSO >> + bool >> + >> config HAVE_SHARED >> bool "Enable shared libraries" >> depends on !ARCH_HAS_NO_SHARED >> + select HAVE_LDSO >> default y >> help >> If you wish to build uClibc with support for shared libraries then >> diff --git a/extra/Configs/Config.in.arch b/extra/Configs/Config.in.arch >> index 91b639493..4bcf3ff3f 100644 >> --- a/extra/Configs/Config.in.arch >> +++ b/extra/Configs/Config.in.arch >> @@ -10,6 +10,14 @@ >> if !ARCH_USE_MMU >> choice >> prompt "Target File Format" >> +config UCLIBC_FORMAT_ELF >> + bool "ELF (using ELF_FDPIC loader)" >> + depends on !ARCH_USE_MMU && (TARGET_arm || TARGET_m68k || \ >> + TARGET_riscv64) >> + select DOPIC >> + select STATIC_PIE >> + select ARCH_HAS_NO_SHARED >> + select HAVE_LDSO >> config UCLIBC_FORMAT_FDPIC_ELF >> bool "FDPIC ELF" >> depends on !ARCH_USE_MMU && (TARGET_bfin || TARGET_frv || TARGET_arm) >> diff --git a/ldso/include/dl-defs.h b/ldso/include/dl-defs.h >> index daa6685cb..e404f17ec 100644 >> --- a/ldso/include/dl-defs.h >> +++ b/ldso/include/dl-defs.h >> @@ -72,10 +72,8 @@ typedef struct { >> #endif >> >> #ifdef _LIBC >> -#ifndef __ARCH_HAS_NO_SHARED__ >> /* arch specific defines */ >> #include >> -#endif >> #ifdef __TARGET_c6x__ >> #include >> #endif >> diff --git a/ldso/include/ldso.h b/ldso/include/ldso.h >> index 8d9d057a0..80d5d5dd5 100755 >> --- a/ldso/include/ldso.h >> +++ b/ldso/include/ldso.h >> @@ -48,7 +48,7 @@ >> /* Pull in the MIN macro */ >> #include >> /* Pull in the ldso syscalls and string functions */ >> -#ifndef __ARCH_HAS_NO_SHARED__ >> +#if !defined(__ARCH_HAS_NO_SHARED__) || !defined(__ARCH_HAS_NO_LDSO__) >> #include >> #include >> /* Now the ldso specific headers */ >> diff --git a/ldso/ldso/arm/dl-startup.h b/ldso/ldso/arm/dl-startup.h >> index cacd461e1..d00e7b053 100644 >> --- a/ldso/ldso/arm/dl-startup.h >> +++ b/ldso/ldso/arm/dl-startup.h >> @@ -301,3 +301,5 @@ int raise(int sig) >> _dl_exit(1); >> } >> #endif /* __FDPIC__ */ >> + >> +#define DL_UPDATE_LOADADDR_HDR(LOADADDR, ADDR, PHDR) >> diff --git a/ldso/ldso/m68k/dl-startup.h b/ldso/ldso/m68k/dl-startup.h >> index dfece443f..9c3285e27 100644 >> --- a/ldso/ldso/m68k/dl-startup.h >> +++ b/ldso/ldso/m68k/dl-startup.h >> @@ -55,6 +55,9 @@ _dl_start_user:\n\ >> * do something a little more subtle here. */ >> #define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS) + 1) >> >> +/* We can't call functions earlier in the dl startup process */ >> +#define NO_FUNCS_BEFORE_BOOTSTRAP >> + >> /* Handle relocation of the symbols in the dynamic loader. */ >> static __always_inline >> void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr, >> diff --git a/ldso/ldso/m68k/dl-sysdep.h b/ldso/ldso/m68k/dl-sysdep.h >> index 21937b259..5d2d7a097 100644 >> --- a/ldso/ldso/m68k/dl-sysdep.h >> +++ b/ldso/ldso/m68k/dl-sysdep.h >> @@ -83,3 +83,5 @@ elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, >> *reloc_addr = load_off + rpnt->r_addend; >> } while (--relative_count); >> } >> + >> +#define DL_UPDATE_LOADADDR_HDR(LOADADDR, ADDR, PHDR) >> diff --git a/ldso/ldso/riscv64/dl-startup.h b/ldso/ldso/riscv64/dl-startup.h >> index dabe1bebd..82e525e66 100644 >> --- a/ldso/ldso/riscv64/dl-startup.h >> +++ b/ldso/ldso/riscv64/dl-startup.h >> @@ -88,3 +88,5 @@ void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, ElfW(Addr) *reloc_addr, >> _dl_exit(1); >> } >> } >> + >> +#define DL_UPDATE_LOADADDR_HDR(LOADADDR, ADDR, PHDR) >> diff --git a/libc/sysdeps/linux/arm/crt1.S b/libc/sysdeps/linux/arm/crt1.S >> index fade1d25c..799f11080 100644 >> --- a/libc/sysdeps/linux/arm/crt1.S >> +++ b/libc/sysdeps/linux/arm/crt1.S >> @@ -245,7 +245,7 @@ _start: >> mov fp, #0 >> mov lr, #0 >> >> -#ifdef __ARCH_USE_MMU__ >> +#if defined(__ARCH_USE_MMU__) || defined(__UCLIBC_FORMAT_ELF__) >> #ifdef L_rcrt1 >> /* We don't need to save a1 since no dynamic linker should have run */ >> ldr a1, .L_GOT /* Get value at .L_GOT + 0 (offset to GOT)*/ >> diff --git a/libc/sysdeps/linux/m68k/crt1.S b/libc/sysdeps/linux/m68k/crt1.S >> index 815a6076f..e7292682b 100644 >> --- a/libc/sysdeps/linux/m68k/crt1.S >> +++ b/libc/sysdeps/linux/m68k/crt1.S >> @@ -78,9 +78,13 @@ _start: >> sub.l %fp, %fp >> >> #if !defined __ARCH_USE_MMU__ && defined __PIC__ >> +#ifdef UCLIBC_FORMAT_ELF >> + move.l #_GLOBAL_OFFSET_TABLE_, %a5 >> +#else >> /* Set up the global pointer. The GOT is at the beginning of the >> data segment, whose address is in %d5. */ >> move.l %d5,%a5 >> +#endif >> .equ have_current_got, 1 >> #endif >> >> @@ -92,11 +96,11 @@ _start: >> arguments for `main': argc, argv. envp will be determined >> later in __libc_start_main. */ >> move.l (%sp)+, %d0 /* Pop the argument count. */ >> -#ifndef __ARCH_USE_MMU__ >> - move.l (%sp)+, %a0 >> -#else >> +#if defined(__ARCH_USE_MMU__) || defined(__UCLIBC_FORMAT_ELF__) >> move.l %sp, %a0 /* The argument vector starts just at the >> current stack top. */ >> +#else >> + move.l (%sp)+, %a0 >> #endif >> >> /* Provide the highest stack address to the user code (for stacks >> -- >> 2.25.1 >> >> _______________________________________________ >> devel mailing list -- devel@uclibc-ng.org >> To unsubscribe send an email to devel-leave@uclibc-ng.org >> --- a/ldso/include/dl-defs.h +++ b/ldso/include/dl-defs.h @@ -72,7 +72,7 @@ #endif #ifdef _LIBC -#ifndef __ARCH_HAS_NO_SHARED__ +#ifndef __ARCH_HAS_NO_LDSO__ /* arch specific defines */ #include #endif