1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 02:33:06 +01:00

[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.
This commit is contained in:
James Henderson 2019-10-31 11:53:33 +00:00
parent d518f5c9d0
commit ad6a78daf8
5 changed files with 37 additions and 3 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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">,

View File

@ -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;