Skip to content

Commit

Permalink
objtool: Enable compilation of objtool for all architectures
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Matt Helsley authored and Josh Poimboeuf committed May 20, 2020
1 parent d37c90d commit 0decf1f
Show file tree
Hide file tree
Showing 12 changed files with 73 additions and 34 deletions.
13 changes: 9 additions & 4 deletions tools/objtool/Build
Original file line number Diff line number Diff line change
@@ -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
Expand Down
10 changes: 10 additions & 0 deletions tools/objtool/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 3 additions & 1 deletion tools/objtool/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion tools/objtool/builtin-check.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
3 changes: 1 addition & 2 deletions tools/objtool/builtin-orc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 2 additions & 2 deletions tools/objtool/check.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
4 changes: 0 additions & 4 deletions tools/objtool/check.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down
5 changes: 5 additions & 0 deletions tools/objtool/objtool.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
18 changes: 0 additions & 18 deletions tools/objtool/orc.h

This file was deleted.

3 changes: 2 additions & 1 deletion tools/objtool/orc_dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 0 additions & 1 deletion tools/objtool/orc_gen.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
#include <stdlib.h>
#include <string.h>

#include "orc.h"
#include "check.h"
#include "warn.h"

Expand Down
40 changes: 40 additions & 0 deletions tools/objtool/weak.c
Original file line number Diff line number Diff line change
@@ -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(name) \
({ \
fprintf(stderr, "error: objtool: " name " 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");
}

0 comments on commit 0decf1f

Please sign in to comment.