mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Rich Felker <dalias@libc.org>
To: musl@lists.openwall.com
Subject: Re: [PATCH] _start_c does more work than is necessary
Date: Sat, 25 Aug 2018 21:23:45 -0400	[thread overview]
Message-ID: <20180826012345.GP1878@brightrain.aerifal.cx> (raw)
In-Reply-To: <CAOUYtQAeJvx2a6Gb8NW-64UGC7E=8N7C+LC9nvv_oBnQ4bAEOg@mail.gmail.com>

On Sun, Aug 26, 2018 at 01:56:30AM +0100, Jon Chesterfield wrote:
> The init sequence in musl is _start calls _start_c which calls
> __libc_start_main.
> 
> _start_c passes pointers to the _init and _fini functions, and also a
> trailing zero, to __libc_start_main.
> 
> __libc_start_main currently takes exactly three arguments. I'd like to
> simplify crt1.c by only passing main, argc, argv.
> 
> This is worth a few lines of C and three instructions in the startup
> sequence. E.g. x86-64 this removes mov, mov, xor for fourteen bytes.
> 
> It also removes uses of _init() and _free() which I'm considering deleting
> from a musl/llvm toolchain which makes no use of either, slightly
> decreasing the size of my out of tree patch.
> 
> Thanks,
> 
> Jon
> 
> ---
> diff --git a/crt/crt1.c b/crt/crt1.c
> index af02af9..f27c949 100644
> --- a/crt/crt1.c
> +++ b/crt/crt1.c
> @@ -5,14 +5,11 @@
>  #include "crt_arch.h"
> 
>  int main();
> -void _init() __attribute__((weak));
> -void _fini() __attribute__((weak));
> -_Noreturn int __libc_start_main(int (*)(), int, char **,
> -       void (*)(), void(*)(), void(*)());
> +_Noreturn int __libc_start_main(int (*)(), int, char **);
> 
>  void _start_c(long *p)
>  {
>         int argc = p[0];
>         char **argv = (void *)(p+1);
> -       __libc_start_main(main, argc, argv, _init, _fini, 0);
> +       __libc_start_main(main, argc, argv);
>  }

It may be reasonable to make this change now, but it should be
reviewed. Read the git log for __libc_start_main.c and in particular
commit 7586360badcae6e73f04eb1b8189ce630281c4b2 which explains the
history and non-obvious reason musl does not have any reason to use
these arguments.

Ultimately all crt files except crt1 should be removed at some point.
The _init/_fini machinery (crti/crtn) is purely legacy mess from
before init/fini arrays were used, and the gcc crtbegin/crtend mess is
just for wacky language runtimes like java (gcj, obsolete and removed
from gcc). I'm not sure if there are other compilers out there that
still don't know how to do the arrays, though (pcc? firm/cparser?).

Rich


  reply	other threads:[~2018-08-26  1:23 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-26  0:56 Jon Chesterfield
2018-08-26  1:23 ` Rich Felker [this message]
2018-08-26  1:47   ` Jon Chesterfield
2018-08-30 18:19   ` A. Wilcox

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 \
    --in-reply-to=20180826012345.GP1878@brightrain.aerifal.cx \
    --to=dalias@libc.org \
    --cc=musl@lists.openwall.com \
    /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.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).