Livepatch identifies a duplicate-named symbol by its position (sympos) among same-named kallsyms entries, which for vmlinux are counted in ascending address order in the final linked kernel. That order can't be reliably derived from vmlinux.o: the final link reorders sub-sections (.text.unlikely*, .data..*, etc). Bridge the gap with a new .klp.symid section which can be used to correlate symbols between vmlinux.o and vmlinux so that klp-diff can reliably determine the sympos. The table can't survive --gc-sections: keeping it alive would keep every duplicate-named symbol's section alive, so the reference kernel would stop matching the one which ships. klp-build rejects CONFIG_LD_DEAD_CODE_DATA_ELIMINATION instead. Nothing is lost today: x86_64 is the only HAVE_KLP_BUILD arch and doesn't select HAVE_LD_DEAD_CODE_DATA_ELIMINATION, arm64 and s390 have never selected it either, and on powerpc, it's still EXPERIMENTAL and disabled by every distro kernel. This is the build-time half of reliable vmlinux sympos computation; "objtool klp diff" will consume the table in a subsequent commit.
Showing the changes to scripts/livepatch (1 of 10 files). Show all
Unified · Split
| @@ -271,6 +271,9 @@ validate_config() { · 270 unmodified lines | ||
| 271 | 271 | [[ -v CONFIG_GCC_PLUGIN_RANDSTRUCT ]] && \ |
| 272 | 272 | die "kernel option 'CONFIG_GCC_PLUGIN_RANDSTRUCT' not supported" |
| 273 | 273 | |
| 274 | + [[ -v CONFIG_LD_DEAD_CODE_DATA_ELIMINATION ]] && \ | |
| 275 | + die "kernel option 'CONFIG_LD_DEAD_CODE_DATA_ELIMINATION' not supported" | |
| 276 | + | |
| 274 | 277 | [[ -v CONFIG_AS_IS_LLVM ]] && \ |
| 275 | 278 | [[ "$CONFIG_AS_VERSION" -lt 200000 ]] && \ |
| 276 | 279 | die "Clang assembler version < 20 not supported" |
| @@ -555,6 +558,8 @@ build_kernel() { · 278 unmodified lines | ||
| 555 | 558 | # |
| 556 | 559 | cmd+=("KBUILD_MODPOST_WARN=1") |
| 557 | 560 | |
| 561 | + cmd+=("KLP_SYMIDS=1") | |
| 562 | + | |
| 558 | 563 | if [[ -v VERBOSE ]]; then |
| 559 | 564 | cmd+=("V=1") |
| 560 | 565 | else |