OSDN Git Service

[llvm-objcopy] - Strip sections before symbols.
authorGeorge Rimar <grimar@accesssoftek.com>
Tue, 26 Mar 2019 18:42:15 +0000 (18:42 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Tue, 26 Mar 2019 18:42:15 +0000 (18:42 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357017 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test [new file with mode: 0644]
tools/llvm-objcopy/ELF/ELFObjcopy.cpp

diff --git a/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test b/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test
new file mode 100644 (file)
index 0000000..dfe2598
--- /dev/null
@@ -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
index 1ae802f..0cf195d 100644 (file)
@@ -542,10 +542,14 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj,
     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()) {