[PATCH] D61674: [llvm-objcopy] Improve error message for unrecognised archive member

James Henderson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 8 04:03:50 PDT 2019


jhenderson created this revision.
jhenderson added reviewers: jakehehrlich, rupprecht, grimar, seiya, MaskRay.
Herald added subscribers: arichardson, emaste.
Herald added a reviewer: espindola.
Herald added a reviewer: alexshap.
Herald added a project: LLVM.

Prior to this patch, llvm-objcopy's error messages for archives with unsupported members only mentioned the archive name, not the member name, making them unhelpful. This change improves it by approximately following GNU objcopy's error message syntax of "<archive name>(<member name>): <problem>".


Repository:
  rL LLVM

https://reviews.llvm.org/D61674

Files:
  test/tools/llvm-objcopy/ELF/archive-unknown-members.test
  tools/llvm-objcopy/llvm-objcopy.cpp


Index: tools/llvm-objcopy/llvm-objcopy.cpp
===================================================================
--- tools/llvm-objcopy/llvm-objcopy.cpp
+++ tools/llvm-objcopy/llvm-objcopy.cpp
@@ -154,15 +154,16 @@
   std::vector<NewArchiveMember> NewArchiveMembers;
   Error Err = Error::success();
   for (const Archive::Child &Child : Ar.children(Err)) {
-    Expected<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary();
-    if (!ChildOrErr)
-      return createFileError(Ar.getFileName(), ChildOrErr.takeError());
-    Binary *Bin = ChildOrErr->get();
-
     Expected<StringRef> ChildNameOrErr = Child.getName();
     if (!ChildNameOrErr)
       return createFileError(Ar.getFileName(), ChildNameOrErr.takeError());
 
+    Expected<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary();
+    if (!ChildOrErr)
+      return createFileError(Ar.getFileName() + "(" + *ChildNameOrErr + ")",
+                             ChildOrErr.takeError());
+    Binary *Bin = ChildOrErr->get();
+
     MemBuffer MB(ChildNameOrErr.get());
     if (Error E = executeObjcopyOnBinary(Config, *Bin, MB))
       return E;
Index: test/tools/llvm-objcopy/ELF/archive-unknown-members.test
===================================================================
--- test/tools/llvm-objcopy/ELF/archive-unknown-members.test
+++ test/tools/llvm-objcopy/ELF/archive-unknown-members.test
@@ -0,0 +1,46 @@
+## Show that llvm-objcopy and llvm-strip emit errors when attempting to modify
+## archives containing unrecognised files, and do not modify anything. We use
+## --strip-debug so that the section should be removed, and a difference
+## detectable, if the file were modified.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: rm -f %t.a
+# RUN: llvm-ar rc %t.a %t.o %s
+# RUN: cp %t.a %t1.a
+# RUN: cp %t.a %t2.a
+
+# RUN: not llvm-objcopy --strip-debug %t1.a 2>&1 | FileCheck %s -DARCHIVE=%t1.a
+# RUN: not llvm-strip --strip-debug %t2.a 2>&1 | FileCheck %s -DARCHIVE=%t2.a
+## Verify that the archive was not modified, if any member couldn't be recognised.
+# RUN: cmp %t.a %t1.a
+# RUN: cmp %t.a %t2.a
+
+# CHECK: error: '[[ARCHIVE]](archive-unknown-members.test)': The file was not recognized as a valid object file
+
+# RUN: rm -f %t.thin1.a %t.thin2.a
+# RUN: cp %t.o %t1.o
+# RUN: cp %t.o %t2.o
+# RUN: llvm-ar rcT %t.thin1.a %t1.o %s
+# RUN: llvm-ar rcT %t.thin2.a %t2.o %s
+
+# RUN: not llvm-objcopy --strip-debug %t.thin1.a %t2.a 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=THIN -DARCHIVE=%t.thin1.a -DMEMBER=%s
+# RUN: not llvm-strip --strip-debug %t.thin2.a 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=THIN -DARCHIVE=%t.thin2.a -DMEMBER=%s
+## Verify that the first member was not modified, if a later member could not
+## be recognised.
+# RUN: cmp %t.o %t1.o
+# RUN: cmp %t.o %t2.o
+
+# THIN: error: '[[ARCHIVE]]([[MEMBER]])': The file was not recognized as a valid object file
+
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .debug_foo
+    Type:            SHT_PROGBITS
+    Flags:           [ ]


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61674.198620.patch
Type: text/x-patch
Size: 3123 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190508/f9610f60/attachment.bin>


More information about the llvm-commits mailing list