Re: [PATCH v2 00/22] nolibc: usability improvements (errno, environ, auxv)

From: Paul E. McKenney
Date: Tue Jan 10 2023 - 17:23:48 EST


On Tue, Jan 10, 2023 at 08:24:12AM +0100, Willy Tarreau wrote:
> Hello Paul,
>
> this 3rd series aims at generally improving usability and maintainance
> of nolibc. It needs to be applied on top of the s390 series:
>
> https://lore.kernel.org/lkml/20230109080910.26594-1-w@xxxxxx/
>
> - first, I've encountered remaining problems related to section
> reordering happening at certain optimization levels and that is also
> arch-dependent. We were fortunate they didn't appear in rcutorture,
> but I could reproduce them with ARM in Thumb mode at -O0. The problem
> is that our out-of-block asm() statement changes the current section
> to ".text" without the compiler knowing. Thus the compiler may believe
> it's still in .bss and emit variables immediately after (e.g. errno),
> which end up in the wrong section. Switching the section at the end
> to .bss doesn't work either because at -Os I was seeing sys_brk()
> placed immediately after and crashing as .bss is not executable. The
> only safe solution is to turn _start to real functions. This was
> tested on all archs at -O0,-O1,-O2,-O3,-Os and all of them now work.
>
> - second, thumb mode support was in complete on ARM. Only thumb-2 was
> supported and depending on how the toolchain is configured, passing
> "-mthumb" would result in thumb-1 (if armv4/5 was the default) or
> thumb-2 (when armv7 was the default). I discovered this when first
> trying the toolchains from kernel.org because mine works in v7 by
> default, hence thumb-2. The change only replaces a few instructions
> that are not available in thumb-1 by their compatible equivalent. In
> addition, thumb cannot be used at -O0 or with frame pointers in general
> because register r7 is the frame pointer there, and cannot be assigned
> by the compiler. That's bad because r7 carries the syscall number. Now
> when thumb is detected, we simply use a slightly larger setup code
> which uses r6 and swaps it with r7 when performing the call.
>
> - third, the definitions of the (possibly wrong) arch-specific O_* values
> were dropped in favor of those coming from asm/fcntl.h. Not only these
> ones are correct, but doing so will avoid build redefinition warnings
> should the file be included for whatever other reason.
>
> - the errno, environ and the auxiliary vector were really a pain to
> use. errno was declared as a static variable, showing a different
> one to each build unit. environ had to be declared by the application,
> and the auxv had to be both declared and found by the application if
> needed. All three of them have now been declared as weak symbols,
> and environ and _auxv are setup during startup, so that only one
> instance of them exists across the whole binary, and that code
> currently declaring them continues to work. This now means that code
> not using them will not optimize them away anymore, but let's face
> it, errno was always used and no relevant application manages to get
> rid of .bss, so the amount of extra space is really just 8-16 bytes
> total for a much better simplicity for the user.
>
> - getauxval() and getpagesize() were added by Ammar Faizi (along with
> the associated selftests).
>
> This was tested on arm64/armv5/armv7/thumb1/thumb2/i386/x86_64/mips/riscv
> and s390 at all optimization levels. I could also verify that my original
> preinit code continues to build and work fine, so please consider queuing
> it.

Queued and pushed, thank you!

Thanx, Paul

> Thank you!
> Willy
>
> Changes since v1:
> - added missing s-o-b on the last 3 patches
>
> Ammar Faizi (3):
> nolibc/stdlib: Implement `getauxval(3)` function
> nolibc/sys: Implement `getpagesize(2)` function
> selftests/nolibc: Add `getpagesize(2)` selftest
>
> Sven Schnelle (2):
> tools/nolibc: export environ as a weak symbol on s390
> tools/nolibc: add auxiliary vector retrieval for s390
>
> Willy Tarreau (17):
> tools/nolibc: make compiler and assembler agree on the section around
> _start
> tools/nolibc: enable support for thumb1 mode for ARM
> tools/nolibc: support thumb mode with frame pointers on ARM
> tools/nolibc: remove local definitions of O_* flags for open/fcntl
> tools/nolibc: make errno a weak symbol instead of a static one
> tools/nolibc: export environ as a weak symbol on x86_64
> tools/nolibc: export environ as a weak symbol on i386
> tools/nolibc: export environ as a weak symbol on arm64
> tools/nolibc: export environ as a weak symbol on arm
> tools/nolibc: export environ as a weak symbol on mips
> tools/nolibc: export environ as a weak symbol on riscv
> tools/nolibc: add auxiliary vector retrieval for i386
> tools/nolibc: add auxiliary vector retrieval for x86_64
> tools/nolibc: add auxiliary vector retrieval for arm64
> tools/nolibc: add auxiliary vector retrieval for arm
> tools/nolibc: add auxiliary vector retrieval for riscv
> tools/nolibc: add auxiliary vector retrieval for mips
>
> tools/include/nolibc/arch-aarch64.h | 52 +++----
> tools/include/nolibc/arch-arm.h | 138 ++++++++++++-------
> tools/include/nolibc/arch-i386.h | 60 ++++----
> tools/include/nolibc/arch-mips.h | 79 ++++++-----
> tools/include/nolibc/arch-riscv.h | 62 +++++----
> tools/include/nolibc/arch-s390.h | 70 +++++-----
> tools/include/nolibc/arch-x86_64.h | 52 +++----
> tools/include/nolibc/errno.h | 4 +-
> tools/include/nolibc/stdlib.h | 27 ++++
> tools/include/nolibc/sys.h | 22 +++
> tools/testing/selftests/nolibc/nolibc-test.c | 30 ++++
> 11 files changed, 363 insertions(+), 233 deletions(-)
>
> --
> 2.17.5
>