From: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
To: "Linus Torvalds" <torvalds@linux-foundation.org>,
"Nathan Chancellor" <nathan@kernel.org>,
"Nicolas Schier" <nsc@kernel.org>,
"Nick Desaulniers" <ndesaulniers@google.com>,
"Bill Wendling" <morbo@google.com>,
"Justin Stitt" <justinstitt@google.com>,
"Geert Uytterhoeven" <geert@linux-m68k.org>,
"Luis Chamberlain" <mcgrof@kernel.org>,
"Petr Pavlu" <petr.pavlu@suse.com>,
"Daniel Gomez" <da.gomez@kernel.org>,
"Sami Tolvanen" <samitolvanen@google.com>,
"Aaron Tomlin" <atomlin@atomlin.com>,
"Josh Poimboeuf" <jpoimboe@kernel.org>,
"Peter Zijlstra" <peterz@infradead.org>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Boqun Feng" <boqun@kernel.org>, "Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Danilo Krummrich" <dakr@kernel.org>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Tamir Duberstein" <tamird@kernel.org>,
"Alexandre Courbot" <acourbot@nvidia.com>,
"Onur Özkan" <work@onurozkan.dev>
Cc: ljs@kernel.org, linux-kbuild@vger.kernel.org,
linux-kernel@vger.kernel.org, llvm@lists.linux.dev,
linux-m68k@lists.linux-m68k.org, linux-modules@vger.kernel.org,
rust-for-linux@vger.kernel.org
Subject: [PATCH v5 06/11] objtool: do not hash DWARF relocations
Date: Wed, 04 Nov 2026 18:20:24 +0000 [thread overview]
Message-ID: <20261104-build-speedup-v5-6-0f6018be8dae@kernel.org> (raw)
In-Reply-To: <20261104-build-speedup-v5-0-0f6018be8dae@kernel.org>
objtool hashes the relocation of each section so it can find them by
destination, but DWARF sections are never looked up this way, so there is
no reason to hash them.
With CONFIG_DEBUG_INFO_DWARF5 set a defconfig vmlinux.o has ~22 million
relocations, 20.5 million of which are .debug_* sections.
Therefore, don't hash these.
With the same configuration the objtool vmlinux.o link-time run takes ~.5s
less to complete (2.63s -> 2.14s) and ~130 MiB memory to do it.
The output remains unchanged.
Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
---
tools/objtool/elf.c | 32 +++++++++++++++++++++++++-------
1 file changed, 25 insertions(+), 7 deletions(-)
diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
index a791f4ea6ec1..98a110e3e8f5 100644
--- a/tools/objtool/elf.c
+++ b/tools/objtool/elf.c
@@ -1071,7 +1071,8 @@ struct reloc *elf_init_reloc(struct elf *elf, struct section *rsec,
set_reloc_type(elf, reloc, type);
set_reloc_addend(elf, reloc, addend);
- elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc));
+ if (!is_dwarf_section(rsec->base))
+ elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc));
set_sym_next_reloc(reloc, sym->relocs);
sym->relocs = reloc;
@@ -1125,16 +1126,14 @@ struct reloc *elf_init_reloc_data_sym(struct elf *elf, struct section *sec,
static int read_relocs(struct elf *elf)
{
- unsigned long nr_reloc, max_reloc = 0;
+ unsigned long nr_reloc, max_reloc = 0, nr_hashed = 0;
struct section *rsec;
struct reloc *reloc;
unsigned int symndx;
struct symbol *sym;
+ bool hashed;
int i;
- if (!elf_alloc_hash(reloc, elf->num_relocs))
- return -1;
-
list_for_each_entry(rsec, &elf->sections, list) {
if (!is_reloc_sec(rsec))
continue;
@@ -1147,6 +1146,23 @@ static int read_relocs(struct elf *elf)
rsec->base->rsec = rsec;
+ /*
+ * DWARF relocations are never looked up by destination, they
+ * only need to be on their symbol's list.
+ */
+ if (!is_dwarf_section(rsec->base))
+ nr_hashed += sec_num_entries(rsec);
+ }
+
+ if (!elf_alloc_hash(reloc, nr_hashed))
+ return -1;
+
+ list_for_each_entry(rsec, &elf->sections, list) {
+ if (!is_reloc_sec(rsec))
+ continue;
+
+ hashed = !is_dwarf_section(rsec->base);
+
/* nr_alloc_relocs=0: libelf owns d_buf */
rsec->nr_alloc_relocs = 0;
@@ -1168,7 +1184,8 @@ static int read_relocs(struct elf *elf)
return -1;
}
- elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc));
+ if (hashed)
+ elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc));
set_sym_next_reloc(reloc, sym->relocs);
sym->relocs = reloc;
@@ -1180,6 +1197,7 @@ static int read_relocs(struct elf *elf)
if (opts.stats) {
printf("max_reloc: %lu\n", max_reloc);
printf("num_relocs: %lu\n", elf->num_relocs);
+ printf("num_relocs_hashed: %lu\n", nr_hashed);
printf("reloc_bits: %d\n", elf->reloc_bits);
}
@@ -1634,7 +1652,7 @@ static int elf_alloc_reloc(struct elf *elf, struct section *rsec)
memcpy(new_relocs, old_relocs, nr_relocs_old * sizeof(struct reloc));
- for (int i = 0; i < nr_relocs_old; i++) {
+ for (int i = 0; i < nr_relocs_old && !is_dwarf_section(rsec->base); i++) {
struct reloc *old = &old_relocs[i];
struct reloc *new = &new_relocs[i];
u32 key = reloc_hash(old);
--
2.56.0
next prev parent reply other threads:[~2026-11-04 18:21 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-04 18:20 [PATCH v5 00/11] kbuild: significantly speed up kernel builds Lorenzo Stoakes (ARM)
2026-11-04 18:20 ` [PATCH v5 01/11] kbuild: calculate list, composite object state per object Lorenzo Stoakes (ARM)
2026-11-04 18:20 ` [PATCH v5 02/11] kbuild: implement and use depcheck to check dependency timestamps Lorenzo Stoakes (ARM)
2026-11-04 18:20 ` [PATCH v5 03/11] modpost: cache section relocation mismatch state Lorenzo Stoakes (ARM)
2026-11-04 18:20 ` [PATCH v5 04/11] modpost: emit module descriptors as assembly Lorenzo Stoakes (ARM)
2026-11-04 18:20 ` [PATCH v5 05/11] kbuild: batch module finalisation Lorenzo Stoakes (ARM)
2026-11-04 18:20 ` Lorenzo Stoakes (ARM) [this message]
2026-11-04 18:20 ` [PATCH v5 07/11] objtool: cache relocations, do less work, eliminate relocation hash Lorenzo Stoakes (ARM)
2026-11-04 18:20 ` [PATCH v5 08/11] objtool: size the instruction hash to the text Lorenzo Stoakes (ARM)
2026-11-04 18:20 ` [PATCH v5 09/11] objtool: decode instructions and resolve branch targets in parallel Lorenzo Stoakes (ARM)
2026-11-04 18:20 ` [PATCH v5 10/11] rust: make exports.o depend on the headers generated for it Lorenzo Stoakes (ARM)
2026-11-04 18:20 ` [PATCH v5 11/11] kbuild: build rust crates in parallel with the rest of the build Lorenzo Stoakes (ARM)
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=20261104-build-speedup-v5-6-0f6018be8dae@kernel.org \
--to=ljs@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=acourbot@nvidia.com \
--cc=aliceryhl@google.com \
--cc=atomlin@atomlin.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun@kernel.org \
--cc=da.gomez@kernel.org \
--cc=dakr@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=gary@garyguo.net \
--cc=geert@linux-m68k.org \
--cc=jpoimboe@kernel.org \
--cc=justinstitt@google.com \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-m68k@lists.linux-m68k.org \
--cc=linux-modules@vger.kernel.org \
--cc=llvm@lists.linux.dev \
--cc=lossin@kernel.org \
--cc=mcgrof@kernel.org \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=nsc@kernel.org \
--cc=ojeda@kernel.org \
--cc=peterz@infradead.org \
--cc=petr.pavlu@suse.com \
--cc=rust-for-linux@vger.kernel.org \
--cc=samitolvanen@google.com \
--cc=tamird@kernel.org \
--cc=tmgross@umich.edu \
--cc=torvalds@linux-foundation.org \
--cc=work@onurozkan.dev \
/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
all inboxes | Powered by JetHome®