summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2019-03-26 18:42:15 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2019-03-26 18:42:15 +0000
commit279898b3152556c223b7773f78063b52176b9edc (patch)
tree93674cb9f05976b3de3fed78f28e98ab7287b170
parentd7aba7678308848b640551ac083c8dfee01a7ba9 (diff)
downloadbcm5719-llvm-279898b3152556c223b7773f78063b52176b9edc.tar.gz
bcm5719-llvm-279898b3152556c223b7773f78063b52176b9edc.zip
[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 llvm-svn: 357017
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test48
-rw-r--r--llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp8
2 files changed, 54 insertions, 2 deletions
diff --git a/llvm/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test b/llvm/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test
new file mode 100644
index 00000000000..dfe25984c6c
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test
@@ -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
diff --git a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
index 1ae802ff14b..0cf195de113 100644
--- a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
+++ b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
@@ -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()) {
OpenPOWER on IntegriCloud