linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] Enable objtool multiarch build
@ 2020-05-19 20:55 Matt Helsley
  2020-05-19 20:55 ` [PATCH 1/3] objtool: Exit successfully when requesting help Matt Helsley
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Matt Helsley @ 2020-05-19 20:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: Josh Poimboeuf, Peter Zijlstra, Julien Thierry, Miroslav Benes,
	Steven Rostedt, Matt Helsley

As a necessary first step to adding new architecture and subcommand
support to objtool enabling building of objtool for more than the x86
architecture.

Some folks have been working on enabling objtool checking functionality
for arm64. Rather than repeat that work here this minimal set does not
port the existing commands but replaces them with weak, not-implemented
versions which exit with status 127. On x86 the check and orc
subcommands will still build and operate correctly while on other
architectures the commands will exit with status 127. This allows future
changes to port the check command to arm64 or add new subcommands
such as mcount to replace the separate recordmcount tool.

Since the series does not add support for stack validation or checking
to any new architectures there's no reason to make KConfig or Makefile
changes which would normally be used to test this. So I've been forcing
builds of objtool with:

make O=build-foo ARCH=foo CROSS_COMPILE=foo-linux-gnu- defconfig
make O=build-foo ARCH=foo CROSS_COMPILE=foo-linux-gnu- tools/objtool

And running the resulting binary to verify that it shows all objtoo
subcommands are supported on x86 and unsupported on other archs.

Changes since RFC[1]:
 - Removed the arch/missing pattern and put everything in weak.c
	(Julien Thierry and Josh Poimboeuf)
 - Kept arch.h, special, etc. in the top level objtool dir (Julien)
 - Dropped the patch reporting which subcommands are missing in --help
	output
 - Postponed the rela patch
	Josh asked to rename a bunch of these variables and suggested
	an untested improvement. Since they're necessary for
	recordmcount but not the current arch built support we can drop
	them from this set.
 - Misc: Removed else (Josh) and updated the commit messages (Julien)
 - Cleaned up includes
	Moved the prototypes for the command entry functions and other
	functions that weak symbols need to be consistent with into
	objtool.h. (Josh)

Tested with cross-compilation for sparc, arm64, s390, and powerpc

[1] https://lore.kernel.org/lkml/cover.1588888003.git.mhelsley@vmware.com/

Matt Helsley (3):
  objtool: Exit successfully when requesting help
  objtool: Move struct objtool_file into arch-independent header
  objtool: Enable compilation of objtool for all architectures

 tools/objtool/Build           | 13 +++++++++----
 tools/objtool/Makefile        | 11 ++++++++++-
 tools/objtool/arch.h          |  4 +++-
 tools/objtool/builtin-check.c |  2 +-
 tools/objtool/builtin-orc.c   |  3 +--
 tools/objtool/check.c         |  4 ++--
 tools/objtool/check.h         | 12 ------------
 tools/objtool/objtool.c       |  4 +++-
 tools/objtool/objtool.h       | 34 ++++++++++++++++++++++++++++++++++
 tools/objtool/orc.h           | 18 ------------------
 tools/objtool/orc_dump.c      |  3 ++-
 tools/objtool/orc_gen.c       |  1 -
 tools/objtool/weak.c          | 35 +++++++++++++++++++++++++++++++++++
 13 files changed, 100 insertions(+), 44 deletions(-)
 create mode 100644 tools/objtool/objtool.h
 delete mode 100644 tools/objtool/orc.h
 create mode 100644 tools/objtool/weak.c


base-commit: bba413deb1065f1291cb1f366247513f11215520
-- 
2.20.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/3] objtool: Exit successfully when requesting help
  2020-05-19 20:55 [PATCH 0/3] Enable objtool multiarch build Matt Helsley
@ 2020-05-19 20:55 ` Matt Helsley
  2020-05-27 14:44   ` Kamalesh Babulal
  2020-05-19 20:55 ` [PATCH 2/3] objtool: Move struct objtool_file into arch-independent header Matt Helsley
  2020-05-19 20:55 ` [PATCH 3/3] objtool: Enable compilation of objtool for all architectures Matt Helsley
  2 siblings, 1 reply; 14+ messages in thread
From: Matt Helsley @ 2020-05-19 20:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: Josh Poimboeuf, Peter Zijlstra, Julien Thierry, Miroslav Benes,
	Steven Rostedt, Matt Helsley

When the user requests help it's not an error so do not exit with
a non-zero exit code. This is not especially useful for a user but
any script that might wish to check that objtool --help is at least
available can't rely on the exit code to crudely check that, for
example, building an objtool executable succeeds.

Signed-off-by: Matt Helsley <mhelsley@vmware.com>
---
 tools/objtool/objtool.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/objtool/objtool.c b/tools/objtool/objtool.c
index 0b3528f05053..58fdda510653 100644
--- a/tools/objtool/objtool.c
+++ b/tools/objtool/objtool.c
@@ -58,7 +58,9 @@ static void cmd_usage(void)
 
 	printf("\n");
 
-	exit(129);
+	if (!help)
+		exit(129);
+	exit(0);
 }
 
 static void handle_options(int *argc, const char ***argv)
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/3] objtool: Move struct objtool_file into arch-independent header
  2020-05-19 20:55 [PATCH 0/3] Enable objtool multiarch build Matt Helsley
  2020-05-19 20:55 ` [PATCH 1/3] objtool: Exit successfully when requesting help Matt Helsley
@ 2020-05-19 20:55 ` Matt Helsley
  2020-05-20  8:04   ` Julien Thierry
  2020-05-27 14:43   ` Kamalesh Babulal
  2020-05-19 20:55 ` [PATCH 3/3] objtool: Enable compilation of objtool for all architectures Matt Helsley
  2 siblings, 2 replies; 14+ messages in thread
From: Matt Helsley @ 2020-05-19 20:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: Josh Poimboeuf, Peter Zijlstra, Julien Thierry, Miroslav Benes,
	Steven Rostedt, Matt Helsley

The objtool_file structure describes the files objtool works on,
is used by the check subcommand, and the check.h header is included
by the orc subcommands so it's presently used by all subcommands.

Since the structure will be useful in all subcommands besides check,
and some subcommands may not want to include check.h to get the
definition, split the structure out into a new header meant for use
by all objtool subcommands.

Signed-off-by: Matt Helsley <mhelsley@vmware.com>
---
 tools/objtool/check.h   | 10 +---------
 tools/objtool/objtool.h | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+), 9 deletions(-)
 create mode 100644 tools/objtool/objtool.h

diff --git a/tools/objtool/check.h b/tools/objtool/check.h
index 24280227ef21..3b59a1cbcff5 100644
--- a/tools/objtool/check.h
+++ b/tools/objtool/check.h
@@ -7,11 +7,10 @@
 #define _CHECK_H
 
 #include <stdbool.h>
-#include "elf.h"
+#include "objtool.h"
 #include "cfi.h"
 #include "arch.h"
 #include "orc.h"
-#include <linux/hashtable.h>
 
 struct insn_state {
 	struct cfi_state cfi;
@@ -48,13 +47,6 @@ struct instruction {
 	struct orc_entry orc;
 };
 
-struct objtool_file {
-	struct elf *elf;
-	struct list_head insn_list;
-	DECLARE_HASHTABLE(insn_hash, 20);
-	bool ignore_unreachables, c_file, hints, rodata;
-};
-
 int check(const char *objname, bool orc);
 
 struct instruction *find_insn(struct objtool_file *file,
diff --git a/tools/objtool/objtool.h b/tools/objtool/objtool.h
new file mode 100644
index 000000000000..afa52fe6f644
--- /dev/null
+++ b/tools/objtool/objtool.h
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2020 Matt Helsley <mhelsley@vmware.com>
+ */
+
+#ifndef _OBJTOOL_H
+#define _OBJTOOL_H
+#include <stdbool.h>
+#include <linux/list.h>
+#include <linux/hashtable.h>
+
+#include "elf.h"
+
+struct objtool_file {
+	struct elf *elf;
+	struct list_head insn_list;
+	DECLARE_HASHTABLE(insn_hash, 20);
+	bool ignore_unreachables, c_file, hints, rodata;
+};
+#endif
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 3/3] objtool: Enable compilation of objtool for all architectures
  2020-05-19 20:55 [PATCH 0/3] Enable objtool multiarch build Matt Helsley
  2020-05-19 20:55 ` [PATCH 1/3] objtool: Exit successfully when requesting help Matt Helsley
  2020-05-19 20:55 ` [PATCH 2/3] objtool: Move struct objtool_file into arch-independent header Matt Helsley
@ 2020-05-19 20:55 ` Matt Helsley
  2020-05-19 21:18   ` Josh Poimboeuf
  2020-05-20  8:31   ` Julien Thierry
  2 siblings, 2 replies; 14+ messages in thread
From: Matt Helsley @ 2020-05-19 20:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: Josh Poimboeuf, Peter Zijlstra, Julien Thierry, Miroslav Benes,
	Steven Rostedt, Matt Helsley

objtool currently only compiles for x86 architectures. This is
fine as it presently does not support tooling for other
architectures. However, we would like to be able to convert other
kernel tools to run as objtool sub commands because they too
process ELF object files. This will allow us to convert tools
such as recordmcount to use objtool's ELF code.

Since much of recordmcount's ELF code is copy-paste code to/from
a variety of other kernel tools (look at modpost for example) this
means that if we can convert recordmcount we can convert more.

We define "missing" weak definitions for subcommand entry functions
and other weak definitions for shared functions critical to
building existing subcommands. These return 127 when the command is
missing which signify tools that do not exist on all architectures.
In this case the "check" and "orc" tools do not exist on all
architectures so we only add them for x86. Future changes adding
support for "check", to arm64 for example, can then modify the
SUBCMD_CHECK variable when building for arm64.

objtool is not currently wired in to KConfig to be built for other
architectures because it's not needed for those architectures and
there are no commands it supports other than those for x86. As more
command support is enabled on various architectures the necessary
KConfig changes can be made (e.g. adding "STACK_VALIDATION") to
trigger building objtool.

Signed-off-by: Matt Helsley <mhelsley@vmware.com>
Cc: Julien Thierry <jthierry@redhat.com>
---
 tools/objtool/Build           | 13 +++++++++----
 tools/objtool/Makefile        | 11 ++++++++++-
 tools/objtool/arch.h          |  4 +++-
 tools/objtool/builtin-check.c |  2 +-
 tools/objtool/builtin-orc.c   |  3 +--
 tools/objtool/check.c         |  4 ++--
 tools/objtool/check.h         |  4 ----
 tools/objtool/objtool.h       | 14 ++++++++++++++
 tools/objtool/orc.h           | 18 ------------------
 tools/objtool/orc_dump.c      |  3 ++-
 tools/objtool/orc_gen.c       |  1 -
 tools/objtool/weak.c          | 35 +++++++++++++++++++++++++++++++++++
 12 files changed, 77 insertions(+), 35 deletions(-)
 delete mode 100644 tools/objtool/orc.h
 create mode 100644 tools/objtool/weak.c

diff --git a/tools/objtool/Build b/tools/objtool/Build
index 66f44f5cd2a6..b7222d5cc7bc 100644
--- a/tools/objtool/Build
+++ b/tools/objtool/Build
@@ -1,11 +1,16 @@
 objtool-y += arch/$(SRCARCH)/
+
+objtool-y += weak.o
+
+objtool-$(SUBCMD_CHECK) += check.o
+objtool-$(SUBCMD_CHECK) += special.o
+objtool-$(SUBCMD_ORC) += check.o
+objtool-$(SUBCMD_ORC) += orc_gen.o
+objtool-$(SUBCMD_ORC) += orc_dump.o
+
 objtool-y += builtin-check.o
 objtool-y += builtin-orc.o
-objtool-y += check.o
-objtool-y += orc_gen.o
-objtool-y += orc_dump.o
 objtool-y += elf.o
-objtool-y += special.o
 objtool-y += objtool.o
 
 objtool-y += libstring.o
diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile
index 6b91388aecbb..12686e2f1a56 100644
--- a/tools/objtool/Makefile
+++ b/tools/objtool/Makefile
@@ -46,7 +46,16 @@ elfshdr := $(shell echo '$(pound)include <libelf.h>' | $(CC) $(CFLAGS) -x c -E -
 CFLAGS += $(if $(elfshdr),,-DLIBELF_USE_DEPRECATED)
 
 AWK = awk
-export srctree OUTPUT CFLAGS SRCARCH AWK
+
+SUBCMD_CHECK := n
+SUBCMD_ORC := n
+
+ifeq ($(SRCARCH),x86)
+	SUBCMD_CHECK := y
+	SUBCMD_ORC := y
+endif
+
+export srctree OUTPUT CFLAGS SRCARCH AWK SUBCMD_CHECK SUBCMD_ORC
 include $(srctree)/tools/build/Makefile.include
 
 $(OBJTOOL_IN): fixdep FORCE
diff --git a/tools/objtool/arch.h b/tools/objtool/arch.h
index cd118eb4248a..eda15a5a285e 100644
--- a/tools/objtool/arch.h
+++ b/tools/objtool/arch.h
@@ -8,9 +8,11 @@
 
 #include <stdbool.h>
 #include <linux/list.h>
-#include "elf.h"
+#include "objtool.h"
 #include "cfi.h"
 
+#include <asm/orc_types.h>
+
 enum insn_type {
 	INSN_JUMP_CONDITIONAL,
 	INSN_JUMP_UNCONDITIONAL,
diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c
index be42b716166b..7a44174967b5 100644
--- a/tools/objtool/builtin-check.c
+++ b/tools/objtool/builtin-check.c
@@ -16,7 +16,7 @@
 #include <subcmd/parse-options.h>
 #include <string.h>
 #include "builtin.h"
-#include "check.h"
+#include "objtool.h"
 
 bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux;
 
diff --git a/tools/objtool/builtin-orc.c b/tools/objtool/builtin-orc.c
index 5f7cc6157edd..b1dfe2007962 100644
--- a/tools/objtool/builtin-orc.c
+++ b/tools/objtool/builtin-orc.c
@@ -14,8 +14,7 @@
 
 #include <string.h>
 #include "builtin.h"
-#include "check.h"
-
+#include "objtool.h"
 
 static const char *orc_usage[] = {
 	"objtool orc generate [<options>] file.o",
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index c735f73d271d..3065a1752fe6 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -7,10 +7,10 @@
 #include <stdlib.h>
 
 #include "builtin.h"
+#include "cfi.h"
+#include "arch.h"
 #include "check.h"
-#include "elf.h"
 #include "special.h"
-#include "arch.h"
 #include "warn.h"
 
 #include <linux/hashtable.h>
diff --git a/tools/objtool/check.h b/tools/objtool/check.h
index 3b59a1cbcff5..906b5210f7ca 100644
--- a/tools/objtool/check.h
+++ b/tools/objtool/check.h
@@ -7,10 +7,8 @@
 #define _CHECK_H
 
 #include <stdbool.h>
-#include "objtool.h"
 #include "cfi.h"
 #include "arch.h"
-#include "orc.h"
 
 struct insn_state {
 	struct cfi_state cfi;
@@ -47,8 +45,6 @@ struct instruction {
 	struct orc_entry orc;
 };
 
-int check(const char *objname, bool orc);
-
 struct instruction *find_insn(struct objtool_file *file,
 			      struct section *sec, unsigned long offset);
 
diff --git a/tools/objtool/objtool.h b/tools/objtool/objtool.h
index afa52fe6f644..6de791106537 100644
--- a/tools/objtool/objtool.h
+++ b/tools/objtool/objtool.h
@@ -17,4 +17,18 @@ struct objtool_file {
 	DECLARE_HASHTABLE(insn_hash, 20);
 	bool ignore_unreachables, c_file, hints, rodata;
 };
+
+/*
+ * Prototypes for subcommands or their weak, "missing", alternatives.
+ * We use the missing_ prefix only for subcommand entry functions.
+ */
+int missing_check(const char *objname, bool orc);
+int check(const char *objname, bool orc);
+
+int missing_orc_dump(const char *objname);
+int orc_dump(const char *objname);
+
+int create_orc(struct objtool_file *file);
+int create_orc_sections(struct objtool_file *file);
+
 #endif
diff --git a/tools/objtool/orc.h b/tools/objtool/orc.h
deleted file mode 100644
index ee2832221e62..000000000000
--- a/tools/objtool/orc.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- * Copyright (C) 2017 Josh Poimboeuf <jpoimboe@redhat.com>
- */
-
-#ifndef _ORC_H
-#define _ORC_H
-
-#include <asm/orc_types.h>
-
-struct objtool_file;
-
-int create_orc(struct objtool_file *file);
-int create_orc_sections(struct objtool_file *file);
-
-int orc_dump(const char *objname);
-
-#endif /* _ORC_H */
diff --git a/tools/objtool/orc_dump.c b/tools/objtool/orc_dump.c
index ba4cbb1cdd63..fca46e006fc2 100644
--- a/tools/objtool/orc_dump.c
+++ b/tools/objtool/orc_dump.c
@@ -4,7 +4,8 @@
  */
 
 #include <unistd.h>
-#include "orc.h"
+#include <asm/orc_types.h>
+#include "objtool.h"
 #include "warn.h"
 
 static const char *reg_name(unsigned int reg)
diff --git a/tools/objtool/orc_gen.c b/tools/objtool/orc_gen.c
index 9d2bf2daaaa6..c9549988121a 100644
--- a/tools/objtool/orc_gen.c
+++ b/tools/objtool/orc_gen.c
@@ -6,7 +6,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "orc.h"
 #include "check.h"
 #include "warn.h"
 
diff --git a/tools/objtool/weak.c b/tools/objtool/weak.c
new file mode 100644
index 000000000000..c4e698f26f63
--- /dev/null
+++ b/tools/objtool/weak.c
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 Matt Helsley <mhelsley@vmware.com>
+ * Weak definitions necessary to compile objtool without
+ * some subcommands (e.g. check, orc).
+ */
+
+#include <stdbool.h>
+#include "objtool.h"
+
+const char __attribute__ ((weak)) *objname;
+
+int missing_check(const char *_objname, bool orc)
+{
+	return 127;
+}
+
+int __attribute__ ((weak, alias("missing_check"))) check(const char *_objname, bool orc);
+
+int missing_orc_dump(const char *_objname)
+{
+	return 127;
+}
+
+int __attribute__ ((weak, alias("missing_orc_dump"))) orc_dump(const char *_objname);
+
+int __attribute__ ((weak)) create_orc(struct objtool_file *file)
+{
+	return 127;
+}
+
+int __attribute__ ((weak)) create_orc_sections(struct objtool_file *file)
+{
+	return 127;
+}
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/3] objtool: Enable compilation of objtool for all architectures
  2020-05-19 20:55 ` [PATCH 3/3] objtool: Enable compilation of objtool for all architectures Matt Helsley
@ 2020-05-19 21:18   ` Josh Poimboeuf
  2020-05-19 21:46     ` Matt Helsley
  2020-05-20  8:31   ` Julien Thierry
  1 sibling, 1 reply; 14+ messages in thread
From: Josh Poimboeuf @ 2020-05-19 21:18 UTC (permalink / raw)
  To: Matt Helsley
  Cc: linux-kernel, Peter Zijlstra, Julien Thierry, Miroslav Benes,
	Steven Rostedt

On Tue, May 19, 2020 at 01:55:33PM -0700, Matt Helsley wrote:
> +const char __attribute__ ((weak)) *objname;
> +
> +int missing_check(const char *_objname, bool orc)
> +{
> +	return 127;
> +}
> +
> +int __attribute__ ((weak, alias("missing_check"))) check(const char *_objname, bool orc);
> +
> +int missing_orc_dump(const char *_objname)
> +{
> +	return 127;
> +}
> +
> +int __attribute__ ((weak, alias("missing_orc_dump"))) orc_dump(const char *_objname);
> +
> +int __attribute__ ((weak)) create_orc(struct objtool_file *file)
> +{
> +	return 127;
> +}
> +
> +int __attribute__ ((weak)) create_orc_sections(struct objtool_file *file)
> +{
> +	return 127;
> +}

I think the aliased "missing_" functions are no longer needed, right?
i.e. can we just have weak versions of check() and orc_dump()?

Otherwise everything looks good to me.

-- 
Josh


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/3] objtool: Enable compilation of objtool for all architectures
  2020-05-19 21:18   ` Josh Poimboeuf
@ 2020-05-19 21:46     ` Matt Helsley
  2020-05-20 14:16       ` Josh Poimboeuf
  0 siblings, 1 reply; 14+ messages in thread
From: Matt Helsley @ 2020-05-19 21:46 UTC (permalink / raw)
  To: Josh Poimboeuf
  Cc: linux-kernel, Peter Zijlstra, Julien Thierry, Miroslav Benes,
	Steven Rostedt

On Tue, May 19, 2020 at 04:18:29PM -0500, Josh Poimboeuf wrote:
> On Tue, May 19, 2020 at 01:55:33PM -0700, Matt Helsley wrote:
> > +const char __attribute__ ((weak)) *objname;
> > +
> > +int missing_check(const char *_objname, bool orc)
> > +{
> > +	return 127;
> > +}
> > +
> > +int __attribute__ ((weak, alias("missing_check"))) check(const char *_objname, bool orc);
> > +
> > +int missing_orc_dump(const char *_objname)
> > +{
> > +	return 127;
> > +}
> > +
> > +int __attribute__ ((weak, alias("missing_orc_dump"))) orc_dump(const char *_objname);
> > +
> > +int __attribute__ ((weak)) create_orc(struct objtool_file *file)
> > +{
> > +	return 127;
> > +}
> > +
> > +int __attribute__ ((weak)) create_orc_sections(struct objtool_file *file)
> > +{
> > +	return 127;
> > +}
> 
> I think the aliased "missing_" functions are no longer needed, right?
> i.e. can we just have weak versions of check() and orc_dump()?

Oops, Yeah, we can remove those aliases. I can fix and resend this one if you
like. 

> Otherwise everything looks good to me.

Excellent. I'm thinking I'll get the relocs patches posted as an RFC next...

Cheers,
	-Matt

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] objtool: Move struct objtool_file into arch-independent header
  2020-05-19 20:55 ` [PATCH 2/3] objtool: Move struct objtool_file into arch-independent header Matt Helsley
@ 2020-05-20  8:04   ` Julien Thierry
  2020-05-27 14:43   ` Kamalesh Babulal
  1 sibling, 0 replies; 14+ messages in thread
From: Julien Thierry @ 2020-05-20  8:04 UTC (permalink / raw)
  To: Matt Helsley, linux-kernel
  Cc: Josh Poimboeuf, Peter Zijlstra, Miroslav Benes, Steven Rostedt



On 5/19/20 9:55 PM, Matt Helsley wrote:
> The objtool_file structure describes the files objtool works on,
> is used by the check subcommand, and the check.h header is included
> by the orc subcommands so it's presently used by all subcommands.
> 
> Since the structure will be useful in all subcommands besides check,
> and some subcommands may not want to include check.h to get the
> definition, split the structure out into a new header meant for use
> by all objtool subcommands.
> 
> Signed-off-by: Matt Helsley <mhelsley@vmware.com>

Reviewed-by: Julien Thierry <jthierry@redhat.com>

-- 
Julien Thierry


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/3] objtool: Enable compilation of objtool for all architectures
  2020-05-19 20:55 ` [PATCH 3/3] objtool: Enable compilation of objtool for all architectures Matt Helsley
  2020-05-19 21:18   ` Josh Poimboeuf
@ 2020-05-20  8:31   ` Julien Thierry
  2020-05-20 16:41     ` Matt Helsley
  1 sibling, 1 reply; 14+ messages in thread
From: Julien Thierry @ 2020-05-20  8:31 UTC (permalink / raw)
  To: Matt Helsley, linux-kernel
  Cc: Josh Poimboeuf, Peter Zijlstra, Miroslav Benes, Steven Rostedt



On 5/19/20 9:55 PM, Matt Helsley wrote:
> objtool currently only compiles for x86 architectures. This is
> fine as it presently does not support tooling for other
> architectures. However, we would like to be able to convert other
> kernel tools to run as objtool sub commands because they too
> process ELF object files. This will allow us to convert tools
> such as recordmcount to use objtool's ELF code.
> 
> Since much of recordmcount's ELF code is copy-paste code to/from
> a variety of other kernel tools (look at modpost for example) this
> means that if we can convert recordmcount we can convert more.
> 
> We define "missing" weak definitions for subcommand entry functions
> and other weak definitions for shared functions critical to
> building existing subcommands. These return 127 when the command is
> missing which signify tools that do not exist on all architectures.
> In this case the "check" and "orc" tools do not exist on all
> architectures so we only add them for x86. Future changes adding
> support for "check", to arm64 for example, can then modify the
> SUBCMD_CHECK variable when building for arm64.
> 
> objtool is not currently wired in to KConfig to be built for other
> architectures because it's not needed for those architectures and
> there are no commands it supports other than those for x86. As more
> command support is enabled on various architectures the necessary
> KConfig changes can be made (e.g. adding "STACK_VALIDATION") to
> trigger building objtool.
> 
> Signed-off-by: Matt Helsley <mhelsley@vmware.com>
> Cc: Julien Thierry <jthierry@redhat.com>
> ---
>   tools/objtool/Build           | 13 +++++++++----
>   tools/objtool/Makefile        | 11 ++++++++++-
>   tools/objtool/arch.h          |  4 +++-
>   tools/objtool/builtin-check.c |  2 +-
>   tools/objtool/builtin-orc.c   |  3 +--
>   tools/objtool/check.c         |  4 ++--
>   tools/objtool/check.h         |  4 ----
>   tools/objtool/objtool.h       | 14 ++++++++++++++
>   tools/objtool/orc.h           | 18 ------------------
>   tools/objtool/orc_dump.c      |  3 ++-
>   tools/objtool/orc_gen.c       |  1 -
>   tools/objtool/weak.c          | 35 +++++++++++++++++++++++++++++++++++
>   12 files changed, 77 insertions(+), 35 deletions(-)
>   delete mode 100644 tools/objtool/orc.h
>   create mode 100644 tools/objtool/weak.c
> 
> diff --git a/tools/objtool/Build b/tools/objtool/Build
> index 66f44f5cd2a6..b7222d5cc7bc 100644
> --- a/tools/objtool/Build
> +++ b/tools/objtool/Build
> @@ -1,11 +1,16 @@
>   objtool-y += arch/$(SRCARCH)/
> +
> +objtool-y += weak.o
> +
> +objtool-$(SUBCMD_CHECK) += check.o
> +objtool-$(SUBCMD_CHECK) += special.o
> +objtool-$(SUBCMD_ORC) += check.o
> +objtool-$(SUBCMD_ORC) += orc_gen.o
> +objtool-$(SUBCMD_ORC) += orc_dump.o
> +
>   objtool-y += builtin-check.o
>   objtool-y += builtin-orc.o
> -objtool-y += check.o
> -objtool-y += orc_gen.o
> -objtool-y += orc_dump.o
>   objtool-y += elf.o
> -objtool-y += special.o
>   objtool-y += objtool.o
>   
>   objtool-y += libstring.o
> diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile
> index 6b91388aecbb..12686e2f1a56 100644
> --- a/tools/objtool/Makefile
> +++ b/tools/objtool/Makefile
> @@ -46,7 +46,16 @@ elfshdr := $(shell echo '$(pound)include <libelf.h>' | $(CC) $(CFLAGS) -x c -E -
>   CFLAGS += $(if $(elfshdr),,-DLIBELF_USE_DEPRECATED)
>   
>   AWK = awk
> -export srctree OUTPUT CFLAGS SRCARCH AWK
> +
> +SUBCMD_CHECK := n
> +SUBCMD_ORC := n
> +
> +ifeq ($(SRCARCH),x86)
> +	SUBCMD_CHECK := y
> +	SUBCMD_ORC := y
> +endif
> +
> +export srctree OUTPUT CFLAGS SRCARCH AWK SUBCMD_CHECK SUBCMD_ORC

Nit: I was thinking, since the list of SUBCMD_* is only going to grow
maybe it would be nicer to have a single export line for the SUBCMD_* 
variables and leave the export line of [srctree..AWK] untouched.

Just a suggestion, and only in case you respin this taking into account 
Josh's comment.

Otherwise things look good to me.

Cheers,

-- 
Julien Thierry


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/3] objtool: Enable compilation of objtool for all architectures
  2020-05-19 21:46     ` Matt Helsley
@ 2020-05-20 14:16       ` Josh Poimboeuf
  2020-05-20 16:38         ` Matt Helsley
  2020-05-27 14:42         ` Kamalesh Babulal
  0 siblings, 2 replies; 14+ messages in thread
From: Josh Poimboeuf @ 2020-05-20 14:16 UTC (permalink / raw)
  To: Matt Helsley
  Cc: linux-kernel, Peter Zijlstra, Julien Thierry, Miroslav Benes,
	Steven Rostedt

On Tue, May 19, 2020 at 02:46:37PM -0700, Matt Helsley wrote:
> On Tue, May 19, 2020 at 04:18:29PM -0500, Josh Poimboeuf wrote:
> > On Tue, May 19, 2020 at 01:55:33PM -0700, Matt Helsley wrote:
> > > +const char __attribute__ ((weak)) *objname;
> > > +
> > > +int missing_check(const char *_objname, bool orc)
> > > +{
> > > +	return 127;
> > > +}
> > > +
> > > +int __attribute__ ((weak, alias("missing_check"))) check(const char *_objname, bool orc);
> > > +
> > > +int missing_orc_dump(const char *_objname)
> > > +{
> > > +	return 127;
> > > +}
> > > +
> > > +int __attribute__ ((weak, alias("missing_orc_dump"))) orc_dump(const char *_objname);
> > > +
> > > +int __attribute__ ((weak)) create_orc(struct objtool_file *file)
> > > +{
> > > +	return 127;
> > > +}
> > > +
> > > +int __attribute__ ((weak)) create_orc_sections(struct objtool_file *file)
> > > +{
> > > +	return 127;
> > > +}
> > 
> > I think the aliased "missing_" functions are no longer needed, right?
> > i.e. can we just have weak versions of check() and orc_dump()?
> 
> Oops, Yeah, we can remove those aliases. I can fix and resend this one if you
> like. 

I made that change along with Julien's suggestion, and also made a few
other changes to the weak file: a __weak macro and some error messages.

Does this look ok?

From: Matt Helsley <mhelsley@vmware.com>
Subject: [PATCH] objtool: Enable compilation of objtool for all architectures

Objtool currently only compiles for x86 architectures. This is
fine as it presently does not support tooling for other
architectures. However, we would like to be able to convert other
kernel tools to run as objtool sub commands because they too
process ELF object files. This will allow us to convert tools
such as recordmcount to use objtool's ELF code.

Since much of recordmcount's ELF code is copy-paste code to/from
a variety of other kernel tools (look at modpost for example) this
means that if we can convert recordmcount we can convert more.

We define weak definitions for subcommand entry functions and other weak
definitions for shared functions critical to building existing
subcommands. These return 127 when the command is missing which signify
tools that do not exist on all architectures.  In this case the "check"
and "orc" tools do not exist on all architectures so we only add them
for x86. Future changes adding support for "check", to arm64 for
example, can then modify the SUBCMD_CHECK variable when building for
arm64.

Objtool is not currently wired in to KConfig to be built for other
architectures because it's not needed for those architectures and
there are no commands it supports other than those for x86. As more
command support is enabled on various architectures the necessary
KConfig changes can be made (e.g. adding "STACK_VALIDATION") to
trigger building objtool.

[ jpoimboe: remove aliases, add __weak macro, add error messages ]

Cc: Julien Thierry <jthierry@redhat.com>
Signed-off-by: Matt Helsley <mhelsley@vmware.com>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 tools/objtool/Build           | 13 ++++++++----
 tools/objtool/Makefile        | 10 +++++++++
 tools/objtool/arch.h          |  4 +++-
 tools/objtool/builtin-check.c |  2 +-
 tools/objtool/builtin-orc.c   |  3 +--
 tools/objtool/check.c         |  4 ++--
 tools/objtool/check.h         |  4 ----
 tools/objtool/objtool.h       |  5 +++++
 tools/objtool/orc.h           | 18 ----------------
 tools/objtool/orc_dump.c      |  3 ++-
 tools/objtool/orc_gen.c       |  1 -
 tools/objtool/weak.c          | 40 +++++++++++++++++++++++++++++++++++
 12 files changed, 73 insertions(+), 34 deletions(-)
 delete mode 100644 tools/objtool/orc.h
 create mode 100644 tools/objtool/weak.c

diff --git a/tools/objtool/Build b/tools/objtool/Build
index 66f44f5cd2a6..b7222d5cc7bc 100644
--- a/tools/objtool/Build
+++ b/tools/objtool/Build
@@ -1,11 +1,16 @@
 objtool-y += arch/$(SRCARCH)/
+
+objtool-y += weak.o
+
+objtool-$(SUBCMD_CHECK) += check.o
+objtool-$(SUBCMD_CHECK) += special.o
+objtool-$(SUBCMD_ORC) += check.o
+objtool-$(SUBCMD_ORC) += orc_gen.o
+objtool-$(SUBCMD_ORC) += orc_dump.o
+
 objtool-y += builtin-check.o
 objtool-y += builtin-orc.o
-objtool-y += check.o
-objtool-y += orc_gen.o
-objtool-y += orc_dump.o
 objtool-y += elf.o
-objtool-y += special.o
 objtool-y += objtool.o
 
 objtool-y += libstring.o
diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile
index 6b91388aecbb..7770edcda3a0 100644
--- a/tools/objtool/Makefile
+++ b/tools/objtool/Makefile
@@ -46,6 +46,16 @@ elfshdr := $(shell echo '$(pound)include <libelf.h>' | $(CC) $(CFLAGS) -x c -E -
 CFLAGS += $(if $(elfshdr),,-DLIBELF_USE_DEPRECATED)
 
 AWK = awk
+
+SUBCMD_CHECK := n
+SUBCMD_ORC := n
+
+ifeq ($(SRCARCH),x86)
+	SUBCMD_CHECK := y
+	SUBCMD_ORC := y
+endif
+
+export SUBCMD_CHECK SUBCMD_ORC
 export srctree OUTPUT CFLAGS SRCARCH AWK
 include $(srctree)/tools/build/Makefile.include
 
diff --git a/tools/objtool/arch.h b/tools/objtool/arch.h
index cd118eb4248a..eda15a5a285e 100644
--- a/tools/objtool/arch.h
+++ b/tools/objtool/arch.h
@@ -8,9 +8,11 @@
 
 #include <stdbool.h>
 #include <linux/list.h>
-#include "elf.h"
+#include "objtool.h"
 #include "cfi.h"
 
+#include <asm/orc_types.h>
+
 enum insn_type {
 	INSN_JUMP_CONDITIONAL,
 	INSN_JUMP_UNCONDITIONAL,
diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c
index be42b716166b..7a44174967b5 100644
--- a/tools/objtool/builtin-check.c
+++ b/tools/objtool/builtin-check.c
@@ -16,7 +16,7 @@
 #include <subcmd/parse-options.h>
 #include <string.h>
 #include "builtin.h"
-#include "check.h"
+#include "objtool.h"
 
 bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux;
 
diff --git a/tools/objtool/builtin-orc.c b/tools/objtool/builtin-orc.c
index 5f7cc6157edd..b1dfe2007962 100644
--- a/tools/objtool/builtin-orc.c
+++ b/tools/objtool/builtin-orc.c
@@ -14,8 +14,7 @@
 
 #include <string.h>
 #include "builtin.h"
-#include "check.h"
-
+#include "objtool.h"
 
 static const char *orc_usage[] = {
 	"objtool orc generate [<options>] file.o",
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 7a47ff9d39f7..63d65a702900 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -7,10 +7,10 @@
 #include <stdlib.h>
 
 #include "builtin.h"
+#include "cfi.h"
+#include "arch.h"
 #include "check.h"
-#include "elf.h"
 #include "special.h"
-#include "arch.h"
 #include "warn.h"
 
 #include <linux/hashtable.h>
diff --git a/tools/objtool/check.h b/tools/objtool/check.h
index 3b59a1cbcff5..906b5210f7ca 100644
--- a/tools/objtool/check.h
+++ b/tools/objtool/check.h
@@ -7,10 +7,8 @@
 #define _CHECK_H
 
 #include <stdbool.h>
-#include "objtool.h"
 #include "cfi.h"
 #include "arch.h"
-#include "orc.h"
 
 struct insn_state {
 	struct cfi_state cfi;
@@ -47,8 +45,6 @@ struct instruction {
 	struct orc_entry orc;
 };
 
-int check(const char *objname, bool orc);
-
 struct instruction *find_insn(struct objtool_file *file,
 			      struct section *sec, unsigned long offset);
 
diff --git a/tools/objtool/objtool.h b/tools/objtool/objtool.h
index d89616b2ca39..528028a66816 100644
--- a/tools/objtool/objtool.h
+++ b/tools/objtool/objtool.h
@@ -19,4 +19,9 @@ struct objtool_file {
 	bool ignore_unreachables, c_file, hints, rodata;
 };
 
+int check(const char *objname, bool orc);
+int orc_dump(const char *objname);
+int create_orc(struct objtool_file *file);
+int create_orc_sections(struct objtool_file *file);
+
 #endif /* _OBJTOOL_H */
diff --git a/tools/objtool/orc.h b/tools/objtool/orc.h
deleted file mode 100644
index ee2832221e62..000000000000
--- a/tools/objtool/orc.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- * Copyright (C) 2017 Josh Poimboeuf <jpoimboe@redhat.com>
- */
-
-#ifndef _ORC_H
-#define _ORC_H
-
-#include <asm/orc_types.h>
-
-struct objtool_file;
-
-int create_orc(struct objtool_file *file);
-int create_orc_sections(struct objtool_file *file);
-
-int orc_dump(const char *objname);
-
-#endif /* _ORC_H */
diff --git a/tools/objtool/orc_dump.c b/tools/objtool/orc_dump.c
index ba4cbb1cdd63..fca46e006fc2 100644
--- a/tools/objtool/orc_dump.c
+++ b/tools/objtool/orc_dump.c
@@ -4,7 +4,8 @@
  */
 
 #include <unistd.h>
-#include "orc.h"
+#include <asm/orc_types.h>
+#include "objtool.h"
 #include "warn.h"
 
 static const char *reg_name(unsigned int reg)
diff --git a/tools/objtool/orc_gen.c b/tools/objtool/orc_gen.c
index 9d2bf2daaaa6..c9549988121a 100644
--- a/tools/objtool/orc_gen.c
+++ b/tools/objtool/orc_gen.c
@@ -6,7 +6,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "orc.h"
 #include "check.h"
 #include "warn.h"
 
diff --git a/tools/objtool/weak.c b/tools/objtool/weak.c
new file mode 100644
index 000000000000..3c703811a2bc
--- /dev/null
+++ b/tools/objtool/weak.c
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 Matt Helsley <mhelsley@vmware.com>
+ * Weak definitions necessary to compile objtool without
+ * some subcommands (e.g. check, orc).
+ */
+
+#include <stdbool.h>
+#include <errno.h>
+#include "objtool.h"
+
+#define __weak __attribute__((weak))
+
+#define UNSUPPORTED(cmd)						\
+({									\
+	fprintf(stderr, "error: objtool: " cmd " not implemented\n");	\
+	return ENOSYS;							\
+})
+
+const char __weak *objname;
+
+int __weak check(const char *_objname, bool orc)
+{
+	UNSUPPORTED("check subcommand");
+}
+
+int __weak orc_dump(const char *_objname)
+{
+	UNSUPPORTED("orc");
+}
+
+int __weak create_orc(struct objtool_file *file)
+{
+	UNSUPPORTED("orc");
+}
+
+int __weak create_orc_sections(struct objtool_file *file)
+{
+	UNSUPPORTED("orc");
+}
-- 
2.21.1



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/3] objtool: Enable compilation of objtool for all architectures
  2020-05-20 14:16       ` Josh Poimboeuf
@ 2020-05-20 16:38         ` Matt Helsley
  2020-05-27 14:42         ` Kamalesh Babulal
  1 sibling, 0 replies; 14+ messages in thread
From: Matt Helsley @ 2020-05-20 16:38 UTC (permalink / raw)
  To: Josh Poimboeuf
  Cc: linux-kernel, Peter Zijlstra, Julien Thierry, Miroslav Benes,
	Steven Rostedt

On Wed, May 20, 2020 at 09:16:04AM -0500, Josh Poimboeuf wrote:
> On Tue, May 19, 2020 at 02:46:37PM -0700, Matt Helsley wrote:
> > On Tue, May 19, 2020 at 04:18:29PM -0500, Josh Poimboeuf wrote:
> > > On Tue, May 19, 2020 at 01:55:33PM -0700, Matt Helsley wrote:
> > > > +const char __attribute__ ((weak)) *objname;
> > > > +
> > > > +int missing_check(const char *_objname, bool orc)
> > > > +{
> > > > +	return 127;
> > > > +}
> > > > +
> > > > +int __attribute__ ((weak, alias("missing_check"))) check(const char *_objname, bool orc);
> > > > +
> > > > +int missing_orc_dump(const char *_objname)
> > > > +{
> > > > +	return 127;

Just a note in case anyone reviews this thread later:

I chose to return 127 rather than an errno value because it eventually
gets set as the exit status and bash, at least, uses 127 for "function not
defined". ENOSYS makes more sense internally and does "fit" as an exit
status so changing to ENOSYS does make more sense.

> > > > +}
> > > > +
> > > > +int __attribute__ ((weak, alias("missing_orc_dump"))) orc_dump(const char *_objname);
> > > > +
> > > > +int __attribute__ ((weak)) create_orc(struct objtool_file *file)
> > > > +{
> > > > +	return 127;
> > > > +}
> > > > +
> > > > +int __attribute__ ((weak)) create_orc_sections(struct objtool_file *file)
> > > > +{
> > > > +	return 127;
> > > > +}
> > > 
> > > I think the aliased "missing_" functions are no longer needed, right?
> > > i.e. can we just have weak versions of check() and orc_dump()?
> > 
> > Oops, Yeah, we can remove those aliases. I can fix and resend this one if you
> > like. 
> 
> I made that change along with Julien's suggestion, and also made a few
> other changes to the weak file: a __weak macro and some error messages.
> 
> Does this look ok?

Yes, looks great to me. Thanks!

> 
> From: Matt Helsley <mhelsley@vmware.com>
> Subject: [PATCH] objtool: Enable compilation of objtool for all architectures
> 
> Objtool currently only compiles for x86 architectures. This is
> fine as it presently does not support tooling for other
> architectures. However, we would like to be able to convert other
> kernel tools to run as objtool sub commands because they too
> process ELF object files. This will allow us to convert tools
> such as recordmcount to use objtool's ELF code.
> 
> Since much of recordmcount's ELF code is copy-paste code to/from
> a variety of other kernel tools (look at modpost for example) this
> means that if we can convert recordmcount we can convert more.
> 
> We define weak definitions for subcommand entry functions and other weak
> definitions for shared functions critical to building existing
> subcommands. These return 127 when the command is missing which signify
> tools that do not exist on all architectures.  In this case the "check"
> and "orc" tools do not exist on all architectures so we only add them
> for x86. Future changes adding support for "check", to arm64 for
> example, can then modify the SUBCMD_CHECK variable when building for
> arm64.
> 
> Objtool is not currently wired in to KConfig to be built for other
> architectures because it's not needed for those architectures and
> there are no commands it supports other than those for x86. As more
> command support is enabled on various architectures the necessary
> KConfig changes can be made (e.g. adding "STACK_VALIDATION") to
> trigger building objtool.
> 
> [ jpoimboe: remove aliases, add __weak macro, add error messages ]
> 
> Cc: Julien Thierry <jthierry@redhat.com>
> Signed-off-by: Matt Helsley <mhelsley@vmware.com>
> Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
> ---
>  tools/objtool/Build           | 13 ++++++++----
>  tools/objtool/Makefile        | 10 +++++++++
>  tools/objtool/arch.h          |  4 +++-
>  tools/objtool/builtin-check.c |  2 +-
>  tools/objtool/builtin-orc.c   |  3 +--
>  tools/objtool/check.c         |  4 ++--
>  tools/objtool/check.h         |  4 ----
>  tools/objtool/objtool.h       |  5 +++++
>  tools/objtool/orc.h           | 18 ----------------
>  tools/objtool/orc_dump.c      |  3 ++-
>  tools/objtool/orc_gen.c       |  1 -
>  tools/objtool/weak.c          | 40 +++++++++++++++++++++++++++++++++++
>  12 files changed, 73 insertions(+), 34 deletions(-)
>  delete mode 100644 tools/objtool/orc.h
>  create mode 100644 tools/objtool/weak.c
> 
> diff --git a/tools/objtool/Build b/tools/objtool/Build
> index 66f44f5cd2a6..b7222d5cc7bc 100644
> --- a/tools/objtool/Build
> +++ b/tools/objtool/Build
> @@ -1,11 +1,16 @@
>  objtool-y += arch/$(SRCARCH)/
> +
> +objtool-y += weak.o
> +
> +objtool-$(SUBCMD_CHECK) += check.o
> +objtool-$(SUBCMD_CHECK) += special.o
> +objtool-$(SUBCMD_ORC) += check.o
> +objtool-$(SUBCMD_ORC) += orc_gen.o
> +objtool-$(SUBCMD_ORC) += orc_dump.o
> +
>  objtool-y += builtin-check.o
>  objtool-y += builtin-orc.o
> -objtool-y += check.o
> -objtool-y += orc_gen.o
> -objtool-y += orc_dump.o
>  objtool-y += elf.o
> -objtool-y += special.o
>  objtool-y += objtool.o
>  
>  objtool-y += libstring.o
> diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile
> index 6b91388aecbb..7770edcda3a0 100644
> --- a/tools/objtool/Makefile
> +++ b/tools/objtool/Makefile
> @@ -46,6 +46,16 @@ elfshdr := $(shell echo '$(pound)include <libelf.h>' | $(CC) $(CFLAGS) -x c -E -
>  CFLAGS += $(if $(elfshdr),,-DLIBELF_USE_DEPRECATED)
>  
>  AWK = awk
> +
> +SUBCMD_CHECK := n
> +SUBCMD_ORC := n
> +
> +ifeq ($(SRCARCH),x86)
> +	SUBCMD_CHECK := y
> +	SUBCMD_ORC := y
> +endif
> +
> +export SUBCMD_CHECK SUBCMD_ORC
>  export srctree OUTPUT CFLAGS SRCARCH AWK
>  include $(srctree)/tools/build/Makefile.include
>  
> diff --git a/tools/objtool/arch.h b/tools/objtool/arch.h
> index cd118eb4248a..eda15a5a285e 100644
> --- a/tools/objtool/arch.h
> +++ b/tools/objtool/arch.h
> @@ -8,9 +8,11 @@
>  
>  #include <stdbool.h>
>  #include <linux/list.h>
> -#include "elf.h"
> +#include "objtool.h"
>  #include "cfi.h"
>  
> +#include <asm/orc_types.h>
> +
>  enum insn_type {
>  	INSN_JUMP_CONDITIONAL,
>  	INSN_JUMP_UNCONDITIONAL,
> diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c
> index be42b716166b..7a44174967b5 100644
> --- a/tools/objtool/builtin-check.c
> +++ b/tools/objtool/builtin-check.c
> @@ -16,7 +16,7 @@
>  #include <subcmd/parse-options.h>
>  #include <string.h>
>  #include "builtin.h"
> -#include "check.h"
> +#include "objtool.h"
>  
>  bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux;
>  
> diff --git a/tools/objtool/builtin-orc.c b/tools/objtool/builtin-orc.c
> index 5f7cc6157edd..b1dfe2007962 100644
> --- a/tools/objtool/builtin-orc.c
> +++ b/tools/objtool/builtin-orc.c
> @@ -14,8 +14,7 @@
>  
>  #include <string.h>
>  #include "builtin.h"
> -#include "check.h"
> -
> +#include "objtool.h"
>  
>  static const char *orc_usage[] = {
>  	"objtool orc generate [<options>] file.o",
> diff --git a/tools/objtool/check.c b/tools/objtool/check.c
> index 7a47ff9d39f7..63d65a702900 100644
> --- a/tools/objtool/check.c
> +++ b/tools/objtool/check.c
> @@ -7,10 +7,10 @@
>  #include <stdlib.h>
>  
>  #include "builtin.h"
> +#include "cfi.h"
> +#include "arch.h"
>  #include "check.h"
> -#include "elf.h"
>  #include "special.h"
> -#include "arch.h"
>  #include "warn.h"
>  
>  #include <linux/hashtable.h>
> diff --git a/tools/objtool/check.h b/tools/objtool/check.h
> index 3b59a1cbcff5..906b5210f7ca 100644
> --- a/tools/objtool/check.h
> +++ b/tools/objtool/check.h
> @@ -7,10 +7,8 @@
>  #define _CHECK_H
>  
>  #include <stdbool.h>
> -#include "objtool.h"
>  #include "cfi.h"
>  #include "arch.h"
> -#include "orc.h"
>  
>  struct insn_state {
>  	struct cfi_state cfi;
> @@ -47,8 +45,6 @@ struct instruction {
>  	struct orc_entry orc;
>  };
>  
> -int check(const char *objname, bool orc);
> -
>  struct instruction *find_insn(struct objtool_file *file,
>  			      struct section *sec, unsigned long offset);
>  
> diff --git a/tools/objtool/objtool.h b/tools/objtool/objtool.h
> index d89616b2ca39..528028a66816 100644
> --- a/tools/objtool/objtool.h
> +++ b/tools/objtool/objtool.h
> @@ -19,4 +19,9 @@ struct objtool_file {
>  	bool ignore_unreachables, c_file, hints, rodata;
>  };
>  
> +int check(const char *objname, bool orc);
> +int orc_dump(const char *objname);
> +int create_orc(struct objtool_file *file);
> +int create_orc_sections(struct objtool_file *file);
> +
>  #endif /* _OBJTOOL_H */
> diff --git a/tools/objtool/orc.h b/tools/objtool/orc.h
> deleted file mode 100644
> index ee2832221e62..000000000000
> --- a/tools/objtool/orc.h
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-or-later */
> -/*
> - * Copyright (C) 2017 Josh Poimboeuf <jpoimboe@redhat.com>
> - */
> -
> -#ifndef _ORC_H
> -#define _ORC_H
> -
> -#include <asm/orc_types.h>
> -
> -struct objtool_file;
> -
> -int create_orc(struct objtool_file *file);
> -int create_orc_sections(struct objtool_file *file);
> -
> -int orc_dump(const char *objname);
> -
> -#endif /* _ORC_H */
> diff --git a/tools/objtool/orc_dump.c b/tools/objtool/orc_dump.c
> index ba4cbb1cdd63..fca46e006fc2 100644
> --- a/tools/objtool/orc_dump.c
> +++ b/tools/objtool/orc_dump.c
> @@ -4,7 +4,8 @@
>   */
>  
>  #include <unistd.h>
> -#include "orc.h"
> +#include <asm/orc_types.h>
> +#include "objtool.h"
>  #include "warn.h"
>  
>  static const char *reg_name(unsigned int reg)
> diff --git a/tools/objtool/orc_gen.c b/tools/objtool/orc_gen.c
> index 9d2bf2daaaa6..c9549988121a 100644
> --- a/tools/objtool/orc_gen.c
> +++ b/tools/objtool/orc_gen.c
> @@ -6,7 +6,6 @@
>  #include <stdlib.h>
>  #include <string.h>
>  
> -#include "orc.h"
>  #include "check.h"
>  #include "warn.h"
>  
> diff --git a/tools/objtool/weak.c b/tools/objtool/weak.c
> new file mode 100644
> index 000000000000..3c703811a2bc
> --- /dev/null
> +++ b/tools/objtool/weak.c
> @@ -0,0 +1,40 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2020 Matt Helsley <mhelsley@vmware.com>
> + * Weak definitions necessary to compile objtool without
> + * some subcommands (e.g. check, orc).
> + */
> +
> +#include <stdbool.h>
> +#include <errno.h>
> +#include "objtool.h"
> +
> +#define __weak __attribute__((weak))
> +
> +#define UNSUPPORTED(cmd)						\
> +({									\
> +	fprintf(stderr, "error: objtool: " cmd " not implemented\n");	\
> +	return ENOSYS;							\
> +})
> +
> +const char __weak *objname;
> +
> +int __weak check(const char *_objname, bool orc)
> +{
> +	UNSUPPORTED("check subcommand");
> +}
> +
> +int __weak orc_dump(const char *_objname)
> +{
> +	UNSUPPORTED("orc");
> +}
> +
> +int __weak create_orc(struct objtool_file *file)
> +{
> +	UNSUPPORTED("orc");
> +}
> +
> +int __weak create_orc_sections(struct objtool_file *file)
> +{
> +	UNSUPPORTED("orc");
> +}
> -- 
> 2.21.1
> 
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/3] objtool: Enable compilation of objtool for all architectures
  2020-05-20  8:31   ` Julien Thierry
@ 2020-05-20 16:41     ` Matt Helsley
  0 siblings, 0 replies; 14+ messages in thread
From: Matt Helsley @ 2020-05-20 16:41 UTC (permalink / raw)
  To: Julien Thierry
  Cc: linux-kernel, Josh Poimboeuf, Peter Zijlstra, Miroslav Benes,
	Steven Rostedt

On Wed, May 20, 2020 at 09:31:46AM +0100, Julien Thierry wrote:
> 
> 
> On 5/19/20 9:55 PM, Matt Helsley wrote:
> > objtool currently only compiles for x86 architectures. This is
> > fine as it presently does not support tooling for other
> > architectures. However, we would like to be able to convert other
> > kernel tools to run as objtool sub commands because they too
> > process ELF object files. This will allow us to convert tools
> > such as recordmcount to use objtool's ELF code.
> > 
> > Since much of recordmcount's ELF code is copy-paste code to/from
> > a variety of other kernel tools (look at modpost for example) this
> > means that if we can convert recordmcount we can convert more.
> > 
> > We define "missing" weak definitions for subcommand entry functions
> > and other weak definitions for shared functions critical to
> > building existing subcommands. These return 127 when the command is
> > missing which signify tools that do not exist on all architectures.
> > In this case the "check" and "orc" tools do not exist on all
> > architectures so we only add them for x86. Future changes adding
> > support for "check", to arm64 for example, can then modify the
> > SUBCMD_CHECK variable when building for arm64.
> > 
> > objtool is not currently wired in to KConfig to be built for other
> > architectures because it's not needed for those architectures and
> > there are no commands it supports other than those for x86. As more
> > command support is enabled on various architectures the necessary
> > KConfig changes can be made (e.g. adding "STACK_VALIDATION") to
> > trigger building objtool.
> > 
> > Signed-off-by: Matt Helsley <mhelsley@vmware.com>
> > Cc: Julien Thierry <jthierry@redhat.com>
> > ---
> >   tools/objtool/Build           | 13 +++++++++----
> >   tools/objtool/Makefile        | 11 ++++++++++-
> >   tools/objtool/arch.h          |  4 +++-
> >   tools/objtool/builtin-check.c |  2 +-
> >   tools/objtool/builtin-orc.c   |  3 +--
> >   tools/objtool/check.c         |  4 ++--
> >   tools/objtool/check.h         |  4 ----
> >   tools/objtool/objtool.h       | 14 ++++++++++++++
> >   tools/objtool/orc.h           | 18 ------------------
> >   tools/objtool/orc_dump.c      |  3 ++-
> >   tools/objtool/orc_gen.c       |  1 -
> >   tools/objtool/weak.c          | 35 +++++++++++++++++++++++++++++++++++
> >   12 files changed, 77 insertions(+), 35 deletions(-)
> >   delete mode 100644 tools/objtool/orc.h
> >   create mode 100644 tools/objtool/weak.c
> > 
> > diff --git a/tools/objtool/Build b/tools/objtool/Build
> > index 66f44f5cd2a6..b7222d5cc7bc 100644
> > --- a/tools/objtool/Build
> > +++ b/tools/objtool/Build
> > @@ -1,11 +1,16 @@
> >   objtool-y += arch/$(SRCARCH)/
> > +
> > +objtool-y += weak.o
> > +
> > +objtool-$(SUBCMD_CHECK) += check.o
> > +objtool-$(SUBCMD_CHECK) += special.o
> > +objtool-$(SUBCMD_ORC) += check.o
> > +objtool-$(SUBCMD_ORC) += orc_gen.o
> > +objtool-$(SUBCMD_ORC) += orc_dump.o
> > +
> >   objtool-y += builtin-check.o
> >   objtool-y += builtin-orc.o
> > -objtool-y += check.o
> > -objtool-y += orc_gen.o
> > -objtool-y += orc_dump.o
> >   objtool-y += elf.o
> > -objtool-y += special.o
> >   objtool-y += objtool.o
> >   objtool-y += libstring.o
> > diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile
> > index 6b91388aecbb..12686e2f1a56 100644
> > --- a/tools/objtool/Makefile
> > +++ b/tools/objtool/Makefile
> > @@ -46,7 +46,16 @@ elfshdr := $(shell echo '$(pound)include <libelf.h>' | $(CC) $(CFLAGS) -x c -E -
> >   CFLAGS += $(if $(elfshdr),,-DLIBELF_USE_DEPRECATED)
> >   AWK = awk
> > -export srctree OUTPUT CFLAGS SRCARCH AWK
> > +
> > +SUBCMD_CHECK := n
> > +SUBCMD_ORC := n
> > +
> > +ifeq ($(SRCARCH),x86)
> > +	SUBCMD_CHECK := y
> > +	SUBCMD_ORC := y
> > +endif
> > +
> > +export srctree OUTPUT CFLAGS SRCARCH AWK SUBCMD_CHECK SUBCMD_ORC
> 
> Nit: I was thinking, since the list of SUBCMD_* is only going to grow
> maybe it would be nicer to have a single export line for the SUBCMD_*
> variables and leave the export line of [srctree..AWK] untouched.

That's a really good idea actually. Glad to see Josh included it in the
changed patch.

> 
> Just a suggestion, and only in case you respin this taking into account
> Josh's comment.
> 
> Otherwise things look good to me.

Thanks for all the reviews and good ideas!

Cheers,
    -Matt Helsley

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/3] objtool: Enable compilation of objtool for all architectures
  2020-05-20 14:16       ` Josh Poimboeuf
  2020-05-20 16:38         ` Matt Helsley
@ 2020-05-27 14:42         ` Kamalesh Babulal
  1 sibling, 0 replies; 14+ messages in thread
From: Kamalesh Babulal @ 2020-05-27 14:42 UTC (permalink / raw)
  To: Josh Poimboeuf, Matt Helsley
  Cc: linux-kernel, Peter Zijlstra, Julien Thierry, Miroslav Benes,
	Steven Rostedt

[...]

> From: Matt Helsley <mhelsley@vmware.com>
> Subject: [PATCH] objtool: Enable compilation of objtool for all architectures
> 
> Objtool currently only compiles for x86 architectures. This is
> fine as it presently does not support tooling for other
> architectures. However, we would like to be able to convert other
> kernel tools to run as objtool sub commands because they too
> process ELF object files. This will allow us to convert tools
> such as recordmcount to use objtool's ELF code.
> 
> Since much of recordmcount's ELF code is copy-paste code to/from
> a variety of other kernel tools (look at modpost for example) this
> means that if we can convert recordmcount we can convert more.
> 
> We define weak definitions for subcommand entry functions and other weak
> definitions for shared functions critical to building existing
> subcommands. These return 127 when the command is missing which signify
> tools that do not exist on all architectures.  In this case the "check"
> and "orc" tools do not exist on all architectures so we only add them
> for x86. Future changes adding support for "check", to arm64 for
> example, can then modify the SUBCMD_CHECK variable when building for
> arm64.
> 
> Objtool is not currently wired in to KConfig to be built for other
> architectures because it's not needed for those architectures and
> there are no commands it supports other than those for x86. As more
> command support is enabled on various architectures the necessary
> KConfig changes can be made (e.g. adding "STACK_VALIDATION") to
> trigger building objtool.
> 
> [ jpoimboe: remove aliases, add __weak macro, add error messages ]
> 
> Cc: Julien Thierry <jthierry@redhat.com>
> Signed-off-by: Matt Helsley <mhelsley@vmware.com>
> Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>


A minor nit-pick in objtool.h

Reviewed-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>

> ---
[...]

> diff --git a/tools/objtool/objtool.h b/tools/objtool/objtool.h
> index d89616b2ca39..528028a66816 100644
> --- a/tools/objtool/objtool.h
> +++ b/tools/objtool/objtool.h
> @@ -19,4 +19,9 @@ struct objtool_file {
>  	bool ignore_unreachables, c_file, hints, rodata;
>  };
> 
> +int check(const char *objname, bool orc);
> +int orc_dump(const char *objname);
> +int create_orc(struct objtool_file *file);
> +int create_orc_sections(struct objtool_file *file);
> +
>  #endif /* _OBJTOOL_H */

above hunk will not apply cleanly on patch 2 of the series, it expects
a new line after struct objtool which is missing in patch 2. 

-- 
Kamalesh

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] objtool: Move struct objtool_file into arch-independent header
  2020-05-19 20:55 ` [PATCH 2/3] objtool: Move struct objtool_file into arch-independent header Matt Helsley
  2020-05-20  8:04   ` Julien Thierry
@ 2020-05-27 14:43   ` Kamalesh Babulal
  1 sibling, 0 replies; 14+ messages in thread
From: Kamalesh Babulal @ 2020-05-27 14:43 UTC (permalink / raw)
  To: Matt Helsley, linux-kernel
  Cc: Josh Poimboeuf, Peter Zijlstra, Julien Thierry, Miroslav Benes,
	Steven Rostedt

On 5/20/20 2:25 AM, Matt Helsley wrote:
> The objtool_file structure describes the files objtool works on,
> is used by the check subcommand, and the check.h header is included
> by the orc subcommands so it's presently used by all subcommands.
> 
> Since the structure will be useful in all subcommands besides check,
> and some subcommands may not want to include check.h to get the
> definition, split the structure out into a new header meant for use
> by all objtool subcommands.
> 
> Signed-off-by: Matt Helsley <mhelsley@vmware.com>

Reviewed-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>

-- 
Kamalesh

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] objtool: Exit successfully when requesting help
  2020-05-19 20:55 ` [PATCH 1/3] objtool: Exit successfully when requesting help Matt Helsley
@ 2020-05-27 14:44   ` Kamalesh Babulal
  0 siblings, 0 replies; 14+ messages in thread
From: Kamalesh Babulal @ 2020-05-27 14:44 UTC (permalink / raw)
  To: Matt Helsley, linux-kernel
  Cc: Josh Poimboeuf, Peter Zijlstra, Julien Thierry, Miroslav Benes,
	Steven Rostedt

On 5/20/20 2:25 AM, Matt Helsley wrote:
> When the user requests help it's not an error so do not exit with
> a non-zero exit code. This is not especially useful for a user but
> any script that might wish to check that objtool --help is at least
> available can't rely on the exit code to crudely check that, for
> example, building an objtool executable succeeds.
> 
> Signed-off-by: Matt Helsley <mhelsley@vmware.com>

Reviewed-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>

-- 
Kamalesh

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2020-05-27 14:44 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-19 20:55 [PATCH 0/3] Enable objtool multiarch build Matt Helsley
2020-05-19 20:55 ` [PATCH 1/3] objtool: Exit successfully when requesting help Matt Helsley
2020-05-27 14:44   ` Kamalesh Babulal
2020-05-19 20:55 ` [PATCH 2/3] objtool: Move struct objtool_file into arch-independent header Matt Helsley
2020-05-20  8:04   ` Julien Thierry
2020-05-27 14:43   ` Kamalesh Babulal
2020-05-19 20:55 ` [PATCH 3/3] objtool: Enable compilation of objtool for all architectures Matt Helsley
2020-05-19 21:18   ` Josh Poimboeuf
2020-05-19 21:46     ` Matt Helsley
2020-05-20 14:16       ` Josh Poimboeuf
2020-05-20 16:38         ` Matt Helsley
2020-05-27 14:42         ` Kamalesh Babulal
2020-05-20  8:31   ` Julien Thierry
2020-05-20 16:41     ` Matt Helsley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).