Files
Lorenzo Stoakes (ARM) 531980b4b1 kallsyms: reimplement mksysmap in C
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>
2026-09-26 00:16:35 +01:00

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 */