kbuild: exclude .rodata.(cst|str)* when building ranges
authorKris Van Hees <kris.van.hees@oracle.com>
Fri, 7 Mar 2025 16:53:28 +0000 (11:53 -0500)
committerMasahiro Yamada <masahiroy@kernel.org>
Sat, 15 Mar 2025 12:22:52 +0000 (21:22 +0900)
The .rodata.(cst|str)* sections are often resized during the final
linking and since these sections do not cover actual symbols there is
no need to include them in the modules.builtin.ranges data.

When these sections were included in processing and resizing occurred,
modules were reported with ranges that extended beyond their true end,
causing subsequent symbols (in address order) to be associated with
the wrong module.

Fixes: 5f5e7344322f ("kbuild: generate offset range data for builtin modules")
Cc: stable@vger.kernel.org
Signed-off-by: Kris Van Hees <kris.van.hees@oracle.com>
Reviewed-by: Jack Vogel <jack.vogel@oracle.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
scripts/generate_builtin_ranges.awk

index b9ec761b3befc434db61bc7745da00a6e333a615..d4bd5c2b998ca2d8f085e3bddb90b2d069638e42 100755 (executable)
@@ -282,6 +282,11 @@ ARGIND == 2 && !anchor && NF == 2 && $1 ~ /^0x/ && $2 !~ /^0x/ {
 # section.
 #
 ARGIND == 2 && sect && NF == 4 && /^ [^ \*]/ && !($1 in sect_addend) {
+       # There are a few sections with constant data (without symbols) that
+       # can get resized during linking, so it is best to ignore them.
+       if ($1 ~ /^\.rodata\.(cst|str)[0-9]/)
+               next;
+
        if (!($1 in sect_base)) {
                sect_base[$1] = base;