[llvm] r357017 - [llvm-objcopy] - Strip sections before symbols.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 26 11:42:15 PDT 2019


Author: grimar
Date: Tue Mar 26 11:42:15 2019
New Revision: 357017

URL: http://llvm.org/viewvc/llvm-project?rev=357017&view=rev
Log:
[llvm-objcopy] - Strip sections before symbols.

This is a fix for https://bugs.llvm.org/show_bug.cgi?id=40007.

Idea is to swap the order of stripping. So that we strip sections before
symbols what allows us to strip relocation sections without emitting
the error about relative symbols.

Differential revision: https://reviews.llvm.org/D59763

Added:
    llvm/trunk/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test
Modified:
    llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp

Added: llvm/trunk/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test?rev=357017&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test Tue Mar 26 11:42:15 2019
@@ -0,0 +1,48 @@
+# RUN: yaml2obj %s > %t
+
+## Check we are able to strip all symbols and relocatable information at the same time.
+
+# RUN: llvm-objcopy -S %t %t2
+# RUN: llvm-objdump --section-headers %t2 | FileCheck %s
+
+# RUN: llvm-objcopy --strip-all-gnu %t %t2
+# RUN: llvm-objdump --section-headers %t2 | FileCheck %s
+
+# CHECK-NOT: .symtab
+# CHECK-NOT: .rela.text
+
+## Check we are able to strip the particular symbol if we
+## strip the corresponding relocation section at the same time.
+
+# RUN: llvm-objcopy --strip-symbol=bar -R .rela.text %t %t2
+# RUN: llvm-readelf -s -S %t2 | FileCheck %s --check-prefix=STRIPSYM
+
+# STRIPSYM-NOT: bar
+# STRIPSYM-NOT: .rela.text
+
+# RUN: not llvm-objcopy --strip-symbol=bar %t %t2 2>&1 | FileCheck %s --check-prefix=ERR
+# ERR: not stripping symbol 'bar' because it is named in a relocation
+
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ] 
+    Content:         00000000
+  - Name:            .rela.text
+    Type:            SHT_RELA
+    Link:            .symtab
+    Info:            .text
+    Relocations:
+      - Offset:          0x0000000000000000
+        Symbol:          bar
+        Type:            R_X86_64_32S
+Symbols:
+  Global:
+    - Name:     bar
+      Section:  .text

Modified: llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp?rev=357017&r1=357016&r2=357017&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp Tue Mar 26 11:42:15 2019
@@ -542,10 +542,14 @@ static Error handleArgs(const CopyConfig
     Obj.OSABI = Config.OutputArch.getValue().OSABI;
   }
 
-  if (Error E = updateAndRemoveSymbols(Config, Obj))
+  // It is important to remove the sections first. For example, we want to
+  // remove the relocation sections before removing the symbols. That allows
+  // us to avoid reporting the inappropriate errors about removing symbols
+  // named in relocations.
+  if (Error E = replaceAndRemoveSections(Config, Obj))
     return E;
 
-  if (Error E = replaceAndRemoveSections(Config, Obj))
+  if (Error E = updateAndRemoveSymbols(Config, Obj))
     return E;
 
   if (!Config.SectionsToRename.empty()) {




More information about the llvm-commits mailing list