linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Michael Matz <matz@suse.de>
To: Jiri Slaby <jirislaby@kernel.org>
Cc: "Masahiro Yamada" <masahiroy@kernel.org>,
	linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arch@vger.kernel.org,
	"Nick Desaulniers" <ndesaulniers@google.com>,
	"Nathan Chancellor" <nathan@kernel.org>,
	"Martin Liška" <mliska@suse.cz>,
	"Borislav Petkov" <bpetkov@suse.de>,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Ard Biesheuvel" <ardb@kernel.org>
Subject: Re: [PATCH v3 6/7] kbuild: use obj-y instead extra-y for objects placed at the head
Date: Tue, 25 Oct 2022 12:26:35 +0000 (UTC)	[thread overview]
Message-ID: <alpine.LSU.2.20.2210251210140.29399@wotan.suse.de> (raw)
In-Reply-To: <ea468b86-abb7-bb2b-1e0a-4c8959d23f1c@kernel.org>

Hello,

On Mon, 24 Oct 2022, Jiri Slaby wrote:

> > Create vmlinux.a to collect all the objects that are unconditionally
> > linked to vmlinux. The objects listed in head-y are moved to the head
> > of vmlinux.a by using 'ar m'.
... 
> > --- a/scripts/Makefile.vmlinux_o
> > +++ b/scripts/Makefile.vmlinux_o
> > @@ -18,7 +18,7 @@ quiet_cmd_gen_initcalls_lds = GEN     $@
> >   	$(PERL) $(real-prereqs) > $@
> >     .tmp_initcalls.lds: $(srctree)/scripts/generate_initcall_order.pl \
> > -		$(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
> > +		vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
> 
> There is a slight problem with this. The kernel built with gcc-LTO does not
> boot. But as I understand it, it's not limited to gcc-LTO only.
> 
> On x86, startup_64() is supposed to be at offset >zero< of the image (see
> .Lrelocated()). It was ensured by putting head64.o to the beginning of vmlinux
> (by KBUILD_VMLINUX_OBJS on the LD command-line above). The patch above instead
> packs head64.o into vmlinux.a and then moves it using "ar -m" to the beginning
> (it's in 7/7 of the series IIRC).
> 
> The problem is that .o files listed on the LD command line explicitly are
> taken as spelled. But unpacking .a inside LD gives no guarantees on the order
> of packed objects. To quote: "that it happens to work sometimes is pure luck."
> (Correct me guys, if I misunderstood you.)

To be precise: I know of no linker (outside LTO-like modes) that processes 
archives in a different order than first-to-last-member (under 
whole-archive), but that's not guaranteed anywhere.  So relying on 
member-order within archives is always brittle.

It will completely break down with LTO modes: the granularity for that is 
functions, and they are placed in some unknown (from the outside, but 
usually related to call-graph locality) order into several partitions, 
with non-LTO-able parts (like asm code) being placed randomly between 
them.  The order of these blobs can not be defined in relation to the 
input order of object files: with cross-file dependencies such order might 
not even exist.  Those whole sequence of blobs then takes the place of the 
input archive (which, as there was only one, has no particular order from 
the linker command lines perspective).

There are only two ways of guaranteeing an ordering: put non-LTO-.o files 
at certain places of the link command, or, better, use a linker script to 
specify an order.

> For x86, the most ideal fix seems to be to fix it in the linker script. By
> putting startup_64() to a different section and handle it in the ld script
> specially -- see the attachment. It should always have been put this way, the
> command line order is only a workaround. But this might need more fixes on
> other archs too -- I haven't take a look.
> 
> Ideas, comments? I'll send the attachment as a PATCH later (if there are 
> no better suggestions).

This will work.  An alternative way would be to explicitely name the input 
file in the section commands, without renaming the section:

@@ -126,6 +126,7 @@ SECTIONS
                _text = .;
                _stext = .;
                /* bootstrapping code */
+               KEEP(vmlinux.a:head64.o(.head.text))
                HEAD_TEXT
                TEXT_TEXT

But I guess not all arch's name their must-be-first file head64.o (or even 
have such requirement), so that's probably still arch-dependend and hence 
not inherently better than your way.

(syntax for the section selector in linkerscripts is:

  {archive-glob:}filename-glob (sectionname-glob)


Ciao,
Michael.

  reply	other threads:[~2022-10-25 12:26 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-24 18:19 [PATCH v3 0/7] kbuild: various cleanups Masahiro Yamada
2022-09-24 18:19 ` [PATCH v3 1/7] kbuild: hard-code KBUILD_ALLDIRS in scripts/Makefile.package Masahiro Yamada
2022-09-28 19:09   ` Nicolas Schier
2022-09-24 18:19 ` [PATCH v3 2/7] kbuild: list sub-directories in ./Kbuild Masahiro Yamada
2022-09-24 19:37   ` kernel test robot
2022-09-24 20:27   ` kernel test robot
2022-09-25  0:28     ` Masahiro Yamada
2022-09-26 21:06       ` Nick Desaulniers
2022-09-28  8:32         ` Masahiro Yamada
2022-09-28 19:30   ` Nicolas Schier
2022-09-24 18:19 ` [PATCH v3 3/7] kbuild: move .vmlinux.objs rule to Makefile.modpost Masahiro Yamada
2022-09-28 19:35   ` Nicolas Schier
2022-09-24 18:19 ` [PATCH v3 4/7] kbuild: move vmlinux.o rule to the top Makefile Masahiro Yamada
2022-09-28 19:37   ` Nicolas Schier
2022-09-24 18:19 ` [PATCH v3 5/7] kbuild: unify two modpost invocations Masahiro Yamada
2022-09-28 19:59   ` Nicolas Schier
2022-09-28 21:05     ` Masahiro Yamada
2022-09-24 18:19 ` [PATCH v3 6/7] kbuild: use obj-y instead extra-y for objects placed at the head Masahiro Yamada
2022-09-28 20:15   ` Nicolas Schier
2022-10-24 18:24   ` Jiri Slaby
2022-10-25 12:26     ` Michael Matz [this message]
2022-10-26  8:35       ` Jiri Slaby
2022-10-26 11:20         ` Ard Biesheuvel
2022-10-26 16:29       ` Masahiro Yamada
2022-10-26 17:09         ` Michael Matz
2022-09-24 18:19 ` [PATCH v3 7/7] kbuild: remove head-y syntax Masahiro Yamada
2022-09-29 15:21   ` Nicolas Schier
2022-10-18  8:16   ` Jiri Slaby
2022-10-18  9:12     ` Masahiro Yamada
2022-09-26 21:39 ` [PATCH v3 0/7] kbuild: various cleanups Nick Desaulniers

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=alpine.LSU.2.20.2210251210140.29399@wotan.suse.de \
    --to=matz@suse.de \
    --cc=ardb@kernel.org \
    --cc=bpetkov@suse.de \
    --cc=jirislaby@kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=masahiroy@kernel.org \
    --cc=mliska@suse.cz \
    --cc=nathan@kernel.org \
    --cc=ndesaulniers@google.com \
    --cc=peterz@infradead.org \
    /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;
as well as URLs for NNTP newsgroup(s).