mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-14 13:44:41 -05:00
When the kernel build fails due to an objtool segfault, the error
message is a bit obtuse and confusing:
make[5]: *** [scripts/Makefile.build:503: drivers/scsi/qla2xxx/qla2xxx.o] Error 139
^^^^^^^^^
make[5]: *** Deleting file 'drivers/scsi/qla2xxx/qla2xxx.o'
make[4]: *** [scripts/Makefile.build:556: drivers/scsi/qla2xxx] Error 2
make[3]: *** [scripts/Makefile.build:556: drivers/scsi] Error 2
make[2]: *** [scripts/Makefile.build:556: drivers] Error 2
make[1]: *** [/home/jpoimboe/git/linux/Makefile:2013: .] Error 2
make: *** [Makefile:248: __sub-make] Error 2
Add a signal handler to objtool which prints an error message like if
the local stack has overflown (for which there's a chance as objtool
makes heavy use of recursion):
drivers/scsi/qla2xxx/qla2xxx.o: error: SIGSEGV: objtool stack overflow!
or:
drivers/scsi/qla2xxx/qla2xxx.o: error: SIGSEGV: objtool crash!
Also, re-raise the signal so the core dump still gets triggered.
[ mingo: Applied a build fix, added more comments and prettified the code. ]
Suggested-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Alexandre Chartre <alexandre.chartre@oracle.com>
Cc: David Laight <david.laight.linux@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://patch.msgid.link/mi4tihk4dbncn7belrhp6ooudhpw4vdggerktu5333w3gqf3uf@vqlhc3y667mg
55 lines
1.2 KiB
C
55 lines
1.2 KiB
C
/* 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 <objtool/elf.h>
|
|
|
|
#define __weak __attribute__((weak))
|
|
|
|
struct pv_state {
|
|
bool clean;
|
|
struct list_head targets;
|
|
};
|
|
|
|
struct objtool_file {
|
|
struct elf *elf;
|
|
DECLARE_HASHTABLE(insn_hash, 20);
|
|
struct list_head retpoline_call_list;
|
|
struct list_head return_thunk_list;
|
|
struct list_head static_call_list;
|
|
struct list_head mcount_loc_list;
|
|
struct list_head endbr_list;
|
|
struct list_head call_list;
|
|
bool ignore_unreachables, hints, rodata, klp;
|
|
|
|
unsigned int nr_endbr;
|
|
unsigned int nr_endbr_int;
|
|
|
|
unsigned long jl_short, jl_long;
|
|
unsigned long jl_nop_short, jl_nop_long;
|
|
|
|
struct pv_state *pv_ops;
|
|
};
|
|
|
|
char *top_level_dir(const char *file);
|
|
|
|
int init_signal_handler(void);
|
|
|
|
struct objtool_file *objtool_open_read(const char *_objname);
|
|
|
|
int objtool_pv_add(struct objtool_file *file, int idx, struct symbol *func);
|
|
|
|
int check(struct objtool_file *file);
|
|
int orc_dump(const char *objname);
|
|
int orc_create(struct objtool_file *file);
|
|
|
|
#endif /* _OBJTOOL_H */
|