[llvm] r333772 - [llvm-objcopy] Fix null symbol handling

Paul Semel via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 1 09:19:46 PDT 2018


Author: paulsemel
Date: Fri Jun  1 09:19:46 2018
New Revision: 333772

URL: http://llvm.org/viewvc/llvm-project?rev=333772&view=rev
Log:
[llvm-objcopy] Fix null symbol handling

This fixes the bug where strip-all option was
leading to a malformed outputted ELF file.

Differential Revision: https://reviews.llvm.org/D47414

Added:
    llvm/trunk/test/tools/llvm-objcopy/null-symbol.test
Modified:
    llvm/trunk/test/tools/llvm-objcopy/keep-file-symbols.test
    llvm/trunk/test/tools/llvm-objcopy/strip-all-and-keep-symbol.test
    llvm/trunk/tools/llvm-objcopy/Object.cpp
    llvm/trunk/tools/llvm-objcopy/Object.h
    llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp

Modified: llvm/trunk/test/tools/llvm-objcopy/keep-file-symbols.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/keep-file-symbols.test?rev=333772&r1=333771&r2=333772&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/keep-file-symbols.test (original)
+++ llvm/trunk/test/tools/llvm-objcopy/keep-file-symbols.test Fri Jun  1 09:19:46 2018
@@ -29,6 +29,15 @@ Symbols:
 
 #STRIPALL: Symbols [
 #STRIPALL-NEXT:  Symbol {
+#STRIPALL-NEXT:    Name:
+#STRIPALL-NEXT:    Value: 0x0
+#STRIPALL-NEXT:    Size: 0
+#STRIPALL-NEXT:    Binding: Local
+#STRIPALL-NEXT:    Type: None
+#STRIPALL-NEXT:    Other: 0
+#STRIPALL-NEXT:    Section: Undefined
+#STRIPALL-NEXT:  }
+#STRIPALL-NEXT:  Symbol {
 #STRIPALL-NEXT:    Name: foo
 #STRIPALL-NEXT:    Value: 0x0
 #STRIPALL-NEXT:    Size: 0

Added: llvm/trunk/test/tools/llvm-objcopy/null-symbol.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/null-symbol.test?rev=333772&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/null-symbol.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/null-symbol.test Fri Jun  1 09:19:46 2018
@@ -0,0 +1,28 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy %t %t2
+# RUN: llvm-readobj -symbols %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Address:         0x1000
+    AddressAlign:    0x0000000000000010
+    Size:            8
+
+#CHECK: Symbols [
+#CHECK-NEXT:  Symbol {
+#CHECK-NEXT:    Name: (0)
+#CHECK-NEXT:    Value: 0x0
+#CHECK-NEXT:    Size: 0
+#CHECK-NEXT:    Binding: Local
+#CHECK-NEXT:    Type: None
+#CHECK-NEXT:    Other: 0
+#CHECK-NEXT:    Section: Undefined
+#CHECK-NEXT:  }

Modified: llvm/trunk/test/tools/llvm-objcopy/strip-all-and-keep-symbol.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/strip-all-and-keep-symbol.test?rev=333772&r1=333771&r2=333772&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/strip-all-and-keep-symbol.test (original)
+++ llvm/trunk/test/tools/llvm-objcopy/strip-all-and-keep-symbol.test Fri Jun  1 09:19:46 2018
@@ -58,6 +58,15 @@ Symbols:
 
 #CHECK: Symbols [
 #CHECK-NEXT:  Symbol {
+#CHECK-NEXT:    Name:
+#CHECK-NEXT:    Value: 0x0
+#CHECK-NEXT:    Size: 0
+#CHECK-NEXT:    Binding: Local
+#CHECK-NEXT:    Type: None
+#CHECK-NEXT:    Other: 0
+#CHECK-NEXT:    Section: Undefined
+#CHECK-NEXT:  }
+#CHECK-NEXT:  Symbol {
 #CHECK-NEXT:    Name: foo
 #CHECK-NEXT:    Value: 0x1000
 #CHECK-NEXT:    Size: 8

Modified: llvm/trunk/tools/llvm-objcopy/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/Object.cpp?rev=333772&r1=333771&r2=333772&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/Object.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/Object.cpp Fri Jun  1 09:19:46 2018
@@ -200,8 +200,8 @@ void SymbolTableSection::removeSectionRe
 }
 
 void SymbolTableSection::updateSymbols(function_ref<void(Symbol &)> Callable) {
-  for (auto &Sym : Symbols)
-    Callable(*Sym);
+  std::for_each(std::begin(Symbols) + 1, std::end(Symbols),
+                [Callable](SymPtr &Sym) { Callable(*Sym); });
   std::stable_partition(
       std::begin(Symbols), std::end(Symbols),
       [](const SymPtr &Sym) { return Sym->Binding == STB_LOCAL; });
@@ -211,7 +211,7 @@ void SymbolTableSection::updateSymbols(f
 void SymbolTableSection::removeSymbols(
     function_ref<bool(const Symbol &)> ToRemove) {
   Symbols.erase(
-      std::remove_if(std::begin(Symbols), std::end(Symbols),
+      std::remove_if(std::begin(Symbols) + 1, std::end(Symbols),
                      [ToRemove](const SymPtr &Sym) { return ToRemove(*Sym); }),
       std::end(Symbols));
   Size = Symbols.size() * EntrySize;

Modified: llvm/trunk/tools/llvm-objcopy/Object.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/Object.h?rev=333772&r1=333771&r2=333772&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/Object.h (original)
+++ llvm/trunk/tools/llvm-objcopy/Object.h Fri Jun  1 09:19:46 2018
@@ -367,7 +367,8 @@ public:
                  SectionBase *DefinedIn, uint64_t Value, uint8_t Visibility,
                  uint16_t Shndx, uint64_t Sz);
   void addSymbolNames();
-  bool empty() const { return Symbols.empty(); }
+  // An 'empty' symbol table still contains a null symbol.
+  bool empty() const { return Symbols.size() == 1; }
   const SectionBase *getStrTab() const { return SymbolNames; }
   const Symbol *getSymbolByIndex(uint32_t Index) const;
   Symbol *getSymbolByIndex(uint32_t Index);

Modified: llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp?rev=333772&r1=333771&r2=333772&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp Fri Jun  1 09:19:46 2018
@@ -292,9 +292,7 @@ void HandleArgs(const CopyConfig &Config
         return true;
       }
 
-      // TODO: We might handle the 'null symbol' in a different way
-      // by probably handling it the same way as we handle 'null section' ?
-      if (Config.StripUnneeded && !Sym.Referenced && Sym.Index != 0 &&
+      if (Config.StripUnneeded && !Sym.Referenced &&
           (Sym.Binding == STB_LOCAL || Sym.getShndx() == SHN_UNDEF) &&
           Sym.Type != STT_FILE && Sym.Type != STT_SECTION)
         return true;




More information about the llvm-commits mailing list