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 19:24:48 +0100	[thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <CAKwvOd=LvBL4NTUWMc0rJ-3K+MU5rv-p+j2pfbuseGdiA2ccJw@mail.gmail.com>

On Tue, Mar 22, 2022 at 11:07:17AM -0700, Nick Desaulniers wrote:
> > 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*
> 
> ! What! Are those both statically linked?

Yes:

  $ file hello-nolibc 
  hello-nolibc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped

  (rebuilding without stripping)
  $ nm --size hello-nolibc 
  000000000000000f T main
  0000000000000053 t u64toa_r
  0000000000000280 t printf.constprop.0
  $ nm hello-nolibc 
  00000000004013c5 R __bss_start
  00000000004013c5 R _edata
  00000000004013c8 R _end
  00000000004000bf W _start
  00000000004000b0 T main
  0000000000400130 t printf.constprop.0
  00000000004000dd t u64toa_r

> > 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.
> 
> Oh, so nolibc has been around for a while then?

Not exactly. Over time I collected some of my stuff out of preinit to
make more reusable code for other tools, and eventually created a separate
project for it 5 years ago [1]. I then changed my mind a few times on how
to arrange all this and over time it became a bit easier to use. One day
Paul asked how to make less invasive static binaries for rcutorture and I
found that it was the perfect match so we agreed to integrate it there. It
was still a single file by then. And as usual when some code starts to get
more exposure it receives more contribs and feature requests ;-)

> ld.lld will do string merging in that fashion at -O2 (the linker can
> accept and optimization level).  I did have a kernel patch for that
> somewhere, need to update it for CC_OPTIMIZE_FOR_SIZE...

Ah I didn't know, that's good to know!

> I guess the tradeoff with strings in .text is that now the strings
> themselves are r+x and not just r?

Yes but when you're writing a small shell to allow you to manually
mount your rootfs from the kernel, you don't really care if someone
might try to use some of your strings as code gadgets for ROP exploits :-)

I would really not want to see this used for general programs, but it
does fit well with hacking stuff for initramfs, and what lies in the
selftests directory in general I guess.

What I particularly like is that I don't need a full toolchain, so if
I can build a kernel with the bare-metal compilers from kernel.org then
I know I can also build my initramfs that's packaged in it using the
exact same compiler. This significantly simplifies the build process.

Willy

[1] https://github.com/wtarreau/nolibc

  reply	other threads:[~2022-03-22 18:24 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
2022-03-22 18:07           ` Nick Desaulniers
2022-03-22 18:24             ` Willy Tarreau [this message]
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