Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1590407 > unrolled thread

[PATCH] objtool, module: discard __unreachable section for modules

Started byJosh Poimboeuf <jpoimboe@redhat.com>
First post2017-03-01 16:30 +0100
Last post2017-03-01 22:50 +0100
Articles 6 — 4 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] objtool, module: discard __unreachable section for modules Josh Poimboeuf <jpoimboe@redhat.com> - 2017-03-01 16:30 +0100
    Re: [PATCH] objtool, module: discard __unreachable section for modules hpa@zytor.com - 2017-03-01 17:50 +0100
      Re: [PATCH] objtool, module: discard __unreachable section for modules Linus Torvalds <torvalds@linux-foundation.org> - 2017-03-01 18:10 +0100
        Re: [PATCH] objtool, module: discard __unreachable section for modules hpa@zytor.com - 2017-03-01 18:50 +0100
        [PATCH v2] objtool, module: discard objtool annotation sections for  modules Josh Poimboeuf <jpoimboe@redhat.com> - 2017-03-01 19:30 +0100
          [tip:core/urgent] objtool, modules: Discard objtool annotation  sections for modules tip-bot for Josh Poimboeuf <tipbot@zytor.com> - 2017-03-01 22:50 +0100

#1590407 — [PATCH] objtool, module: discard __unreachable section for modules

FromJosh Poimboeuf <jpoimboe@redhat.com>
Date2017-03-01 16:30 +0100
Subject[PATCH] objtool, module: discard __unreachable section for modules
Message-ID<tgemu-4Vt-15@gated-at.bofh.it>
The __unreachable section is only used at compile time.  It's discarded
for vmlinux but it should also be discarded for modules.

Fixes: d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 scripts/module-common.lds | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/scripts/module-common.lds b/scripts/module-common.lds
index 73a2c7d..936a3c6 100644
--- a/scripts/module-common.lds
+++ b/scripts/module-common.lds
@@ -4,7 +4,10 @@
  * combine them automatically.
  */
 SECTIONS {
-	/DISCARD/ : { *(.discard) }
+	/DISCARD/ : {
+		*(.discard)
+		*(__unreachable)
+	}
 
 	__ksymtab		0 : { *(SORT(___ksymtab+*)) }
 	__ksymtab_gpl		0 : { *(SORT(___ksymtab_gpl+*)) }
-- 
2.7.4

[toc] | [next] | [standalone]


#1590501

Fromhpa@zytor.com
Date2017-03-01 17:50 +0100
Message-ID<tgfBT-5HN-3@gated-at.bofh.it>
In reply to#1590407
On March 1, 2017 7:20:03 AM PST, Josh Poimboeuf <jpoimboe@redhat.com> wrote:
>The __unreachable section is only used at compile time.  It's discarded
>for vmlinux but it should also be discarded for modules.
>
>Fixes: d1091c7fa3d5 ("objtool: Improve detection of BUG() and other
>dead ends")
>Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
>---
> scripts/module-common.lds | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
>diff --git a/scripts/module-common.lds b/scripts/module-common.lds
>index 73a2c7d..936a3c6 100644
>--- a/scripts/module-common.lds
>+++ b/scripts/module-common.lds
>@@ -4,7 +4,10 @@
>  * combine them automatically.
>  */
> SECTIONS {
>-	/DISCARD/ : { *(.discard) }
>+	/DISCARD/ : {
>+		*(.discard)
>+		*(__unreachable)
>+	}
> 
> 	__ksymtab		0 : { *(SORT(___ksymtab+*)) }
> 	__ksymtab_gpl		0 : { *(SORT(___ksymtab_gpl+*)) }

I would like to see a name like, say, ".annot.unreachable", since is odds are pretty high we are going to need more annotations in the future.
-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.

[toc] | [prev] | [next] | [standalone]


#1590517

FromLinus Torvalds <torvalds@linux-foundation.org>
Date2017-03-01 18:10 +0100
Message-ID<tgfVf-65H-5@gated-at.bofh.it>
In reply to#1590501
On Wed, Mar 1, 2017 at 8:44 AM,  <hpa@zytor.com> wrote:
>
> I would like to see a name like, say, ".annot.unreachable", since is odds are pretty high we are going to need more annotations in the future.

Why not just make it ".discard.unreachable", and then make the discard
pattern be ".discard*".

We already have .discard.text for some trace hackery, so it follows a pattern.

And that's what we do for things like .rodata.* etc.

In fact, we already have a pattern for '.discard.*' in the main
vmlinux.lds.h file exactly for the .discard.text case (but not for
modules, it looks like).

               Linus

[toc] | [prev] | [next] | [standalone]


#1590531

Fromhpa@zytor.com
Date2017-03-01 18:50 +0100
Message-ID<tggxX-6ns-5@gated-at.bofh.it>
In reply to#1590517
On March 1, 2017 9:01:54 AM PST, Linus Torvalds <torvalds@linux-foundation.org> wrote:
>On Wed, Mar 1, 2017 at 8:44 AM,  <hpa@zytor.com> wrote:
>>
>> I would like to see a name like, say, ".annot.unreachable", since is
>odds are pretty high we are going to need more annotations in the
>future.
>
>Why not just make it ".discard.unreachable", and then make the discard
>pattern be ".discard*".
>
>We already have .discard.text for some trace hackery, so it follows a
>pattern.
>
>And that's what we do for things like .rodata.* etc.
>
>In fact, we already have a pattern for '.discard.*' in the main
>vmlinux.lds.h file exactly for the .discard.text case (but not for
>modules, it looks like).
>
>               Linus

I was assuming it would be used for more than just discarding.
-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.

[toc] | [prev] | [next] | [standalone]


#1590550 — [PATCH v2] objtool, module: discard objtool annotation sections for modules

FromJosh Poimboeuf <jpoimboe@redhat.com>
Date2017-03-01 19:30 +0100
Subject[PATCH v2] objtool, module: discard objtool annotation sections for modules
Message-ID<tghaF-6U3-3@gated-at.bofh.it>
In reply to#1590517
The '__unreachable' and '__func_stack_frame_non_standard' sections are
only used at compile time.  They're discarded for vmlinux but they
should also be discarded for modules.

Since this is a recurring pattern, prefix the section names with
".discard.".  It's a nice convention and vmlinux.lds.h already discards
such sections.

Also remove the 'a' (allocatable) flag from the __unreachable section
since it doesn't make sense for a discarded section.

Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Fixes: d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 arch/x86/kernel/vmlinux.lds.S | 2 --
 include/linux/compiler-gcc.h  | 2 +-
 include/linux/frame.h         | 2 +-
 scripts/mod/modpost.c         | 1 +
 scripts/module-common.lds     | 5 ++++-
 tools/objtool/builtin-check.c | 7 ++++---
 6 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S
index ad0118f..c74ae9c 100644
--- a/arch/x86/kernel/vmlinux.lds.S
+++ b/arch/x86/kernel/vmlinux.lds.S
@@ -345,8 +345,6 @@ SECTIONS
 	DISCARDS
 	/DISCARD/ : {
 		*(.eh_frame)
-		*(__func_stack_frame_non_standard)
-		*(__unreachable)
 	}
 }
 
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index b6bb901..0efef9c 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -200,7 +200,7 @@
 #ifdef CONFIG_STACK_VALIDATION
 #define annotate_unreachable() ({					\
 	asm("%c0:\t\n"							\
-	    ".pushsection __unreachable, \"a\"\t\n"			\
+	    ".pushsection .discard.unreachable\t\n"			\
 	    ".long %c0b - .\t\n"					\
 	    ".popsection\t\n" : : "i" (__LINE__));			\
 })
diff --git a/include/linux/frame.h b/include/linux/frame.h
index e6baaba..d772c61 100644
--- a/include/linux/frame.h
+++ b/include/linux/frame.h
@@ -11,7 +11,7 @@
  * For more information, see tools/objtool/Documentation/stack-validation.txt.
  */
 #define STACK_FRAME_NON_STANDARD(func) \
-	static void __used __section(__func_stack_frame_non_standard) \
+	static void __used __section(.discard.func_stack_frame_non_standard) \
 		*__func_stack_frame_non_standard_##func = func
 
 #else /* !CONFIG_STACK_VALIDATION */
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 4dedd0d..30d752a 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -854,6 +854,7 @@ static const char *const section_white_list[] =
 	".cmem*",			/* EZchip */
 	".fmt_slot*",			/* EZchip */
 	".gnu.lto*",
+	".discard.*",
 	NULL
 };
 
diff --git a/scripts/module-common.lds b/scripts/module-common.lds
index 73a2c7d..cf7e52e 100644
--- a/scripts/module-common.lds
+++ b/scripts/module-common.lds
@@ -4,7 +4,10 @@
  * combine them automatically.
  */
 SECTIONS {
-	/DISCARD/ : { *(.discard) }
+	/DISCARD/ : {
+		*(.discard)
+		*(.discard.*)
+	}
 
 	__ksymtab		0 : { *(SORT(___ksymtab+*)) }
 	__ksymtab_gpl		0 : { *(SORT(___ksymtab_gpl+*)) }
diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c
index 5fc52ee..bd12eb1 100644
--- a/tools/objtool/builtin-check.c
+++ b/tools/objtool/builtin-check.c
@@ -339,13 +339,14 @@ static int add_dead_ends(struct objtool_file *file)
 	struct instruction *insn;
 	bool found;
 
-	sec = find_section_by_name(file->elf, ".rela__unreachable");
+	sec = find_section_by_name(file->elf, ".rela.discard.unreachable");
 	if (!sec)
 		return 0;
 
 	list_for_each_entry(rela, &sec->rela_list, list) {
 		if (rela->sym->type != STT_SECTION) {
-			WARN("unexpected relocation symbol type in .rela__unreachable");
+			WARN("unexpected relocation symbol type in %s",
+			     sec->name);
 			return -1;
 		}
 		insn = find_insn(file, rela->sym->sec, rela->addend);
@@ -1272,7 +1273,7 @@ int cmd_check(int argc, const char **argv)
 
 	INIT_LIST_HEAD(&file.insn_list);
 	hash_init(file.insn_hash);
-	file.whitelist = find_section_by_name(file.elf, "__func_stack_frame_non_standard");
+	file.whitelist = find_section_by_name(file.elf, ".discard.func_stack_frame_non_standard");
 	file.rodata = find_section_by_name(file.elf, ".rodata");
 	file.ignore_unreachables = false;
 	file.c_file = find_section_by_name(file.elf, ".comment");
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1590639 — [tip:core/urgent] objtool, modules: Discard objtool annotation sections for modules

Fromtip-bot for Josh Poimboeuf <tipbot@zytor.com>
Date2017-03-01 22:50 +0100
Subject[tip:core/urgent] objtool, modules: Discard objtool annotation sections for modules
Message-ID<tgkie-DA-3@gated-at.bofh.it>
In reply to#1590550
Commit-ID:  e390f9a9689a42f477a6073e2e7df530a4c1b740
Gitweb:     http://git.kernel.org/tip/e390f9a9689a42f477a6073e2e7df530a4c1b740
Author:     Josh Poimboeuf <jpoimboe@redhat.com>
AuthorDate: Wed, 1 Mar 2017 12:04:44 -0600
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 1 Mar 2017 20:32:25 +0100

objtool, modules: Discard objtool annotation sections for modules

The '__unreachable' and '__func_stack_frame_non_standard' sections are
only used at compile time.  They're discarded for vmlinux but they
should also be discarded for modules.

Since this is a recurring pattern, prefix the section names with
".discard.".  It's a nice convention and vmlinux.lds.h already discards
such sections.

Also remove the 'a' (allocatable) flag from the __unreachable section
since it doesn't make sense for a discarded section.

Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Jessica Yu <jeyu@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Fixes: d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")
Link: http://lkml.kernel.org/r/20170301180444.lhd53c5tibc4ns77@treble
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/kernel/vmlinux.lds.S | 2 --
 include/linux/compiler-gcc.h  | 2 +-
 include/linux/frame.h         | 2 +-
 scripts/mod/modpost.c         | 1 +
 scripts/module-common.lds     | 5 ++++-
 tools/objtool/builtin-check.c | 6 +++---
 6 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S
index ad0118f..c74ae9c 100644
--- a/arch/x86/kernel/vmlinux.lds.S
+++ b/arch/x86/kernel/vmlinux.lds.S
@@ -345,8 +345,6 @@ SECTIONS
 	DISCARDS
 	/DISCARD/ : {
 		*(.eh_frame)
-		*(__func_stack_frame_non_standard)
-		*(__unreachable)
 	}
 }
 
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index b6bb901..0efef9c 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -200,7 +200,7 @@
 #ifdef CONFIG_STACK_VALIDATION
 #define annotate_unreachable() ({					\
 	asm("%c0:\t\n"							\
-	    ".pushsection __unreachable, \"a\"\t\n"			\
+	    ".pushsection .discard.unreachable\t\n"			\
 	    ".long %c0b - .\t\n"					\
 	    ".popsection\t\n" : : "i" (__LINE__));			\
 })
diff --git a/include/linux/frame.h b/include/linux/frame.h
index e6baaba..d772c61 100644
--- a/include/linux/frame.h
+++ b/include/linux/frame.h
@@ -11,7 +11,7 @@
  * For more information, see tools/objtool/Documentation/stack-validation.txt.
  */
 #define STACK_FRAME_NON_STANDARD(func) \
-	static void __used __section(__func_stack_frame_non_standard) \
+	static void __used __section(.discard.func_stack_frame_non_standard) \
 		*__func_stack_frame_non_standard_##func = func
 
 #else /* !CONFIG_STACK_VALIDATION */
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 4dedd0d..30d752a 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -854,6 +854,7 @@ static const char *const section_white_list[] =
 	".cmem*",			/* EZchip */
 	".fmt_slot*",			/* EZchip */
 	".gnu.lto*",
+	".discard.*",
 	NULL
 };
 
diff --git a/scripts/module-common.lds b/scripts/module-common.lds
index 73a2c7d..cf7e52e 100644
--- a/scripts/module-common.lds
+++ b/scripts/module-common.lds
@@ -4,7 +4,10 @@
  * combine them automatically.
  */
 SECTIONS {
-	/DISCARD/ : { *(.discard) }
+	/DISCARD/ : {
+		*(.discard)
+		*(.discard.*)
+	}
 
 	__ksymtab		0 : { *(SORT(___ksymtab+*)) }
 	__ksymtab_gpl		0 : { *(SORT(___ksymtab_gpl+*)) }
diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c
index 5fc52ee..4cfdbb5 100644
--- a/tools/objtool/builtin-check.c
+++ b/tools/objtool/builtin-check.c
@@ -339,13 +339,13 @@ static int add_dead_ends(struct objtool_file *file)
 	struct instruction *insn;
 	bool found;
 
-	sec = find_section_by_name(file->elf, ".rela__unreachable");
+	sec = find_section_by_name(file->elf, ".rela.discard.unreachable");
 	if (!sec)
 		return 0;
 
 	list_for_each_entry(rela, &sec->rela_list, list) {
 		if (rela->sym->type != STT_SECTION) {
-			WARN("unexpected relocation symbol type in .rela__unreachable");
+			WARN("unexpected relocation symbol type in %s", sec->name);
 			return -1;
 		}
 		insn = find_insn(file, rela->sym->sec, rela->addend);
@@ -1272,7 +1272,7 @@ int cmd_check(int argc, const char **argv)
 
 	INIT_LIST_HEAD(&file.insn_list);
 	hash_init(file.insn_hash);
-	file.whitelist = find_section_by_name(file.elf, "__func_stack_frame_non_standard");
+	file.whitelist = find_section_by_name(file.elf, ".discard.func_stack_frame_non_standard");
 	file.rodata = find_section_by_name(file.elf, ".rodata");
 	file.ignore_unreachables = false;
 	file.c_file = find_section_by_name(file.elf, ".comment");

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web