Patch "objtool: Fix C jump table annotations for Clang" has been added to the 6.13-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    objtool: Fix C jump table annotations for Clang

to the 6.13-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     objtool-fix-c-jump-table-annotations-for-clang.patch
and it can be found in the queue-6.13 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 5638fbee08fd291cc7e22c2cb7960cfdeed9237d
Author: Ard Biesheuvel <ardb@xxxxxxxxxx>
Date:   Fri Feb 21 14:57:07 2025 +0100

    objtool: Fix C jump table annotations for Clang
    
    [ Upstream commit 73cfc53cc3b6380eccf013049574485f64cb83ca ]
    
    A C jump table (such as the one used by the BPF interpreter) is a const
    global array of absolute code addresses, and this means that the actual
    values in the table may not be known until the kernel is booted (e.g.,
    when using KASLR or when the kernel VA space is sized dynamically).
    
    When using PIE codegen, the compiler will default to placing such const
    global objects in .data.rel.ro (which is annotated as writable), rather
    than .rodata (which is annotated as read-only). As C jump tables are
    explicitly emitted into .rodata, this used to result in warnings for
    LoongArch builds (which uses PIE codegen for the entire kernel) like
    
      Warning: setting incorrect section attributes for .rodata..c_jump_table
    
    due to the fact that the explicitly specified .rodata section inherited
    the read-write annotation that the compiler uses for such objects when
    using PIE codegen.
    
    This warning was suppressed by explicitly adding the read-only
    annotation to the __attribute__((section(""))) string, by commit
    
      c5b1184decc8 ("compiler.h: specify correct attribute for .rodata..c_jump_table")
    
    Unfortunately, this hack does not work on Clang's integrated assembler,
    which happily interprets the appended section type and permission
    specifiers as part of the section name, which therefore no longer
    matches the hard-coded pattern '.rodata..c_jump_table' that objtool
    expects, causing it to emit a warning
    
      kernel/bpf/core.o: warning: objtool: ___bpf_prog_run+0x20: sibling call from callable instruction with modified stack frame
    
    Work around this, by emitting C jump tables into .data.rel.ro instead,
    which is treated as .rodata by the linker script for all builds, not
    just PIE based ones.
    
    Fixes: c5b1184decc8 ("compiler.h: specify correct attribute for .rodata..c_jump_table")
    Tested-by: Tiezhu Yang <yangtiezhu@xxxxxxxxxxx> # on LoongArch
    Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20250221135704.431269-6-ardb+git@xxxxxxxxxx
    Signed-off-by: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 8104d3568d673..d004f9b5528d7 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -110,7 +110,7 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
 /* Unreachable code */
 #ifdef CONFIG_OBJTOOL
 /* Annotate a C jump table to allow objtool to follow the code flow */
-#define __annotate_jump_table __section(".rodata..c_jump_table,\"a\",@progbits #")
+#define __annotate_jump_table __section(".data.rel.ro.c_jump_table")
 #else /* !CONFIG_OBJTOOL */
 #define __annotate_jump_table
 #endif /* CONFIG_OBJTOOL */
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 4d7d2c115cbac..6691bd106e4b6 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -2589,13 +2589,14 @@ static void mark_rodata(struct objtool_file *file)
 	 *
 	 * - .rodata: can contain GCC switch tables
 	 * - .rodata.<func>: same, if -fdata-sections is being used
-	 * - .rodata..c_jump_table: contains C annotated jump tables
+	 * - .data.rel.ro.c_jump_table: contains C annotated jump tables
 	 *
 	 * .rodata.str1.* sections are ignored; they don't contain jump tables.
 	 */
 	for_each_sec(file, sec) {
-		if (!strncmp(sec->name, ".rodata", 7) &&
-		    !strstr(sec->name, ".str1.")) {
+		if ((!strncmp(sec->name, ".rodata", 7) &&
+		     !strstr(sec->name, ".str1.")) ||
+		    !strncmp(sec->name, ".data.rel.ro", 12)) {
 			sec->rodata = true;
 			found = true;
 		}
diff --git a/tools/objtool/include/objtool/special.h b/tools/objtool/include/objtool/special.h
index 86d4af9c5aa9d..89ee12b1a1384 100644
--- a/tools/objtool/include/objtool/special.h
+++ b/tools/objtool/include/objtool/special.h
@@ -10,7 +10,7 @@
 #include <objtool/check.h>
 #include <objtool/elf.h>
 
-#define C_JUMP_TABLE_SECTION ".rodata..c_jump_table"
+#define C_JUMP_TABLE_SECTION ".data.rel.ro.c_jump_table"
 
 struct special_alt {
 	struct list_head list;




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux