[llvm] [llvm-objdump] Return non-zero exit code for invalid MachO files (PR #172886)

Ryan Mansfield via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 18 10:07:57 PST 2025


https://github.com/rjmansfield created https://github.com/llvm/llvm-project/pull/172886

Fixes #84148

>From 8a41d10b0761d923500c94aa8a766587d0d0d193 Mon Sep 17 00:00:00 2001
From: Ryan Mansfield <ryan_mansfield at apple.com>
Date: Wed, 17 Dec 2025 23:06:19 -0500
Subject: [PATCH] [llvm-objdump] Return non-zero exit code for invalid MachO
 files

Fixes #84148
---
 llvm/test/Object/macho-invalid.test               | 2 +-
 llvm/test/tools/llvm-objdump/MachO/malformed.test | 2 +-
 llvm/tools/llvm-objdump/MachODump.cpp             | 7 +++++--
 llvm/tools/llvm-objdump/llvm-objdump.cpp          | 3 ++-
 llvm/tools/llvm-objdump/llvm-objdump.h            | 2 ++
 5 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/llvm/test/Object/macho-invalid.test b/llvm/test/Object/macho-invalid.test
index f149ace70d42d..e067d0a2fa970 100644
--- a/llvm/test/Object/macho-invalid.test
+++ b/llvm/test/Object/macho-invalid.test
@@ -83,7 +83,7 @@ RUN: not llvm-objdump -t %p/Inputs/macho-invalid-section-index-getSectionRawName
 RUN:      | FileCheck -check-prefix INVALID-SECTION-IDX-SYMBOL-SEC-objdump %s
 INVALID-SECTION-IDX-SYMBOL-SEC-objdump: truncated or malformed object (bad section index: 66 for symbol at index 8)
 
-RUN: llvm-objdump --macho --private-headers %p/Inputs/macho-invalid-header 2>&1 | FileCheck --check-prefix=INVALID-HEADER %s
+RUN: not llvm-objdump --macho --private-headers %p/Inputs/macho-invalid-header 2>&1 | FileCheck --check-prefix=INVALID-HEADER %s
 INVALID-HEADER: is not an object file
 
 RUN: not llvm-objdump --macho --private-headers %p/Inputs/macho64-invalid-incomplete-segment-load-command 2>&1 | FileCheck --check-prefix=INCOMPLETE-SEGMENT-LOADC %s
diff --git a/llvm/test/tools/llvm-objdump/MachO/malformed.test b/llvm/test/tools/llvm-objdump/MachO/malformed.test
index 31d68b83537e1..7c30ec2e9f87b 100644
--- a/llvm/test/tools/llvm-objdump/MachO/malformed.test
+++ b/llvm/test/tools/llvm-objdump/MachO/malformed.test
@@ -1,3 +1,3 @@
-RUN: llvm-objdump --macho --private-header %p/Inputs/malformed-macho.bin %p/Inputs/empty.macho-armv7 2>&1 | FileCheck %s --check-prefix=MALFORMED
+RUN: not llvm-objdump --macho --private-header %p/Inputs/malformed-macho.bin %p/Inputs/empty.macho-armv7 2>&1 | FileCheck %s --check-prefix=MALFORMED
 MALFORMED: is not an object file
 MALFORMED-NEXT: Mach header
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp
index 44d7c11343f93..94e08b7aa65ff 100644
--- a/llvm/tools/llvm-objdump/MachODump.cpp
+++ b/llvm/tools/llvm-objdump/MachODump.cpp
@@ -2537,8 +2537,11 @@ void objdump::parseInputMachO(StringRef Filename) {
   if (!BinaryOrErr) {
     if (Error E = isNotObjectErrorInvalidFileType(BinaryOrErr.takeError()))
       reportError(std::move(E), Filename);
-    else
-      outs() << Filename << ": is not an object file\n";
+    else {
+      WithColor::error(errs(), "llvm-objdump")
+          << "'" << Filename << "': is not an object file\n";
+      HadError = true;
+    }
     return;
   }
   Binary &Bin = *BinaryOrErr.get().getBinary();
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index e56f9982a363c..550650fd68574 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -330,6 +330,7 @@ bool objdump::PrintImmHex;
 bool objdump::PrivateHeaders;
 std::vector<std::string> objdump::FilterSections;
 bool objdump::SectionHeaders;
+bool objdump::HadError;
 static bool ShowAllSymbols;
 static bool ShowLMA;
 bool objdump::PrintSource;
@@ -3911,5 +3912,5 @@ int llvm_objdump_main(int argc, char **argv, const llvm::ToolContext &) {
 
   warnOnNoMatchForSections();
 
-  return EXIT_SUCCESS;
+  return HadError ? EXIT_FAILURE : EXIT_SUCCESS;
 }
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h
index bac858929ae9c..59a8415766f97 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.h
+++ b/llvm/tools/llvm-objdump/llvm-objdump.h
@@ -72,6 +72,8 @@ extern bool SymbolTable;
 extern std::string TripleName;
 extern bool UnwindInfo;
 
+extern bool HadError;
+
 extern StringSet<> FoundSectionSet;
 
 class Dumper {



More information about the llvm-commits mailing list