mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-10-26 10:57:38 +08:00
mksysmap is a sed script consisting of 30 patterns which link-vmlinux.sh
uses to generate *.syms files, and which kallsyms is then called against to
generate *.kallsyms files, with the final vmlinux build ultimately
generating System.map.
For an x86-64 allmodconfig build, this involves three nm runs over a 250
MiB file and half a million lines written and read each time - 0.5s per
pass for llvm-nm, and 0.2s for GNU nm, with parsing on top of that.
This is unnecessary, instead have kallsyms simply read the ELF file
directly making use of the existing elf-parse library in scripts/.
This changes kallsyms such that its input is no longer the output from nm,
but rather an ELF file.
However, if the input file is empty, it outputs an empty table, which
retains the same behaviour on first pass that the build system expects.
System.map is byte-identical to nm | mksysmap for GNU nm and llvm-nm on
two x86 configurations each, and for llvm-nm on arm64, arm, s390 and
loongarch defconfigs, so are the kallsyms tables of every pass.
Relinking vmlinux, link steps included:
before after
allmodconfig clang 9.1s 7.9s
allmodconfig gcc 7.8s 7.6s
defconfig clang 3.7s 3.0s
defconfig gcc 3.5s 3.4s
Whole build, 128-thread Threadripper 9980X, best of N runs:
before after delta
-------------------------------
x86 defconfig, touch mm/vma.c, gcc 9.1s 8.6s -0.43s (-5%)
x86 defconfig, touch mm/vma.c, clang 9.0s 8.0s -1.1s (-12%)
x86 defconfig, clean, gcc 29.5s 28.9s -0.64s (-2%)
x86 defconfig, clean, clang 31.2s 29.8s -1.4s (-5%)
x86 allmodconfig, touch mm/vma.c, gcc 35.8s 35.0s -0.77s (-2%)
x86 allmodconfig, touch mm/vma.c, clang 35.8s 33.7s -2.0s (-6%)
Assisted-by: LLM
Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
Link: https://patch.msgid.link/20260923-build-speedup-v4-8-73128809a4a4@kernel.org
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
45 lines
1.0 KiB
C
45 lines
1.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef KALLSYMS_H
|
|
#define KALLSYMS_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include <array_size.h>
|
|
#include "elf-parse.h"
|
|
|
|
static inline bool string_starts_with(const char *s, const char *prefix)
|
|
{
|
|
return strncmp(s, prefix, strlen(prefix)) == 0;
|
|
}
|
|
|
|
static inline bool string_ends_with(const char *s, const char *suffix)
|
|
{
|
|
size_t len = strlen(s), suffix_len = strlen(suffix);
|
|
|
|
return len >= suffix_len && strcmp(s + len - suffix_len, suffix) == 0;
|
|
}
|
|
|
|
/* A symbol as nm lists it. */
|
|
struct sysmap_symbol {
|
|
unsigned long long addr;
|
|
const char *name;
|
|
char type;
|
|
};
|
|
|
|
/* The symbols of an ELF file that System.map lists, in its order. */
|
|
struct sysmap {
|
|
struct sysmap_symbol *syms;
|
|
size_t nr_syms;
|
|
int addr_width; /* hex digits of an address */
|
|
struct elf_file elf; /* the mapping the names point into */
|
|
};
|
|
|
|
struct sysmap *sysmap_read(const char *path);
|
|
void sysmap_write(const struct sysmap *map, FILE *out);
|
|
void sysmap_free(struct sysmap *map);
|
|
|
|
#endif /* KALLSYMS_H */
|