From dca7346ad9a92ca8ef1947e1bb00b9f2c2cd0835 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Tue, 26 Mar 2019 18:42:15 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357017 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../ELF/strip-symbol-and-relocation.test | 48 +++++++++++++++++++ tools/llvm-objcopy/ELF/ELFObjcopy.cpp | 8 +++- 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test 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 index 00000000000..dfe25984c6c --- /dev/null +++ b/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/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/tools/llvm-objcopy/ELF/ELFObjcopy.cpp index 1ae802ff14b..0cf195de113 100644 --- a/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ b/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()) { -- 2.50.1