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:
parent
d518f5c9d0
commit
ad6a78daf8
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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
|
@ -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">,
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user