]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scripts/sorttable: Use normal sort if theres no relocs in the mcount section
authorSteven Rostedt <rostedt@goodmis.org>
Tue, 25 Feb 2025 18:20:07 +0000 (13:20 -0500)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Tue, 25 Feb 2025 18:25:13 +0000 (13:25 -0500)
When ARM 64 is compiled with gcc, the mcount_loc section will be filled
with zeros and the addresses will be located in the Elf_Rela sections. To
sort the mcount_loc section, the addresses from the Elf_Rela need to be
placed into an array and that is sorted.

But when ARM 64 is compiled with clang, it does it the same way as other
architectures and leaves the addresses as is in the mcount_loc section.

To handle both cases, ARM 64 will first try to sort the Elf_Rela section,
and if it doesn't find any functions, it will then fall back to the
sorting of the addresses in the mcount_loc section itself.

Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/20250225182054.648398403@goodmis.org
Fixes: b3d09d06e052 ("arm64: scripts/sorttable: Implement sorting mcount_loc at boot for arm64")
Reported-by: "Arnd Bergmann" <arnd@arndb.de>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Closes: https://lore.kernel.org/all/893cd8f1-8585-4d25-bf0f-4197bf872465@app.fastmail.com/
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
scripts/sorttable.c

index 23c7e0e6c0242172aec5903b5337dadaffd637bf..07ad8116bc8ddf541b4831b578acf6d0151bcbb5 100644 (file)
@@ -827,9 +827,14 @@ static void *sort_mcount_loc(void *arg)
                pthread_exit(m_err);
        }
 
-       if (sort_reloc)
+       if (sort_reloc) {
                count = fill_relocs(vals, size, ehdr, emloc->start_mcount_loc);
-       else
+               /* gcc may use relocs to save the addresses, but clang does not. */
+               if (!count) {
+                       count = fill_addrs(vals, size, start_loc);
+                       sort_reloc = 0;
+               }
+       } else
                count = fill_addrs(vals, size, start_loc);
 
        if (count < 0) {