Received: by 2002:a05:6358:16cc:b0:ea:6187:17c9 with SMTP id r12csp7388573rwl; Mon, 9 Jan 2023 23:30:59 -0800 (PST) X-Google-Smtp-Source: AMrXdXtw6KXBBG24jnkw/kc8/uhc8inwa7/y+9PRuBPPidlx0qISN2lqh7UA4CJj4kS25upAarun X-Received: by 2002:a05:6a20:b706:b0:a3:a1ee:47ca with SMTP id fg6-20020a056a20b70600b000a3a1ee47camr76324575pzb.46.1673335859326; Mon, 09 Jan 2023 23:30:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673335859; cv=none; d=google.com; s=arc-20160816; b=zSRkIorHIGX7NRFpENz33yO8janCLN8JvhtjikB2RqDrkhalsIXNfRGH7mq+0Q0hmS zYY5Luo9BvnJFYbRmeNiThN89TXq1vH0P4aQ6ApzUimSbGI3RHQ2O1WWdOIjgbUWTVfi bxpcTdMywmToNILZ9LE9gqwDIIqK/47DHi5RL2M69+NR6vzP5n/WQviwmiPz9Vogc88E MpC9uLlX2iSWPR0ya/HQCAu85KTpZv3LickCWOOttYsqobgpWYoVcvRsZYds8D25m2RK 16SaUblqHDBm4kOwsVhRn2Unu5CrxNgMC7CoVDhVm7km9WcLuuQnXRap61Wy+TV00nHH YtFA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from; bh=eRWnT72D5+IbYoERl2h3GN1YQmj5BPleOpp1y2nsHoY=; b=XN1sh0c8njYS72GcqoQD7ZtShVwPLNmmWZYbO6wocnwobz8KsIR72JTPt9IHxbv6gw kuJF16ge2wee+wQ7Q5CuXGOyv2ofoIzx5U+g1CbLs9fO5ACtHQZ9p5lFMTbYcQ6hlIpx zGzI/eczQzoghzo2wHd40C6q1u4Vvsat4ZqYnDl87fjpgq7fNXEc1z6VQ929WdvlMN4E YISM4KB0+22R3AOtA5AnfJEHAE9KNcKN4JaI91XbsVxLYQ1h7k2g+b76gMZFzhrFGM+1 z5Bj4x49sR4dkVpV841j3mV6zXw2xZQgy8NnCCehxDbqh0ZxjEmpDXl+xZSSKMVd1LWa vXew== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h2-20020a17090a648200b00226e11238f2si10897516pjj.47.2023.01.09.23.30.51; Mon, 09 Jan 2023 23:30:59 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237505AbjAJHZJ (ORCPT + 55 others); Tue, 10 Jan 2023 02:25:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43792 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229916AbjAJHZB (ORCPT ); Tue, 10 Jan 2023 02:25:01 -0500 Received: from 1wt.eu (wtarreau.pck.nerim.net [62.212.114.60]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 9DBC04915C for ; Mon, 9 Jan 2023 23:24:52 -0800 (PST) Received: (from willy@localhost) by pcw.home.local (8.15.2/8.15.2/Submit) id 30A7OaJu003927; Tue, 10 Jan 2023 08:24:36 +0100 From: Willy Tarreau To: "Paul E. McKenney" Cc: linux-kernel@vger.kernel.org, Willy Tarreau , Ammar Faizi Subject: [PATCH v2 00/22] nolibc: usability improvements (errno, environ, auxv) Date: Tue, 10 Jan 2023 08:24:12 +0100 Message-Id: <20230110072434.3863-1-w@1wt.eu> X-Mailer: git-send-email 2.17.5 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_PASS, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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@1wt.eu/ - 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. 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