public inbox for [email protected]
 help / color / mirror / Atom feed
From: Willy Tarreau <[email protected]>
To: Nick Desaulniers <[email protected]>
Cc: Linux Kernel Mailing List <[email protected]>,
	GNU/Weeb Mailing List <[email protected]>,
	[email protected]
Subject: Re: [RFC PATCH v2 2/8] tools/nolibc: Remove .global _start from the entry point code
Date: Tue, 22 Mar 2022 18:58:16 +0100	[thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <CAKwvOdmr6u-zNynUDAg4pmwerQFUkG+eD0QhpzDED9eg+U2pfA@mail.gmail.com>

On Tue, Mar 22, 2022 at 10:30:53AM -0700, Nick Desaulniers wrote:
> (Moving folks to bcc; check the lists if you're interested)

Yes, agreed :-)

> On Tue, Mar 22, 2022 at 10:25 AM Willy Tarreau <[email protected]> wrote:
> > The purpose is clearly *not* to implement a libc, but to have
> > something very lightweight that allows to compile trivial programs. A good
> > example of this is tools/testing/selftests/rcutorture/bin/mkinitrd.sh. I'm
> > personally using a tiny pre-init shell that I always package with my
> > kernels and that builds with them [1]. It will never do big things but
> > the balance between ease of use and coding effort is pretty good in my
> > experience. And I'm also careful not to make it complicated to use nor
> > to maintain, pragmatism is important and the effort should remain on the
> > program developer if some arbitration is needed.
> 
> Neat, I bet that helps generate very small initrd! Got any quick size
> measurements?

Yep:

First, the usual static printf("hello world!\n"):

  $ ll hello-*libc
  -rwxrwxr-x 1 willy dev 719232 Mar 22 18:50 hello-glibc*
  -rwxrwxr-x 1 willy dev   1248 Mar 22 18:51 hello-nolibc*

  $ objdump -h hello-nolibc 
  hello-nolibc:     file format elf64-x86-64

  Sections:
  Idx Name          Size      VMA               LMA               File off  Algn
    0 .text         00000300  00000000004000b0  00000000004000b0  000000b0  2**0
                    CONTENTS, ALLOC, LOAD, READONLY, CODE
    1 .rodata       00000015  00000000004003b0  00000000004003b0  000003b0  2**0
                    CONTENTS, ALLOC, LOAD, READONLY, DATA

Then the preinit stuff:

  $ ll initramfs/init 
  -rwxr-xr-x 1 willy users 13936 Mar 22 18:40 initramfs/init*

  $ xz -c9 < initramfs/init | wc -c
  8392

  $ size initramfs/init 
     text    data     bss     dec     hex filename
    13348       0   23016   36364    8e0c init

  $ objdump -h initramfs/init
  initramfs/init:     file format elf64-x86-64
  Sections:
  Idx Name          Size      VMA               LMA               File off  Algn
    0 .text         00002b74  00000000004000e8  00000000004000e8  000000e8  2**0
                    CONTENTS, ALLOC, LOAD, READONLY, CODE
    1 .rodata       000008b0  0000000000402c60  0000000000402c60  00002c60  2**5
                    CONTENTS, ALLOC, LOAD, READONLY, DATA
    2 .bss          000059e8  0000000000404520  0000000000404520  00003520  2**5
                    ALLOC

This one supports ~30-40 simple commands (mount/unmount, mknod, ls, ln),
a tar extractor, multi-level braces, and boolean expression evaluation,
variable expansion, and a config file parser to script all this. The code
is 20 years old and is really ugly (even uglier than you think). But that
gives an idea. 20 years ago the init was much simpler and 800 bytes (my
constraint was for single floppies containing kernel+rootfs) and strings
were manually merged by tails and put in .text to drop .rodata.

You'll also note that there's 0 data segment above. That used to be
convenient to further shrink programs, but these days given how linkers
arrange segments by permissions that doesn't save as much as it used to,
and it's likely that at some points I'll assume that there must be some
variables by default (errno, environ, etc) and that we'll accept to invest
a few extra tens of bytes by default for more convenience.

Cheers,
Willy

  reply	other threads:[~2022-03-22 17:58 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-22 10:21 [RFC PATCH v2 0/8] Add dynamic memory allocator support for nolibc Ammar Faizi
2022-03-22 10:21 ` [RFC PATCH v2 1/8] tools/nolibc: x86-64: Update System V ABI document link Ammar Faizi
2022-03-22 10:21 ` [RFC PATCH v2 2/8] tools/nolibc: Remove .global _start from the entry point code Ammar Faizi
2022-03-22 17:09   ` Nick Desaulniers
2022-03-22 17:25     ` Willy Tarreau
2022-03-22 17:30       ` Nick Desaulniers
2022-03-22 17:58         ` Willy Tarreau [this message]
2022-03-22 18:07           ` Nick Desaulniers
2022-03-22 18:24             ` Willy Tarreau
2022-03-22 18:38               ` Nick Desaulniers
2022-03-22 10:21 ` [RFC PATCH v2 3/8] tools/nolibc: i386: Implement syscall with 6 arguments Ammar Faizi
2022-03-22 10:57   ` David Laight
2022-03-22 11:23     ` Willy Tarreau
2022-03-22 11:39   ` David Laight
2022-03-22 12:02     ` Ammar Faizi
2022-03-22 12:07       ` Ammar Faizi
2022-03-22 12:13       ` Willy Tarreau
2022-03-22 13:26         ` Ammar Faizi
2022-03-22 13:34           ` Willy Tarreau
2022-03-22 13:37             ` Ammar Faizi
2022-03-22 13:39               ` David Laight
2022-03-22 13:41                 ` Willy Tarreau
2022-03-22 13:45                   ` Ammar Faizi
2022-03-22 13:54                     ` Ammar Faizi
2022-03-22 13:56                       ` Ammar Faizi
2022-03-22 14:02                         ` Willy Tarreau
2022-03-22 13:37         ` David Laight
2022-03-22 14:47           ` Alviro Iskandar Setiawan
2022-03-22 15:11             ` David Laight
2022-03-23  6:29           ` Ammar Faizi
2022-03-23  6:32             ` Ammar Faizi
2022-03-23  7:10             ` Willy Tarreau
2022-03-22 10:21 ` [RFC PATCH v2 4/8] tools/nolibc/sys: Implement `mmap()` and `munmap()` Ammar Faizi
2022-03-22 10:21 ` [RFC PATCH v2 5/8] tools/nolibc/types: Implement `offsetof()` and `container_of()` macro Ammar Faizi
2022-03-22 10:21 ` [RFC PATCH v2 6/8] tools/nolibc/stdlib: Implement `malloc()`, `calloc()`, `realloc()` and `free()` Ammar Faizi
2022-03-22 11:52   ` David Laight
2022-03-22 12:18     ` Ammar Faizi
2022-03-22 12:36       ` Alviro Iskandar Setiawan
2022-03-22 12:42         ` Ammar Faizi
2022-03-22 12:21     ` Willy Tarreau
2022-03-22 10:21 ` [RFC PATCH v2 7/8] tools/nolibc/string: Implement `strnlen()` Ammar Faizi
2022-03-22 10:21 ` [RFC PATCH v2 8/8] tools/include/string: Implement `strdup()` and `strndup()` Ammar Faizi
2022-03-22 11:27 ` [RFC PATCH v2 0/8] Add dynamic memory allocator support for nolibc Willy Tarreau
2022-03-22 12:43   ` Ammar Faizi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox