From nobody Sun Feb 8 03:57:03 2026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8FA021E8359; Tue, 1 Apr 2025 07:15:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743491724; cv=none; b=CVzPNn0ynqt0T/h/OmAdrAcwTgpBbrIg0Z075hRyz5QfvQ/YKjlGVw4tcTiz44FAz3pi0wAqGylveiJqLALrT5r+0ZIPxq1ZgjSdXD1NG/VMG7bGGlgv1lWHnu5n4GNI6Nokyymd3mEL3zhkYzzi04wc9w/25yR4ig7ehrPaUT4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743491724; c=relaxed/simple; bh=M3uLijVUcAgzDqAxtcgOyou6anfGPap9by8ZjQxaWnQ=; h=Date:From:To:Subject:Cc:In-Reply-To:References:MIME-Version: Message-ID:Content-Type; b=ZSjwP14AFfvCr9Ho0P6KVH0pst5xZqBrXrM5NbuksjQKV8kYvH4PRAx0+Y9pukb/2iEgK/VV4ZTZCXKw34KJUoRqupFkZrUMPe5Qebq1uGviEOxrUDM3Aiv1E30LeLn9VHV4C6IVKYZ6lt8f1susvcTFfhDr4I5Mg6y9sWEGbL4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=UmGypNmU; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=c0Wk11KH; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="UmGypNmU"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="c0Wk11KH" Date: Tue, 01 Apr 2025 07:15:18 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1743491718; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rHZ8xQ6TaItU8kP0ACPg5vRExff9ATpxGdJSSxUZ7fA=; b=UmGypNmUHjBYJ58HIi+2qs7cJz2VJ2qp76ERFbZ3j04wLdSjl1nBcI4CYV9b3Vfogqz2vs v52Ndjr5x2ejyfnJwr7VOsptKnEg8JFOzOrCo5JvBWGKBfIL/XxhJgHWeQhpm2akXuh6ds ydBN+s72qtpEPUJlVNkw+6z6NuYFEQB9dcOk533MHexKQHeKFdPowZ5PXPjaf+Y4oknDS9 ks/pdFE7+7A7yitwoLCF1Vj7S9EtYf0BY3avhiNjXoHmoNwa+bxkpIbKOxL/KZALZwY1CM 5NGM4kA5n4HqkUwFpVmVyKqNAyDz3IhGCGIEcUwqXqL2B9cTodKmHPnJspvMRQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1743491718; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rHZ8xQ6TaItU8kP0ACPg5vRExff9ATpxGdJSSxUZ7fA=; b=c0Wk11KH6M5ghHBJCPencwKSGv7744AdOoXCTSPe0/U1FX6DbP8AgFjILta6xM3yJ4tUOn Bmb9fKNNg1tnceDA== From: "tip-bot2 for Josh Poimboeuf" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: objtool/urgent] objtool: Change "warning:" to "error: " for fatal errors Cc: Josh Poimboeuf , Ingo Molnar , Linus Torvalds , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <0ea76f4b0e7a370711ed9f75fd0792bb5979c2bf.1743481539.git.jpoimboe@kernel.org> References: <0ea76f4b0e7a370711ed9f75fd0792bb5979c2bf.1743481539.git.jpoimboe@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-ID: <174349171809.14745.102469800588565702.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Precedence: bulk Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The following commit has been merged into the objtool/urgent branch of tip: Commit-ID: 3e7be635937d19b91bab70695328214a3d789d51 Gitweb: https://git.kernel.org/tip/3e7be635937d19b91bab70695328214a3= d789d51 Author: Josh Poimboeuf AuthorDate: Mon, 31 Mar 2025 21:26:41 -07:00 Committer: Ingo Molnar CommitterDate: Tue, 01 Apr 2025 09:07:13 +02:00 objtool: Change "warning:" to "error: " for fatal errors This is similar to GCC's behavior and makes it more obvious why the build failed. Signed-off-by: Josh Poimboeuf Signed-off-by: Ingo Molnar Cc: Linus Torvalds Link: https://lore.kernel.org/r/0ea76f4b0e7a370711ed9f75fd0792bb5979c2bf.17= 43481539.git.jpoimboe@kernel.org --- tools/objtool/arch/loongarch/decode.c | 14 +- tools/objtool/arch/loongarch/orc.c | 8 +- tools/objtool/arch/x86/decode.c | 15 +-- tools/objtool/arch/x86/orc.c | 6 +- tools/objtool/builtin-check.c | 30 ++--- tools/objtool/check.c | 127 +++++++++------------ tools/objtool/elf.c | 150 +++++++++++-------------- tools/objtool/include/objtool/warn.h | 51 ++++++--- tools/objtool/objtool.c | 4 +- tools/objtool/orc_dump.c | 30 ++--- tools/objtool/special.c | 13 +-- 11 files changed, 226 insertions(+), 222 deletions(-) diff --git a/tools/objtool/arch/loongarch/decode.c b/tools/objtool/arch/loo= ngarch/decode.c index 02e4905..b6fdc68 100644 --- a/tools/objtool/arch/loongarch/decode.c +++ b/tools/objtool/arch/loongarch/decode.c @@ -63,7 +63,7 @@ static bool is_loongarch(const struct elf *elf) if (elf->ehdr.e_machine =3D=3D EM_LOONGARCH) return true; =20 - WARN("unexpected ELF machine type %d", elf->ehdr.e_machine); + ERROR("unexpected ELF machine type %d", elf->ehdr.e_machine); return false; } =20 @@ -327,8 +327,10 @@ const char *arch_nop_insn(int len) { static u32 nop; =20 - if (len !=3D LOONGARCH_INSN_SIZE) - WARN("invalid NOP size: %d\n", len); + if (len !=3D LOONGARCH_INSN_SIZE) { + ERROR("invalid NOP size: %d\n", len); + return NULL; + } =20 nop =3D LOONGARCH_INSN_NOP; =20 @@ -339,8 +341,10 @@ const char *arch_ret_insn(int len) { static u32 ret; =20 - if (len !=3D LOONGARCH_INSN_SIZE) - WARN("invalid RET size: %d\n", len); + if (len !=3D LOONGARCH_INSN_SIZE) { + ERROR("invalid RET size: %d\n", len); + return NULL; + } =20 emit_jirl((union loongarch_instruction *)&ret, LOONGARCH_GPR_RA, LOONGARC= H_GPR_ZERO, 0); =20 diff --git a/tools/objtool/arch/loongarch/orc.c b/tools/objtool/arch/loonga= rch/orc.c index 873536d..b58c5ff 100644 --- a/tools/objtool/arch/loongarch/orc.c +++ b/tools/objtool/arch/loongarch/orc.c @@ -41,7 +41,7 @@ int init_orc_entry(struct orc_entry *orc, struct cfi_stat= e *cfi, struct instruct orc->type =3D ORC_TYPE_REGS_PARTIAL; break; default: - WARN_INSN(insn, "unknown unwind hint type %d", cfi->type); + ERROR_INSN(insn, "unknown unwind hint type %d", cfi->type); return -1; } =20 @@ -55,7 +55,7 @@ int init_orc_entry(struct orc_entry *orc, struct cfi_stat= e *cfi, struct instruct orc->sp_reg =3D ORC_REG_FP; break; default: - WARN_INSN(insn, "unknown CFA base reg %d", cfi->cfa.base); + ERROR_INSN(insn, "unknown CFA base reg %d", cfi->cfa.base); return -1; } =20 @@ -72,7 +72,7 @@ int init_orc_entry(struct orc_entry *orc, struct cfi_stat= e *cfi, struct instruct orc->fp_reg =3D ORC_REG_FP; break; default: - WARN_INSN(insn, "unknown FP base reg %d", fp->base); + ERROR_INSN(insn, "unknown FP base reg %d", fp->base); return -1; } =20 @@ -89,7 +89,7 @@ int init_orc_entry(struct orc_entry *orc, struct cfi_stat= e *cfi, struct instruct orc->ra_reg =3D ORC_REG_FP; break; default: - WARN_INSN(insn, "unknown RA base reg %d", ra->base); + ERROR_INSN(insn, "unknown RA base reg %d", ra->base); return -1; } =20 diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decod= e.c index 7567c89..33d861c 100644 --- a/tools/objtool/arch/x86/decode.c +++ b/tools/objtool/arch/x86/decode.c @@ -36,7 +36,7 @@ static int is_x86_64(const struct elf *elf) case EM_386: return 0; default: - WARN("unexpected ELF machine type %d", elf->ehdr.e_machine); + ERROR("unexpected ELF machine type %d", elf->ehdr.e_machine); return -1; } } @@ -173,7 +173,7 @@ int arch_decode_instruction(struct objtool_file *file, = const struct section *sec ret =3D insn_decode(&ins, sec->data->d_buf + offset, maxlen, x86_64 ? INSN_MODE_64 : INSN_MODE_32); if (ret < 0) { - WARN("can't decode instruction at %s:0x%lx", sec->name, offset); + ERROR("can't decode instruction at %s:0x%lx", sec->name, offset); return -1; } =20 @@ -321,7 +321,7 @@ int arch_decode_instruction(struct objtool_file *file, = const struct section *sec break; =20 default: - /* WARN ? */ + /* ERROR ? */ break; } =20 @@ -561,8 +561,7 @@ int arch_decode_instruction(struct objtool_file *file, = const struct section *sec if (ins.prefixes.nbytes =3D=3D 1 && ins.prefixes.bytes[0] =3D=3D 0xf2) { /* ENQCMD cannot be used in the kernel. */ - WARN("ENQCMD instruction at %s:%lx", sec->name, - offset); + WARN("ENQCMD instruction at %s:%lx", sec->name, offset); } =20 } else if (op2 =3D=3D 0xa0 || op2 =3D=3D 0xa8) { @@ -646,7 +645,7 @@ int arch_decode_instruction(struct objtool_file *file, = const struct section *sec if (disp->sym->type =3D=3D STT_SECTION) func =3D find_symbol_by_offset(disp->sym->sec, reloc_addend(disp)); if (!func) { - WARN("no func for pv_ops[]"); + ERROR("no func for pv_ops[]"); return -1; } =20 @@ -776,7 +775,7 @@ const char *arch_nop_insn(int len) }; =20 if (len < 1 || len > 5) { - WARN("invalid NOP size: %d\n", len); + ERROR("invalid NOP size: %d\n", len); return NULL; } =20 @@ -796,7 +795,7 @@ const char *arch_ret_insn(int len) }; =20 if (len < 1 || len > 5) { - WARN("invalid RET size: %d\n", len); + ERROR("invalid RET size: %d\n", len); return NULL; } =20 diff --git a/tools/objtool/arch/x86/orc.c b/tools/objtool/arch/x86/orc.c index b6cd943..7176b9e 100644 --- a/tools/objtool/arch/x86/orc.c +++ b/tools/objtool/arch/x86/orc.c @@ -40,7 +40,7 @@ int init_orc_entry(struct orc_entry *orc, struct cfi_stat= e *cfi, struct instruct orc->type =3D ORC_TYPE_REGS_PARTIAL; break; default: - WARN_INSN(insn, "unknown unwind hint type %d", cfi->type); + ERROR_INSN(insn, "unknown unwind hint type %d", cfi->type); return -1; } =20 @@ -72,7 +72,7 @@ int init_orc_entry(struct orc_entry *orc, struct cfi_stat= e *cfi, struct instruct orc->sp_reg =3D ORC_REG_DX; break; default: - WARN_INSN(insn, "unknown CFA base reg %d", cfi->cfa.base); + ERROR_INSN(insn, "unknown CFA base reg %d", cfi->cfa.base); return -1; } =20 @@ -87,7 +87,7 @@ int init_orc_entry(struct orc_entry *orc, struct cfi_stat= e *cfi, struct instruct orc->bp_reg =3D ORC_REG_BP; break; default: - WARN_INSN(insn, "unknown BP base reg %d", bp->base); + ERROR_INSN(insn, "unknown BP base reg %d", bp->base); return -1; } =20 diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c index e364ab6..8023984 100644 --- a/tools/objtool/builtin-check.c +++ b/tools/objtool/builtin-check.c @@ -139,22 +139,22 @@ int cmd_parse_options(int argc, const char **argv, co= nst char * const usage[]) static bool opts_valid(void) { if (opts.mnop && !opts.mcount) { - WARN("--mnop requires --mcount"); + ERROR("--mnop requires --mcount"); return false; } =20 if (opts.noinstr && !opts.link) { - WARN("--noinstr requires --link"); + ERROR("--noinstr requires --link"); return false; } =20 if (opts.ibt && !opts.link) { - WARN("--ibt requires --link"); + ERROR("--ibt requires --link"); return false; } =20 if (opts.unret && !opts.link) { - WARN("--unret requires --link"); + ERROR("--unret requires --link"); return false; } =20 @@ -171,7 +171,7 @@ static bool opts_valid(void) opts.static_call || opts.uaccess) { if (opts.dump_orc) { - WARN("--dump can't be combined with other actions"); + ERROR("--dump can't be combined with other actions"); return false; } =20 @@ -181,7 +181,7 @@ static bool opts_valid(void) if (opts.dump_orc) return true; =20 - WARN("At least one action required"); + ERROR("At least one action required"); return false; } =20 @@ -194,30 +194,30 @@ static int copy_file(const char *src, const char *dst) =20 src_fd =3D open(src, O_RDONLY); if (src_fd =3D=3D -1) { - WARN("can't open %s for reading: %s", src, strerror(errno)); + ERROR("can't open %s for reading: %s", src, strerror(errno)); return 1; } =20 dst_fd =3D open(dst, O_WRONLY | O_CREAT | O_TRUNC, 0400); if (dst_fd =3D=3D -1) { - WARN("can't open %s for writing: %s", dst, strerror(errno)); + ERROR("can't open %s for writing: %s", dst, strerror(errno)); return 1; } =20 if (fstat(src_fd, &stat) =3D=3D -1) { - WARN_GLIBC("fstat"); + ERROR_GLIBC("fstat"); return 1; } =20 if (fchmod(dst_fd, stat.st_mode) =3D=3D -1) { - WARN_GLIBC("fchmod"); + ERROR_GLIBC("fchmod"); return 1; } =20 for (to_copy =3D stat.st_size; to_copy > 0; to_copy -=3D copied) { copied =3D sendfile(dst_fd, src_fd, &offset, to_copy); if (copied =3D=3D -1) { - WARN_GLIBC("sendfile"); + ERROR_GLIBC("sendfile"); return 1; } } @@ -231,14 +231,14 @@ static void save_argv(int argc, const char **argv) { orig_argv =3D calloc(argc, sizeof(char *)); if (!orig_argv) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); exit(1); } =20 for (int i =3D 0; i < argc; i++) { orig_argv[i] =3D strdup(argv[i]); if (!orig_argv[i]) { - WARN_GLIBC("strdup(%s)", argv[i]); + ERROR_GLIBC("strdup(%s)", argv[i]); exit(1); } }; @@ -257,7 +257,7 @@ void print_args(void) */ backup =3D malloc(strlen(objname) + strlen(ORIG_SUFFIX) + 1); if (!backup) { - WARN_GLIBC("malloc"); + ERROR_GLIBC("malloc"); goto print; } =20 @@ -319,7 +319,7 @@ int objtool_run(int argc, const char **argv) return 1; =20 if (!opts.link && has_multiple_files(file->elf)) { - WARN("Linked object requires --link"); + ERROR("Linked object requires --link"); return 1; } =20 diff --git a/tools/objtool/check.c b/tools/objtool/check.c index cde6699..ff83be1 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -348,7 +348,7 @@ static struct cfi_state *cfi_alloc(void) { struct cfi_state *cfi =3D calloc(1, sizeof(struct cfi_state)); if (!cfi) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); exit(1); } nr_cfi++; @@ -404,7 +404,7 @@ static void *cfi_hash_alloc(unsigned long size) PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); if (cfi_hash =3D=3D (void *)-1L) { - WARN_GLIBC("mmap fail cfi_hash"); + ERROR_GLIBC("mmap fail cfi_hash"); cfi_hash =3D NULL; } else if (opts.stats) { printf("cfi_bits: %d\n", cfi_bits); @@ -460,7 +460,7 @@ static int decode_instructions(struct objtool_file *fil= e) if (!insns || idx =3D=3D INSN_CHUNK_MAX) { insns =3D calloc(sizeof(*insn), INSN_CHUNK_SIZE); if (!insns) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return -1; } idx =3D 0; @@ -495,8 +495,6 @@ static int decode_instructions(struct objtool_file *fil= e) nr_insns++; } =20 -// printf("%s: last chunk used: %d\n", sec->name, (int)idx); - sec_for_each_sym(sec, func) { if (func->type !=3D STT_NOTYPE && func->type !=3D STT_FUNC) continue; @@ -505,8 +503,7 @@ static int decode_instructions(struct objtool_file *fil= e) /* Heuristic: likely an "end" symbol */ if (func->type =3D=3D STT_NOTYPE) continue; - WARN("%s(): STT_FUNC at end of section", - func->name); + ERROR("%s(): STT_FUNC at end of section", func->name); return -1; } =20 @@ -514,8 +511,7 @@ static int decode_instructions(struct objtool_file *fil= e) continue; =20 if (!find_insn(file, sec, func->offset)) { - WARN("%s(): can't find starting instruction", - func->name); + ERROR("%s(): can't find starting instruction", func->name); return -1; } =20 @@ -569,9 +565,8 @@ static int add_pv_ops(struct objtool_file *file, const = char *symname) func =3D find_symbol_by_offset(reloc->sym->sec, reloc_addend(reloc)); if (!func) { - WARN_FUNC("can't find func at %s[%d]", - reloc->sym->sec, reloc_addend(reloc), - symname, idx); + ERROR_FUNC(reloc->sym->sec, reloc_addend(reloc), + "can't find func at %s[%d]", symname, idx); return -1; } =20 @@ -614,7 +609,7 @@ static int init_pv_ops(struct objtool_file *file) nr =3D sym->len / sizeof(unsigned long); file->pv_ops =3D calloc(sizeof(struct pv_state), nr); if (!file->pv_ops) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return -1; } =20 @@ -673,12 +668,12 @@ static int create_static_call_sections(struct objtool= _file *file) /* find key symbol */ key_name =3D strdup(insn_call_dest(insn)->name); if (!key_name) { - WARN_GLIBC("strdup"); + ERROR_GLIBC("strdup"); return -1; } if (strncmp(key_name, STATIC_CALL_TRAMP_PREFIX_STR, STATIC_CALL_TRAMP_PREFIX_LEN)) { - WARN("static_call: trampoline name malformed: %s", key_name); + ERROR("static_call: trampoline name malformed: %s", key_name); return -1; } tmp =3D key_name + STATIC_CALL_TRAMP_PREFIX_LEN - STATIC_CALL_KEY_PREFIX= _LEN; @@ -687,7 +682,7 @@ static int create_static_call_sections(struct objtool_f= ile *file) key_sym =3D find_symbol_by_name(file->elf, tmp); if (!key_sym) { if (!opts.module) { - WARN("static_call: can't find static_call_key symbol: %s", tmp); + ERROR("static_call: can't find static_call_key symbol: %s", tmp); return -1; } =20 @@ -833,8 +828,8 @@ static int create_ibt_endbr_seal_sections(struct objtoo= l_file *file) insn->offset =3D=3D sym->offset && (!strcmp(sym->name, "init_module") || !strcmp(sym->name, "cleanup_module"))) { - WARN("%s(): Magic init_module() function name is deprecated, use module= _init(fn) instead", - sym->name); + ERROR("%s(): Magic init_module() function name is deprecated, use modul= e_init(fn) instead", + sym->name); return -1; } =20 @@ -1008,8 +1003,8 @@ static int add_ignores(struct objtool_file *file) break; =20 default: - WARN("unexpected relocation symbol type in %s: %d", - rsec->name, reloc->sym->type); + ERROR("unexpected relocation symbol type in %s: %d", + rsec->name, reloc->sym->type); return -1; } =20 @@ -1559,8 +1554,8 @@ static int add_jump_destinations(struct objtool_file = *file) dest_off =3D=3D func->offset + func->len) continue; =20 - WARN_INSN(insn, "can't find jump dest instruction at %s+0x%lx", - dest_sec->name, dest_off); + ERROR_INSN(insn, "can't find jump dest instruction at %s+0x%lx", + dest_sec->name, dest_off); return -1; } =20 @@ -1666,12 +1661,12 @@ static int add_call_destinations(struct objtool_fil= e *file) continue; =20 if (!insn_call_dest(insn)) { - WARN_INSN(insn, "unannotated intra-function call"); + ERROR_INSN(insn, "unannotated intra-function call"); return -1; } =20 if (func && insn_call_dest(insn)->type !=3D STT_FUNC) { - WARN_INSN(insn, "unsupported call to non-function"); + ERROR_INSN(insn, "unsupported call to non-function"); return -1; } =20 @@ -1679,8 +1674,8 @@ static int add_call_destinations(struct objtool_file = *file) dest_off =3D arch_dest_reloc_offset(reloc_addend(reloc)); dest =3D find_call_destination(reloc->sym->sec, dest_off); if (!dest) { - WARN_INSN(insn, "can't find call dest symbol at %s+0x%lx", - reloc->sym->sec->name, dest_off); + ERROR_INSN(insn, "can't find call dest symbol at %s+0x%lx", + reloc->sym->sec->name, dest_off); return -1; } =20 @@ -1722,13 +1717,13 @@ static int handle_group_alt(struct objtool_file *fi= le, =20 orig_alt_group =3D calloc(1, sizeof(*orig_alt_group)); if (!orig_alt_group) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return -1; } orig_alt_group->cfi =3D calloc(special_alt->orig_len, sizeof(struct cfi_state *)); if (!orig_alt_group->cfi) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return -1; } =20 @@ -1748,18 +1743,18 @@ static int handle_group_alt(struct objtool_file *fi= le, } else { if (orig_alt_group->last_insn->offset + orig_alt_group->last_insn->len - orig_alt_group->first_insn->offset !=3D special_alt->orig_len) { - WARN_INSN(orig_insn, "weirdly overlapping alternative! %ld !=3D %d", - orig_alt_group->last_insn->offset + - orig_alt_group->last_insn->len - - orig_alt_group->first_insn->offset, - special_alt->orig_len); + ERROR_INSN(orig_insn, "weirdly overlapping alternative! %ld !=3D %d", + orig_alt_group->last_insn->offset + + orig_alt_group->last_insn->len - + orig_alt_group->first_insn->offset, + special_alt->orig_len); return -1; } } =20 new_alt_group =3D calloc(1, sizeof(*new_alt_group)); if (!new_alt_group) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return -1; } =20 @@ -1773,7 +1768,7 @@ static int handle_group_alt(struct objtool_file *file, */ nop =3D calloc(1, sizeof(*nop)); if (!nop) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return -1; } memset(nop, 0, sizeof(*nop)); @@ -1815,7 +1810,7 @@ static int handle_group_alt(struct objtool_file *file, if (alt_reloc && arch_pc_relative_reloc(alt_reloc) && !arch_support_alt_relocation(special_alt, insn, alt_reloc)) { =20 - WARN_INSN(insn, "unsupported relocation in alternatives section"); + ERROR_INSN(insn, "unsupported relocation in alternatives section"); return -1; } =20 @@ -1829,15 +1824,15 @@ static int handle_group_alt(struct objtool_file *fi= le, if (dest_off =3D=3D special_alt->new_off + special_alt->new_len) { insn->jump_dest =3D next_insn_same_sec(file, orig_alt_group->last_insn); if (!insn->jump_dest) { - WARN_INSN(insn, "can't find alternative jump destination"); + ERROR_INSN(insn, "can't find alternative jump destination"); return -1; } } } =20 if (!last_new_insn) { - WARN_FUNC("can't find last new alternative instruction", - special_alt->new_sec, special_alt->new_off); + ERROR_FUNC(special_alt->new_sec, special_alt->new_off, + "can't find last new alternative instruction"); return -1; } =20 @@ -1864,7 +1859,7 @@ static int handle_jump_alt(struct objtool_file *file, if (orig_insn->type !=3D INSN_JUMP_UNCONDITIONAL && orig_insn->type !=3D INSN_NOP) { =20 - WARN_INSN(orig_insn, "unsupported instruction at jump label"); + ERROR_INSN(orig_insn, "unsupported instruction at jump label"); return -1; } =20 @@ -1923,8 +1918,8 @@ static int add_special_section_alts(struct objtool_fi= le *file) orig_insn =3D find_insn(file, special_alt->orig_sec, special_alt->orig_off); if (!orig_insn) { - WARN_FUNC("special: can't find orig instruction", - special_alt->orig_sec, special_alt->orig_off); + ERROR_FUNC(special_alt->orig_sec, special_alt->orig_off, + "special: can't find orig instruction"); return -1; } =20 @@ -1933,16 +1928,15 @@ static int add_special_section_alts(struct objtool_= file *file) new_insn =3D find_insn(file, special_alt->new_sec, special_alt->new_off); if (!new_insn) { - WARN_FUNC("special: can't find new instruction", - special_alt->new_sec, - special_alt->new_off); + ERROR_FUNC(special_alt->new_sec, special_alt->new_off, + "special: can't find new instruction"); return -1; } } =20 if (special_alt->group) { if (!special_alt->orig_len) { - WARN_INSN(orig_insn, "empty alternative entry"); + ERROR_INSN(orig_insn, "empty alternative entry"); continue; } =20 @@ -1960,7 +1954,7 @@ static int add_special_section_alts(struct objtool_fi= le *file) =20 alt =3D calloc(1, sizeof(*alt)); if (!alt) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return -1; } =20 @@ -2037,7 +2031,7 @@ static int add_jump_table(struct objtool_file *file, = struct instruction *insn) =20 alt =3D calloc(1, sizeof(*alt)); if (!alt) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return -1; } =20 @@ -2049,7 +2043,7 @@ next: } =20 if (!prev_offset) { - WARN_INSN(insn, "can't find switch jump table"); + ERROR_INSN(insn, "can't find switch jump table"); return -1; } =20 @@ -2207,12 +2201,12 @@ static int read_unwind_hints(struct objtool_file *f= ile) return 0; =20 if (!sec->rsec) { - WARN("missing .rela.discard.unwind_hints section"); + ERROR("missing .rela.discard.unwind_hints section"); return -1; } =20 if (sec->sh.sh_size % sizeof(struct unwind_hint)) { - WARN("struct unwind_hint size mismatch"); + ERROR("struct unwind_hint size mismatch"); return -1; } =20 @@ -2223,7 +2217,7 @@ static int read_unwind_hints(struct objtool_file *fil= e) =20 reloc =3D find_reloc_by_dest(file->elf, sec, i * sizeof(*hint)); if (!reloc) { - WARN("can't find reloc for unwind_hints[%d]", i); + ERROR("can't find reloc for unwind_hints[%d]", i); return -1; } =20 @@ -2232,13 +2226,13 @@ static int read_unwind_hints(struct objtool_file *f= ile) } else if (reloc->sym->local_label) { offset =3D reloc->sym->offset; } else { - WARN("unexpected relocation symbol type in %s", sec->rsec->name); + ERROR("unexpected relocation symbol type in %s", sec->rsec->name); return -1; } =20 insn =3D find_insn(file, reloc->sym->sec, offset); if (!insn) { - WARN("can't find insn for unwind_hints[%d]", i); + ERROR("can't find insn for unwind_hints[%d]", i); return -1; } =20 @@ -2265,7 +2259,7 @@ static int read_unwind_hints(struct objtool_file *fil= e) =20 if (sym && sym->bind =3D=3D STB_GLOBAL) { if (opts.ibt && insn->type !=3D INSN_ENDBR && !insn->noendbr) { - WARN_INSN(insn, "UNWIND_HINT_IRET_REGS without ENDBR"); + ERROR_INSN(insn, "UNWIND_HINT_IRET_REGS without ENDBR"); return -1; } } @@ -2280,7 +2274,7 @@ static int read_unwind_hints(struct objtool_file *fil= e) cfi =3D *(insn->cfi); =20 if (arch_decode_hint_reg(hint->sp_reg, &cfi.cfa.base)) { - WARN_INSN(insn, "unsupported unwind_hint sp base reg %d", hint->sp_reg); + ERROR_INSN(insn, "unsupported unwind_hint sp base reg %d", hint->sp_reg= ); return -1; } =20 @@ -2326,7 +2320,7 @@ static int read_annotate(struct objtool_file *file, insn =3D find_insn(file, reloc->sym->sec, offset); =20 if (!insn) { - WARN("bad .discard.annotate_insn entry: %d of type %d", reloc_idx(reloc= ), type); + ERROR("bad .discard.annotate_insn entry: %d of type %d", reloc_idx(relo= c), type); return -1; } =20 @@ -2369,7 +2363,7 @@ static int __annotate_ifc(struct objtool_file *file, = int type, struct instructio return 0; =20 if (insn->type !=3D INSN_CALL) { - WARN_INSN(insn, "intra_function_call not a direct call"); + ERROR_INSN(insn, "intra_function_call not a direct call"); return -1; } =20 @@ -2383,8 +2377,8 @@ static int __annotate_ifc(struct objtool_file *file, = int type, struct instructio dest_off =3D arch_jump_destination(insn); insn->jump_dest =3D find_insn(file, insn->sec, dest_off); if (!insn->jump_dest) { - WARN_INSN(insn, "can't find call dest at %s+0x%lx", - insn->sec->name, dest_off); + ERROR_INSN(insn, "can't find call dest at %s+0x%lx", + insn->sec->name, dest_off); return -1; } =20 @@ -2403,7 +2397,7 @@ static int __annotate_late(struct objtool_file *file,= int type, struct instructi insn->type !=3D INSN_CALL_DYNAMIC && insn->type !=3D INSN_RETURN && insn->type !=3D INSN_NOP) { - WARN_INSN(insn, "retpoline_safe hint not an indirect jump/call/ret/nop"= ); + ERROR_INSN(insn, "retpoline_safe hint not an indirect jump/call/ret/nop= "); return -1; } =20 @@ -2435,7 +2429,7 @@ static int __annotate_late(struct objtool_file *file,= int type, struct instructi break; =20 default: - WARN_INSN(insn, "Unknown annotation type: %d", type); + ERROR_INSN(insn, "Unknown annotation type: %d", type); return -1; } =20 @@ -4393,9 +4387,8 @@ static int validate_ibt_data_reloc(struct objtool_fil= e *file, if (dest->noendbr) return 0; =20 - WARN_FUNC("data relocation to !ENDBR: %s", - reloc->sec->base, reloc_offset(reloc), - offstr(dest->sec, dest->offset)); + WARN_FUNC(reloc->sec->base, reloc_offset(reloc), + "data relocation to !ENDBR: %s", offstr(dest->sec, dest->offset)); =20 return 1; } @@ -4580,14 +4573,14 @@ static void disas_warned_funcs(struct objtool_file = *file) if (!funcs) { funcs =3D malloc(strlen(sym->name) + 1); if (!funcs) { - WARN_GLIBC("malloc"); + ERROR_GLIBC("malloc"); return; } strcpy(funcs, sym->name); } else { tmp =3D malloc(strlen(funcs) + strlen(sym->name) + 2); if (!tmp) { - WARN_GLIBC("malloc"); + ERROR_GLIBC("malloc"); return; } sprintf(tmp, "%s %s", funcs, sym->name); diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c index b352a78..727a3a4 100644 --- a/tools/objtool/elf.c +++ b/tools/objtool/elf.c @@ -72,17 +72,17 @@ static inline void __elf_hash_del(struct elf_hash_node = *node, obj; \ obj =3D elf_list_entry(obj->member.next, typeof(*(obj)), member)) =20 -#define elf_alloc_hash(name, size) \ -({ \ - __elf_bits(name) =3D max(10, ilog2(size)); \ +#define elf_alloc_hash(name, size) \ +({ \ + __elf_bits(name) =3D max(10, ilog2(size)); \ __elf_table(name) =3D mmap(NULL, sizeof(struct elf_hash_node *) << __elf_= bits(name), \ - PROT_READ|PROT_WRITE, \ - MAP_PRIVATE|MAP_ANON, -1, 0); \ - if (__elf_table(name) =3D=3D (void *)-1L) { \ - WARN("mmap fail " #name); \ - __elf_table(name) =3D NULL; \ - } \ - __elf_table(name); \ + PROT_READ|PROT_WRITE, \ + MAP_PRIVATE|MAP_ANON, -1, 0); \ + if (__elf_table(name) =3D=3D (void *)-1L) { \ + ERROR_GLIBC("mmap fail " #name); \ + __elf_table(name) =3D NULL; \ + } \ + __elf_table(name); \ }) =20 static inline unsigned long __sym_start(struct symbol *s) @@ -316,12 +316,12 @@ static int read_sections(struct elf *elf) int i; =20 if (elf_getshdrnum(elf->elf, §ions_nr)) { - WARN_ELF("elf_getshdrnum"); + ERROR_ELF("elf_getshdrnum"); return -1; } =20 if (elf_getshdrstrndx(elf->elf, &shstrndx)) { - WARN_ELF("elf_getshdrstrndx"); + ERROR_ELF("elf_getshdrstrndx"); return -1; } =20 @@ -331,7 +331,7 @@ static int read_sections(struct elf *elf) =20 elf->section_data =3D calloc(sections_nr, sizeof(*sec)); if (!elf->section_data) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return -1; } for (i =3D 0; i < sections_nr; i++) { @@ -341,33 +341,32 @@ static int read_sections(struct elf *elf) =20 s =3D elf_getscn(elf->elf, i); if (!s) { - WARN_ELF("elf_getscn"); + ERROR_ELF("elf_getscn"); return -1; } =20 sec->idx =3D elf_ndxscn(s); =20 if (!gelf_getshdr(s, &sec->sh)) { - WARN_ELF("gelf_getshdr"); + ERROR_ELF("gelf_getshdr"); return -1; } =20 sec->name =3D elf_strptr(elf->elf, shstrndx, sec->sh.sh_name); if (!sec->name) { - WARN_ELF("elf_strptr"); + ERROR_ELF("elf_strptr"); return -1; } =20 if (sec->sh.sh_size !=3D 0 && !is_dwarf_section(sec)) { sec->data =3D elf_getdata(s, NULL); if (!sec->data) { - WARN_ELF("elf_getdata"); + ERROR_ELF("elf_getdata"); return -1; } if (sec->data->d_off !=3D 0 || sec->data->d_size !=3D sec->sh.sh_size) { - WARN("unexpected data attributes for %s", - sec->name); + ERROR("unexpected data attributes for %s", sec->name); return -1; } } @@ -387,7 +386,7 @@ static int read_sections(struct elf *elf) =20 /* sanity check, one more call to elf_nextscn() should return NULL */ if (elf_nextscn(elf->elf, s)) { - WARN("section entry mismatch"); + ERROR("section entry mismatch"); return -1; } =20 @@ -467,7 +466,7 @@ static int read_symbols(struct elf *elf) =20 elf->symbol_data =3D calloc(symbols_nr, sizeof(*sym)); if (!elf->symbol_data) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return -1; } for (i =3D 0; i < symbols_nr; i++) { @@ -477,14 +476,14 @@ static int read_symbols(struct elf *elf) =20 if (!gelf_getsymshndx(symtab->data, shndx_data, i, &sym->sym, &shndx)) { - WARN_ELF("gelf_getsymshndx"); + ERROR_ELF("gelf_getsymshndx"); goto err; } =20 sym->name =3D elf_strptr(elf->elf, symtab->sh.sh_link, sym->sym.st_name); if (!sym->name) { - WARN_ELF("elf_strptr"); + ERROR_ELF("elf_strptr"); goto err; } =20 @@ -496,8 +495,7 @@ static int read_symbols(struct elf *elf) =20 sym->sec =3D find_section_by_index(elf, shndx); if (!sym->sec) { - WARN("couldn't find section for symbol %s", - sym->name); + ERROR("couldn't find section for symbol %s", sym->name); goto err; } if (GELF_ST_TYPE(sym->sym.st_info) =3D=3D STT_SECTION) { @@ -536,8 +534,7 @@ static int read_symbols(struct elf *elf) pnamelen =3D coldstr - sym->name; pname =3D strndup(sym->name, pnamelen); if (!pname) { - WARN("%s(): failed to allocate memory", - sym->name); + ERROR("%s(): failed to allocate memory", sym->name); return -1; } =20 @@ -545,8 +542,7 @@ static int read_symbols(struct elf *elf) free(pname); =20 if (!pfunc) { - WARN("%s(): can't find parent function", - sym->name); + ERROR("%s(): can't find parent function", sym->name); return -1; } =20 @@ -613,14 +609,14 @@ static int elf_update_symbol(struct elf *elf, struct = section *symtab, =20 s =3D elf_getscn(elf->elf, symtab->idx); if (!s) { - WARN_ELF("elf_getscn"); + ERROR_ELF("elf_getscn"); return -1; } =20 if (symtab_shndx) { t =3D elf_getscn(elf->elf, symtab_shndx->idx); if (!t) { - WARN_ELF("elf_getscn"); + ERROR_ELF("elf_getscn"); return -1; } } @@ -643,7 +639,7 @@ static int elf_update_symbol(struct elf *elf, struct se= ction *symtab, =20 if (idx) { /* we don't do holes in symbol tables */ - WARN("index out of range"); + ERROR("index out of range"); return -1; } =20 @@ -654,7 +650,7 @@ static int elf_update_symbol(struct elf *elf, struct se= ction *symtab, =20 buf =3D calloc(num, entsize); if (!buf) { - WARN("malloc"); + ERROR_GLIBC("calloc"); return -1; } =20 @@ -669,7 +665,7 @@ static int elf_update_symbol(struct elf *elf, struct se= ction *symtab, if (t) { buf =3D calloc(num, sizeof(Elf32_Word)); if (!buf) { - WARN("malloc"); + ERROR_GLIBC("calloc"); return -1; } =20 @@ -687,7 +683,7 @@ static int elf_update_symbol(struct elf *elf, struct se= ction *symtab, =20 /* empty blocks should not happen */ if (!symtab_data->d_size) { - WARN("zero size data"); + ERROR("zero size data"); return -1; } =20 @@ -702,7 +698,7 @@ static int elf_update_symbol(struct elf *elf, struct se= ction *symtab, =20 /* something went side-ways */ if (idx < 0) { - WARN("negative index"); + ERROR("negative index"); return -1; } =20 @@ -714,13 +710,13 @@ static int elf_update_symbol(struct elf *elf, struct = section *symtab, } else { sym->sym.st_shndx =3D SHN_XINDEX; if (!shndx_data) { - WARN("no .symtab_shndx"); + ERROR("no .symtab_shndx"); return -1; } } =20 if (!gelf_update_symshndx(symtab_data, shndx_data, idx, &sym->sym, shndx)= ) { - WARN_ELF("gelf_update_symshndx"); + ERROR_ELF("gelf_update_symshndx"); return -1; } =20 @@ -738,7 +734,7 @@ __elf_create_symbol(struct elf *elf, struct symbol *sym) if (symtab) { symtab_shndx =3D find_section_by_name(elf, ".symtab_shndx"); } else { - WARN("no .symtab"); + ERROR("no .symtab"); return NULL; } =20 @@ -760,7 +756,7 @@ __elf_create_symbol(struct elf *elf, struct symbol *sym) old->idx =3D new_idx; =20 if (elf_update_symbol(elf, symtab, symtab_shndx, old)) { - WARN("elf_update_symbol move"); + ERROR("elf_update_symbol move"); return NULL; } =20 @@ -778,7 +774,7 @@ __elf_create_symbol(struct elf *elf, struct symbol *sym) non_local: sym->idx =3D new_idx; if (elf_update_symbol(elf, symtab, symtab_shndx, sym)) { - WARN("elf_update_symbol"); + ERROR("elf_update_symbol"); return NULL; } =20 @@ -799,7 +795,7 @@ elf_create_section_symbol(struct elf *elf, struct secti= on *sec) struct symbol *sym =3D calloc(1, sizeof(*sym)); =20 if (!sym) { - WARN_GLIBC("malloc"); + ERROR_GLIBC("malloc"); return NULL; } =20 @@ -829,7 +825,7 @@ elf_create_prefix_symbol(struct elf *elf, struct symbol= *orig, long size) char *name =3D malloc(namelen); =20 if (!sym || !name) { - WARN_GLIBC("malloc"); + ERROR_GLIBC("malloc"); return NULL; } =20 @@ -858,16 +854,16 @@ static struct reloc *elf_init_reloc(struct elf *elf, = struct section *rsec, struct reloc *reloc, empty =3D { 0 }; =20 if (reloc_idx >=3D sec_num_entries(rsec)) { - WARN("%s: bad reloc_idx %u for %s with %d relocs", - __func__, reloc_idx, rsec->name, sec_num_entries(rsec)); + ERROR("%s: bad reloc_idx %u for %s with %d relocs", + __func__, reloc_idx, rsec->name, sec_num_entries(rsec)); return NULL; } =20 reloc =3D &rsec->relocs[reloc_idx]; =20 if (memcmp(reloc, &empty, sizeof(empty))) { - WARN("%s: %s: reloc %d already initialized!", - __func__, rsec->name, reloc_idx); + ERROR("%s: %s: reloc %d already initialized!", + __func__, rsec->name, reloc_idx); return NULL; } =20 @@ -896,8 +892,7 @@ struct reloc *elf_init_reloc_text_sym(struct elf *elf, = struct section *sec, int addend =3D insn_off; =20 if (!(insn_sec->sh.sh_flags & SHF_EXECINSTR)) { - WARN("bad call to %s() for data symbol %s", - __func__, sym->name); + ERROR("bad call to %s() for data symbol %s", __func__, sym->name); return NULL; } =20 @@ -926,8 +921,7 @@ struct reloc *elf_init_reloc_data_sym(struct elf *elf, = struct section *sec, s64 addend) { if (sym->sec && (sec->sh.sh_flags & SHF_EXECINSTR)) { - WARN("bad call to %s() for text symbol %s", - __func__, sym->name); + ERROR("bad call to %s() for text symbol %s", __func__, sym->name); return NULL; } =20 @@ -953,8 +947,7 @@ static int read_relocs(struct elf *elf) =20 rsec->base =3D find_section_by_index(elf, rsec->sh.sh_info); if (!rsec->base) { - WARN("can't find base section for reloc section %s", - rsec->name); + ERROR("can't find base section for reloc section %s", rsec->name); return -1; } =20 @@ -963,7 +956,7 @@ static int read_relocs(struct elf *elf) nr_reloc =3D 0; rsec->relocs =3D calloc(sec_num_entries(rsec), sizeof(*reloc)); if (!rsec->relocs) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return -1; } for (i =3D 0; i < sec_num_entries(rsec); i++) { @@ -973,8 +966,7 @@ static int read_relocs(struct elf *elf) symndx =3D reloc_sym(reloc); reloc->sym =3D sym =3D find_symbol_by_index(elf, symndx); if (!reloc->sym) { - WARN("can't find reloc entry symbol %d for %s", - symndx, rsec->name); + ERROR("can't find reloc entry symbol %d for %s", symndx, rsec->name); return -1; } =20 @@ -1005,7 +997,7 @@ struct elf *elf_open_read(const char *name, int flags) =20 elf =3D malloc(sizeof(*elf)); if (!elf) { - WARN_GLIBC("malloc"); + ERROR_GLIBC("malloc"); return NULL; } memset(elf, 0, sizeof(*elf)); @@ -1028,12 +1020,12 @@ struct elf *elf_open_read(const char *name, int fla= gs) =20 elf->elf =3D elf_begin(elf->fd, cmd, NULL); if (!elf->elf) { - WARN_ELF("elf_begin"); + ERROR_ELF("elf_begin"); goto err; } =20 if (!gelf_getehdr(elf->elf, &elf->ehdr)) { - WARN_ELF("gelf_getehdr"); + ERROR_ELF("gelf_getehdr"); goto err; } =20 @@ -1062,19 +1054,19 @@ static int elf_add_string(struct elf *elf, struct s= ection *strtab, char *str) if (!strtab) strtab =3D find_section_by_name(elf, ".strtab"); if (!strtab) { - WARN("can't find .strtab section"); + ERROR("can't find .strtab section"); return -1; } =20 s =3D elf_getscn(elf->elf, strtab->idx); if (!s) { - WARN_ELF("elf_getscn"); + ERROR_ELF("elf_getscn"); return -1; } =20 data =3D elf_newdata(s); if (!data) { - WARN_ELF("elf_newdata"); + ERROR_ELF("elf_newdata"); return -1; } =20 @@ -1099,7 +1091,7 @@ struct section *elf_create_section(struct elf *elf, c= onst char *name, =20 sec =3D malloc(sizeof(*sec)); if (!sec) { - WARN_GLIBC("malloc"); + ERROR_GLIBC("malloc"); return NULL; } memset(sec, 0, sizeof(*sec)); @@ -1108,13 +1100,13 @@ struct section *elf_create_section(struct elf *elf,= const char *name, =20 s =3D elf_newscn(elf->elf); if (!s) { - WARN_ELF("elf_newscn"); + ERROR_ELF("elf_newscn"); return NULL; } =20 sec->name =3D strdup(name); if (!sec->name) { - WARN_GLIBC("strdup"); + ERROR_GLIBC("strdup"); return NULL; } =20 @@ -1122,7 +1114,7 @@ struct section *elf_create_section(struct elf *elf, c= onst char *name, =20 sec->data =3D elf_newdata(s); if (!sec->data) { - WARN_ELF("elf_newdata"); + ERROR_ELF("elf_newdata"); return NULL; } =20 @@ -1132,14 +1124,14 @@ struct section *elf_create_section(struct elf *elf,= const char *name, if (size) { sec->data->d_buf =3D malloc(size); if (!sec->data->d_buf) { - WARN_GLIBC("malloc"); + ERROR_GLIBC("malloc"); return NULL; } memset(sec->data->d_buf, 0, size); } =20 if (!gelf_getshdr(s, &sec->sh)) { - WARN_ELF("gelf_getshdr"); + ERROR_ELF("gelf_getshdr"); return NULL; } =20 @@ -1154,7 +1146,7 @@ struct section *elf_create_section(struct elf *elf, c= onst char *name, if (!shstrtab) shstrtab =3D find_section_by_name(elf, ".strtab"); if (!shstrtab) { - WARN("can't find .shstrtab or .strtab section"); + ERROR("can't find .shstrtab or .strtab section"); return NULL; } sec->sh.sh_name =3D elf_add_string(elf, shstrtab, sec->name); @@ -1179,7 +1171,7 @@ static struct section *elf_create_rela_section(struct= elf *elf, =20 rsec_name =3D malloc(strlen(sec->name) + strlen(".rela") + 1); if (!rsec_name) { - WARN_GLIBC("malloc"); + ERROR_GLIBC("malloc"); return NULL; } strcpy(rsec_name, ".rela"); @@ -1199,7 +1191,7 @@ static struct section *elf_create_rela_section(struct= elf *elf, =20 rsec->relocs =3D calloc(sec_num_entries(rsec), sizeof(struct reloc)); if (!rsec->relocs) { - WARN_GLIBC("calloc"); + ERROR_GLIBC("calloc"); return NULL; } =20 @@ -1232,7 +1224,7 @@ int elf_write_insn(struct elf *elf, struct section *s= ec, Elf_Data *data =3D sec->data; =20 if (data->d_type !=3D ELF_T_BYTE || data->d_off) { - WARN("write to unexpected data for section: %s", sec->name); + ERROR("write to unexpected data for section: %s", sec->name); return -1; } =20 @@ -1261,7 +1253,7 @@ static int elf_truncate_section(struct elf *elf, stru= ct section *sec) =20 s =3D elf_getscn(elf->elf, sec->idx); if (!s) { - WARN_ELF("elf_getscn"); + ERROR_ELF("elf_getscn"); return -1; } =20 @@ -1271,7 +1263,7 @@ static int elf_truncate_section(struct elf *elf, stru= ct section *sec) =20 if (!data) { if (size) { - WARN("end of section data but non-zero size left\n"); + ERROR("end of section data but non-zero size left\n"); return -1; } return 0; @@ -1279,12 +1271,12 @@ static int elf_truncate_section(struct elf *elf, st= ruct section *sec) =20 if (truncated) { /* when we remove symbols */ - WARN("truncated; but more data\n"); + ERROR("truncated; but more data\n"); return -1; } =20 if (!data->d_size) { - WARN("zero size data"); + ERROR("zero size data"); return -1; } =20 @@ -1310,13 +1302,13 @@ int elf_write(struct elf *elf) if (sec_changed(sec)) { s =3D elf_getscn(elf->elf, sec->idx); if (!s) { - WARN_ELF("elf_getscn"); + ERROR_ELF("elf_getscn"); return -1; } =20 /* Note this also flags the section dirty */ if (!gelf_update_shdr(s, &sec->sh)) { - WARN_ELF("gelf_update_shdr"); + ERROR_ELF("gelf_update_shdr"); return -1; } =20 @@ -1329,7 +1321,7 @@ int elf_write(struct elf *elf) =20 /* Write all changes to the file. */ if (elf_update(elf->elf, ELF_C_WRITE) < 0) { - WARN_ELF("elf_update"); + ERROR_ELF("elf_update"); return -1; } =20 diff --git a/tools/objtool/include/objtool/warn.h b/tools/objtool/include/o= bjtool/warn.h index e3ad9b2..cb8fe84 100644 --- a/tools/objtool/include/objtool/warn.h +++ b/tools/objtool/include/objtool/warn.h @@ -42,26 +42,43 @@ static inline char *offstr(struct section *sec, unsigne= d long offset) return str; } =20 -#define WARN(format, ...) \ - fprintf(stderr, \ - "%s%s%s: objtool: " format "\n", \ - objname ?: "", \ - objname ? ": " : "", \ - opts.werror ? "error" : "warning", \ +#define ___WARN(severity, extra, format, ...) \ + fprintf(stderr, \ + "%s%s%s: objtool" extra ": " format "\n", \ + objname ?: "", \ + objname ? ": " : "", \ + severity, \ ##__VA_ARGS__) =20 -#define WARN_FUNC(format, sec, offset, ...) \ -({ \ - char *_str =3D offstr(sec, offset); \ - WARN("%s: " format, _str, ##__VA_ARGS__); \ - free(_str); \ +#define __WARN(severity, format, ...) \ + ___WARN(severity, "", format, ##__VA_ARGS__) + +#define __WARN_LINE(severity, format, ...) \ + ___WARN(severity, " [%s:%d]", format, __FILE__, __LINE__, ##__VA_ARGS__) + +#define __WARN_ELF(severity, format, ...) \ + __WARN_LINE(severity, "%s: " format " failed: %s", __func__, ##__VA_ARGS_= _, elf_errmsg(-1)) + +#define __WARN_GLIBC(severity, format, ...) \ + __WARN_LINE(severity, "%s: " format " failed: %s", __func__, ##__VA_ARGS_= _, strerror(errno)) + +#define __WARN_FUNC(severity, sec, offset, format, ...) \ +({ \ + char *_str =3D offstr(sec, offset); \ + __WARN(severity, "%s: " format, _str, ##__VA_ARGS__); \ + free(_str); \ }) =20 +#define WARN_STR (opts.werror ? "error" : "warning") + +#define WARN(format, ...) __WARN(WARN_STR, format, ##__VA_ARGS__) +#define WARN_FUNC(sec, offset, format, ...) __WARN_FUNC(WARN_STR, sec, off= set, format, ##__VA_ARGS__) + #define WARN_INSN(insn, format, ...) \ ({ \ struct instruction *_insn =3D (insn); \ if (!_insn->sym || !_insn->sym->warned) \ - WARN_FUNC(format, _insn->sec, _insn->offset, \ + WARN_FUNC(_insn->sec, _insn->offset, format, \ ##__VA_ARGS__); \ if (_insn->sym) \ _insn->sym->warned =3D 1; \ @@ -77,10 +94,12 @@ static inline char *offstr(struct section *sec, unsigne= d long offset) } \ }) =20 -#define WARN_ELF(format, ...) \ - WARN("%s: " format " failed: %s", __func__, ##__VA_ARGS__, elf_errmsg(-1)) +#define ERROR_STR "error" =20 -#define WARN_GLIBC(format, ...) \ - WARN("%s: " format " failed: %s", __func__, ##__VA_ARGS__, strerror(errno= )) +#define ERROR(format, ...) __WARN(ERROR_STR, format, ##__VA_ARGS__) +#define ERROR_ELF(format, ...) __WARN_ELF(ERROR_STR, format, ##__VA_ARGS__) +#define ERROR_GLIBC(format, ...) __WARN_GLIBC(ERROR_STR, format, ##__VA_AR= GS__) +#define ERROR_FUNC(sec, offset, format, ...) __WARN_FUNC(ERROR_STR, sec, o= ffset, format, ##__VA_ARGS__) +#define ERROR_INSN(insn, format, ...) WARN_FUNC(insn->sec, insn->offset, f= ormat, ##__VA_ARGS__) =20 #endif /* _WARN_H */ diff --git a/tools/objtool/objtool.c b/tools/objtool/objtool.c index e4b49c5..5c8b974 100644 --- a/tools/objtool/objtool.c +++ b/tools/objtool/objtool.c @@ -23,7 +23,7 @@ static struct objtool_file file; struct objtool_file *objtool_open_read(const char *filename) { if (file.elf) { - WARN("won't handle more than one file at a time"); + ERROR("won't handle more than one file at a time"); return NULL; } =20 @@ -50,7 +50,7 @@ int objtool_pv_add(struct objtool_file *f, int idx, struc= t symbol *func) return 0; =20 if (!f->pv_ops) { - WARN("paravirt confusion"); + ERROR("paravirt confusion"); return -1; } =20 diff --git a/tools/objtool/orc_dump.c b/tools/objtool/orc_dump.c index 05ef0e2..1dd9fc1 100644 --- a/tools/objtool/orc_dump.c +++ b/tools/objtool/orc_dump.c @@ -36,47 +36,47 @@ int orc_dump(const char *filename) =20 elf =3D elf_begin(fd, ELF_C_READ_MMAP, NULL); if (!elf) { - WARN_ELF("elf_begin"); + ERROR_ELF("elf_begin"); return -1; } =20 if (!elf64_getehdr(elf)) { - WARN_ELF("elf64_getehdr"); + ERROR_ELF("elf64_getehdr"); return -1; } memcpy(&dummy_elf.ehdr, elf64_getehdr(elf), sizeof(dummy_elf.ehdr)); =20 if (elf_getshdrnum(elf, &nr_sections)) { - WARN_ELF("elf_getshdrnum"); + ERROR_ELF("elf_getshdrnum"); return -1; } =20 if (elf_getshdrstrndx(elf, &shstrtab_idx)) { - WARN_ELF("elf_getshdrstrndx"); + ERROR_ELF("elf_getshdrstrndx"); return -1; } =20 for (i =3D 0; i < nr_sections; i++) { scn =3D elf_getscn(elf, i); if (!scn) { - WARN_ELF("elf_getscn"); + ERROR_ELF("elf_getscn"); return -1; } =20 if (!gelf_getshdr(scn, &sh)) { - WARN_ELF("gelf_getshdr"); + ERROR_ELF("gelf_getshdr"); return -1; } =20 name =3D elf_strptr(elf, shstrtab_idx, sh.sh_name); if (!name) { - WARN_ELF("elf_strptr"); + ERROR_ELF("elf_strptr"); return -1; } =20 data =3D elf_getdata(scn, NULL); if (!data) { - WARN_ELF("elf_getdata"); + ERROR_ELF("elf_getdata"); return -1; } =20 @@ -99,7 +99,7 @@ int orc_dump(const char *filename) return 0; =20 if (orc_size % sizeof(*orc) !=3D 0) { - WARN("bad .orc_unwind section size"); + ERROR("bad .orc_unwind section size"); return -1; } =20 @@ -107,36 +107,36 @@ int orc_dump(const char *filename) for (i =3D 0; i < nr_entries; i++) { if (rela_orc_ip) { if (!gelf_getrela(rela_orc_ip, i, &rela)) { - WARN_ELF("gelf_getrela"); + ERROR_ELF("gelf_getrela"); return -1; } =20 if (!gelf_getsym(symtab, GELF_R_SYM(rela.r_info), &sym)) { - WARN_ELF("gelf_getsym"); + ERROR_ELF("gelf_getsym"); return -1; } =20 if (GELF_ST_TYPE(sym.st_info) =3D=3D STT_SECTION) { scn =3D elf_getscn(elf, sym.st_shndx); if (!scn) { - WARN_ELF("elf_getscn"); + ERROR_ELF("elf_getscn"); return -1; } =20 if (!gelf_getshdr(scn, &sh)) { - WARN_ELF("gelf_getshdr"); + ERROR_ELF("gelf_getshdr"); return -1; } =20 name =3D elf_strptr(elf, shstrtab_idx, sh.sh_name); if (!name) { - WARN_ELF("elf_strptr"); + ERROR_ELF("elf_strptr"); return -1; } } else { name =3D elf_strptr(elf, strtab_idx, sym.st_name); if (!name) { - WARN_ELF("elf_strptr"); + ERROR_ELF("elf_strptr"); return -1; } } diff --git a/tools/objtool/special.c b/tools/objtool/special.c index 6cd7b1b..c80fed8 100644 --- a/tools/objtool/special.c +++ b/tools/objtool/special.c @@ -86,7 +86,7 @@ static int get_alt_entry(struct elf *elf, const struct sp= ecial_entry *entry, =20 orig_reloc =3D find_reloc_by_dest(elf, sec, offset + entry->orig); if (!orig_reloc) { - WARN_FUNC("can't find orig reloc", sec, offset + entry->orig); + ERROR_FUNC(sec, offset + entry->orig, "can't find orig reloc"); return -1; } =20 @@ -97,8 +97,7 @@ static int get_alt_entry(struct elf *elf, const struct sp= ecial_entry *entry, if (!entry->group || alt->new_len) { new_reloc =3D find_reloc_by_dest(elf, sec, offset + entry->new); if (!new_reloc) { - WARN_FUNC("can't find new reloc", - sec, offset + entry->new); + ERROR_FUNC(sec, offset + entry->new, "can't find new reloc"); return -1; } =20 @@ -114,8 +113,7 @@ static int get_alt_entry(struct elf *elf, const struct = special_entry *entry, =20 key_reloc =3D find_reloc_by_dest(elf, sec, offset + entry->key); if (!key_reloc) { - WARN_FUNC("can't find key reloc", - sec, offset + entry->key); + ERROR_FUNC(sec, offset + entry->key, "can't find key reloc"); return -1; } alt->key_addend =3D reloc_addend(key_reloc); @@ -145,8 +143,7 @@ int special_get_alts(struct elf *elf, struct list_head = *alts) continue; =20 if (sec->sh.sh_size % entry->size !=3D 0) { - WARN("%s size not a multiple of %d", - sec->name, entry->size); + ERROR("%s size not a multiple of %d", sec->name, entry->size); return -1; } =20 @@ -155,7 +152,7 @@ int special_get_alts(struct elf *elf, struct list_head = *alts) for (idx =3D 0; idx < nr_entries; idx++) { alt =3D malloc(sizeof(*alt)); if (!alt) { - WARN("malloc failed"); + ERROR_GLIBC("malloc failed"); return -1; } memset(alt, 0, sizeof(*alt));