linux-yocto/scripts/mksysmap
Pierre-Clément Tosi 71025b8565 scripts/mksysmap: Ignore prefixed KCFI symbols
The (relatively) new KCFI feature in LLVM/Clang encodes type information
for C functions by generating symbols named __kcfi_typeid_<fname>, which
can then be referenced from assembly. However, some custom build rules
(e.g. nVHE or early PIE on arm64) use objcopy to add a prefix to all the
symbols in their object files, making mksysmap's ignore filter miss
those KCFI symbols.

Therefore, explicitly list those twice-prefixed KCFI symbols as ignored.

Alternatively, this could also be achieved in a less verbose way by
ignoring any symbol containing the string "__kcfi_typeid_". However,
listing the combined prefixes explicitly saves us from running the small
risk of ignoring symbols that should be kept.

Signed-off-by: Pierre-Clément Tosi <ptosi@google.com>
Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2023-06-27 08:35:43 +09:00

2.7 KiB
Executable File

#!/bin/sh -x

Based on the vmlinux file create the System.map file

System.map is used by module-init tools and some debugging

tools to retrieve the actual addresses of symbols in the kernel.

Usage

mksysmap vmlinux System.map [exclude]

Generate System.map (actual filename passed as second argument)

The following refers to the symbol type as per nm(1).

readprofile starts reading symbols when _stext is found, and

continue until it finds a symbol which is not either of 'T', 't',

'W' or 'w'.

${NM} -n ${1} | sed >${2} -e "

---------------------------------------------------------------------------

Ignored symbol types

a: local absolute symbols

N: debugging symbols

U: undefined global symbols

w: local weak symbols

/ [aNUw] /d

---------------------------------------------------------------------------

Ignored prefixes

(do not forget a space before each pattern)

local symbols for ARM, MIPS, etc.

/ \$/d

local labels, .LBB, .Ltmpxxx, .L__unnamed_xx, .LASANPC, etc.

/ .L/d

arm64 EFI stub namespace

/ _efistub/d

arm64 local symbols in PIE namespace

/ _pi\$/d / _pi.L/d

arm64 local symbols in non-VHE KVM namespace

/ _kvm_nvhe\$/d / _kvm_nvhe.L/d

arm64 lld

/ _AArch64ADRPThunk/d

arm lld

/ _ARMV5PILongThunk/d / _ARMV7PILongThunk/d / _ThumbV7PILongThunk/d

mips lld

/ _LA25Thunk/d / _microLA25Thunk/d

CFI type identifiers

/ _kcfi_typeid/d / _kvm_nvhe___kcfi_typeid/d / _pi___kcfi_typeid/d

CRC from modversions

/ _crc/d

EXPORT_SYMBOL (symbol name)

/ _kstrtab/d

EXPORT_SYMBOL (namespace)

/ _kstrtabns/d

---------------------------------------------------------------------------

Ignored suffixes

(do not forget '$' after each pattern)

arm

/_from_arm$/d /_from_thumb$/d /_veneer$/d

---------------------------------------------------------------------------

Ignored symbols (exact match)

(do not forget a space before and '$' after each pattern)

for LoongArch?

/ L0$/d

ppc

/ SDA_BASE$/d / SDA2_BASE$/d

---------------------------------------------------------------------------

Ignored patterns

(symbols that contain the pattern are ignored)

ppc stub

/.long_branch./d /.plt_branch./d

---------------------------------------------------------------------------

Ignored kallsyms symbols

If the 3rd parameter exists, symbols from it will be omitted from the output.

This makes kallsyms have the identical symbol lists in the step 1 and 2.

Without this, the step2 would get new symbols generated by scripts/kallsyms.c

when CONFIG_KALLSYMS_ALL is enabled. That might require one more pass.

$(if [ $# -ge 3 ]; then ${NM} {3} | sed -n '/ U /!s:.* \([^ ]*\):/ \1$/d:p'; fi) "