From 279898b3152556c223b7773f78063b52176b9edc 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 llvm-svn: 357017 --- .../ELF/strip-symbol-and-relocation.test | 48 ++++++++++++++++++++++ llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp | 8 +++- 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 llvm/test/tools/llvm-objcopy/ELF/strip-symbol-and-relocation.test 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 0000000..dfe2598 --- /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 1ae802f..0cf195d 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()) { -- 2.7.4