From fb4a55010ee9bd03720609c8542f770775576fc8 Mon Sep 17 00:00:00 2001 From: James Henderson Date: Thu, 31 Oct 2019 11:53:33 +0000 Subject: [PATCH] [llvm-objcopy] Preserve .ARM.attributes section when stripping files This works around a bug in Debian's patchset for glibc. The bug is described in detail in the upstream debian bug: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=943798, but the short version of it is that glibc on any Debian based distro don't load libraries unless it has a .ARM.attribute section. Reviewed by: jhenderson, rupprecht, MaskRay, jakehehrlich Differential Revision: https://reviews.llvm.org/D69188 Patch by Tobias Hieta. --- llvm/docs/CommandGuide/llvm-objcopy.rst | 3 ++- llvm/docs/CommandGuide/llvm-strip.rst | 3 ++- .../ELF/strip-preserve-arm-attributes.test | 25 ++++++++++++++++++++++ llvm/tools/llvm-objcopy/CommonOpts.td | 3 ++- llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp | 6 ++++++ 5 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 llvm/test/tools/llvm-objcopy/ELF/strip-preserve-arm-attributes.test diff --git a/llvm/docs/CommandGuide/llvm-objcopy.rst b/llvm/docs/CommandGuide/llvm-objcopy.rst index 3848e88..f421106 100644 --- a/llvm/docs/CommandGuide/llvm-objcopy.rst +++ b/llvm/docs/CommandGuide/llvm-objcopy.rst @@ -98,7 +98,8 @@ multiple file formats. .. option:: --strip-all, -S For ELF objects, remove from the output all symbols and non-alloc sections not - within segments, except for .gnu.warning sections and the section name table. + within segments, except for .gnu.warning, .ARM.attribute sections and the + section name table. For COFF and Mach-O objects, remove all symbols, debug sections, and relocations from the output. diff --git a/llvm/docs/CommandGuide/llvm-strip.rst b/llvm/docs/CommandGuide/llvm-strip.rst index e1f07d9..0e95996 100644 --- a/llvm/docs/CommandGuide/llvm-strip.rst +++ b/llvm/docs/CommandGuide/llvm-strip.rst @@ -77,7 +77,8 @@ multiple file formats. .. option:: --strip-all, -S For ELF objects, remove from the output all symbols and non-alloc sections not - within segments, except for .gnu.warning sections and the section name table. + within segments, except for .gnu.warning, .ARM.attribute sections and the + section name table. For COFF objects, remove all symbols, debug sections, and relocations from the output. diff --git a/llvm/test/tools/llvm-objcopy/ELF/strip-preserve-arm-attributes.test b/llvm/test/tools/llvm-objcopy/ELF/strip-preserve-arm-attributes.test new file mode 100644 index 0000000..2dcca66 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/ELF/strip-preserve-arm-attributes.test @@ -0,0 +1,25 @@ +## This test makes sure that --strip-all and --strip-all-gnu preserve +## .ARM.attributes sections in ELF files. This is needed to maintain +## compatibility for Ubuntu/Debian distributions on ARM. + +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy --strip-all %t %t2 +# RUN: llvm-readobj --sections %t2 | FileCheck %s +# RUN: llvm-objcopy --strip-all-gnu %t %t3 +# RUN: llvm-readobj --sections %t3 | FileCheck %s +# RUN: llvm-strip %t -o %t4 +# RUN: cmp %t4 %t2 +# RUN: llvm-strip --strip-all-gnu %t -o %t5 +# RUN: cmp %t5 %t3 + +!ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_ARM +Sections: + - Name: .ARM.attributes + Type: SHT_ARM_ATTRIBUTES + +# CHECK: Name: .ARM.attributes diff --git a/llvm/tools/llvm-objcopy/CommonOpts.td b/llvm/tools/llvm-objcopy/CommonOpts.td index e8c092b..ea36165 100644 --- a/llvm/tools/llvm-objcopy/CommonOpts.td +++ b/llvm/tools/llvm-objcopy/CommonOpts.td @@ -40,7 +40,8 @@ def p : Flag<["-"], "p">, def strip_all : Flag<["--"], "strip-all">, HelpText<"Remove non-allocated sections outside segments. " - ".gnu.warning* sections are not removed">; + ".gnu.warning* and .ARM.attribute sections are not " + "removed">; def strip_all_gnu : Flag<["--"], "strip-all-gnu">, diff --git a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp index 8bf7e0f..1bfabda 100644 --- a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -503,6 +503,12 @@ static Error replaceAndRemoveSections(const CopyConfig &Config, Object &Obj) { return false; if (StringRef(Sec.Name).startswith(".gnu.warning")) return false; + // We keep the .ARM.attribute section to maintain compatibility + // with Debian derived distributions. This is a bug in their + // patchset as documented here: + // https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=943798 + if (Sec.Type == SHT_ARM_ATTRIBUTES) + return false; if (Sec.ParentSegment != nullptr) return false; return (Sec.Flags & SHF_ALLOC) == 0; -- 2.7.4