diff --git a/llvm/docs/CommandGuide/llvm-objcopy.rst b/llvm/docs/CommandGuide/llvm-objcopy.rst --- a/llvm/docs/CommandGuide/llvm-objcopy.rst +++ b/llvm/docs/CommandGuide/llvm-objcopy.rst @@ -98,7 +98,8 @@ .. 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 --- a/llvm/docs/CommandGuide/llvm-strip.rst +++ b/llvm/docs/CommandGuide/llvm-strip.rst @@ -77,7 +77,8 @@ .. 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 --- /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 --- a/llvm/tools/llvm-objcopy/CommonOpts.td +++ b/llvm/tools/llvm-objcopy/CommonOpts.td @@ -40,7 +40,8 @@ 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 --- a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -503,6 +503,12 @@ 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;