From a855622c498c9a588043f02160dc6dd88f143f71 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Tue, 5 Mar 2019 13:07:43 +0000 Subject: [PATCH] [llvm-objcopy] - Simplify `isCompressable` and fix the issue relative. When --compress-debug-sections is given, llvm-objcopy do not compress sections that have "ZLIB" header in data. Normally this signature is used in zlib-gnu compression format. But if zlib-gnu used then the name of the compressed section should start from .z* (e.g .zdebug_info). If it does not, then it is not a zlib-gnu format and section should be treated as a normal uncompressed section. Differential revision: https://reviews.llvm.org/D58908 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355399 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../ELF/compress-debug-sections-zlib-header.test | 41 ++++++++++++++++++++++ tools/llvm-objcopy/ELF/ELFObjcopy.cpp | 13 ++----- 2 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 test/tools/llvm-objcopy/ELF/compress-debug-sections-zlib-header.test diff --git a/test/tools/llvm-objcopy/ELF/compress-debug-sections-zlib-header.test b/test/tools/llvm-objcopy/ELF/compress-debug-sections-zlib-header.test new file mode 100644 index 00000000000..0e7d713aebc --- /dev/null +++ b/test/tools/llvm-objcopy/ELF/compress-debug-sections-zlib-header.test @@ -0,0 +1,41 @@ +# REQUIRES: zlib + +# RUN: yaml2obj %s -o %t1.o +# RUN: llvm-objcopy --compress-debug-sections %t1.o %t2.o +# RUN: llvm-readobj -s %t2.o | FileCheck %s + +# Non-.zdebug* sections whose data does start with "ZLIB" should +# not be considered as zlib-gnu compressed sections. + +# In this test we have 2 normal sections, one of them starts with "ZLIB", +# another starts with "ZZZZ". Check we compress both as expected. + +# CHECK: Name: .debug_foo +# CHECK-NEXT: Type: SHT_PROGBITS +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_COMPRESSED +# CHECK-NEXT: ] + +# CHECK: Name: .debug_bar +# CHECK-NEXT: Type: SHT_PROGBITS +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_COMPRESSED +# CHECK-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .debug_foo + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + # "ZLIB" + Content: 5A4C49420000000000000000 + - Name: .debug_bar + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + # "ZZZZ" + Content: 5A5A5A5A0000000000000000 diff --git a/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/tools/llvm-objcopy/ELF/ELFObjcopy.cpp index 1132aa18589..6f21db9db60 100644 --- a/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ b/tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -223,18 +223,9 @@ static Error dumpSectionToFile(StringRef SecName, StringRef Filename, return createStringError(object_error::parse_failed, "Section not found"); } -static bool isCompressed(const SectionBase &Section) { - const char *Magic = "ZLIB"; - return StringRef(Section.Name).startswith(".zdebug") || - (Section.OriginalData.size() > strlen(Magic) && - !strncmp(reinterpret_cast(Section.OriginalData.data()), - Magic, strlen(Magic))) || - (Section.Flags & ELF::SHF_COMPRESSED); -} - static bool isCompressable(const SectionBase &Section) { - return !isCompressed(Section) && isDebugSection(Section) && - Section.Name != ".gdb_index"; + return !(Section.Flags & ELF::SHF_COMPRESSED) && + StringRef(Section.Name).startswith(".debug"); } static void replaceDebugSections( -- 2.11.0