--compress-sections is similar to --compress-debug-sections but applies to arbitrary sections. * `--compress-sections <section>=none`: decompress sections * `--compress-sections <section>=[zlib|zstd]`: compress sections with zlib/zstd Like `--remove-section`, the pattern is by default a glob, but a regex when --regex is specified. For `--remove-section` like options, `!` prevents matches and is not dependent on ordering (see `ELF/wildcard-syntax.test`). Since `--compress-sections a=zlib --compress-sections a=none` naturally allows overriding, having an order-independent `!` would be confusing. Therefore, `!` is disallowed. Sections within a segment are effectively immutable. Report an error for an attempt to (de)compress them. `SHF_ALLOC` sections in a relocatable file can be compressed, but linkers usually reject them. Note: Before this patch, a compressed relocation section is recognized as a `RelocationSectionBase` as well and `removeSections` `!ToRemove(*ToRelSec)` may incorrectly interpret a `CompressedSections` as `RelocationSectionBase`, leading to ubsan failure for the new test. Fix this by setting `OriginalFlags` in CompressedSection::CompressedSection. Link: https://discourse.llvm.org/t/rfc-compress-arbitrary-sections-with-ld-lld-compress-sections/71674 Pull Request: https://github.com/llvm/llvm-project/pull/85036
66 lines
3.4 KiB
Plaintext
66 lines
3.4 KiB
Plaintext
# REQUIRES: zlib
|
|
## Test decompression for different sections.
|
|
|
|
# RUN: yaml2obj %s -o %t
|
|
# RUN: llvm-objcopy --decompress-debug-sections %t %t.de
|
|
# RUN: llvm-readelf -S %t.de | FileCheck %s
|
|
# RUN: llvm-objcopy --compress-sections '*nonalloc=none' --compress-sections .debugx=none %t %t.1.de
|
|
# RUN: cmp %t.de %t.1.de
|
|
|
|
# CHECK: Name Type Address Off Size ES Flg Lk Inf Al
|
|
# CHECK: .debug_alloc PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 AC 0 0 0
|
|
# CHECK-NEXT: .debug_nonalloc PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 0 0 1
|
|
# CHECK-NEXT: .debugx PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 0 0 1
|
|
# CHECK-NEXT: nodebug PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 C 0 0 0
|
|
|
|
# RUN: llvm-objcopy --compress-sections '.debug*=none' %t %t2.de
|
|
# RUN: llvm-readelf -S -x .debug_alloc -x .debug_nonalloc -x .debugx %t2.de | FileCheck %s --check-prefix=CHECK2
|
|
|
|
# CHECK2: Name Type Address Off Size ES Flg Lk Inf Al
|
|
# CHECK2: .debug_alloc PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 A 0 0 1
|
|
# CHECK2-NEXT: .debug_nonalloc PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 0 0 1
|
|
# CHECK2-NEXT: .debugx PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 0 0 1
|
|
# CHECK2-NEXT: nodebug PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 C 0 0 0
|
|
|
|
# CHECK2: Hex dump of section '.debug_alloc':
|
|
# CHECK2-NEXT: 0x00000000 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
# CHECK2-NEXT: 0x00000010 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
# CHECK2-NEXT: 0x00000020 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
# CHECK2-NEXT: 0x00000030 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
# CHECK2-EMPTY:
|
|
# CHECK2: Hex dump of section '.debug_nonalloc':
|
|
# CHECK2-NEXT: 0x00000000 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
# CHECK2-NEXT: 0x00000010 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
# CHECK2-NEXT: 0x00000020 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
# CHECK2-NEXT: 0x00000030 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
# CHECK2-EMPTY:
|
|
# CHECK2-NEXT: Hex dump of section '.debugx':
|
|
# CHECK2-NEXT: 0x00000000 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
# CHECK2-NEXT: 0x00000010 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
# CHECK2-NEXT: 0x00000020 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
# CHECK2-NEXT: 0x00000030 2a000000 00000000 2a000000 00000000 *.......*.......
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: .debug_alloc
|
|
Type: SHT_PROGBITS
|
|
Flags: [ SHF_ALLOC, SHF_COMPRESSED ]
|
|
Content: 010000000000000040000000000000000100000000000000789cd36280002d3269002f800151
|
|
- Name: .debug_nonalloc
|
|
Type: SHT_PROGBITS
|
|
Flags: [ SHF_COMPRESSED ]
|
|
Content: 010000000000000040000000000000000100000000000000789cd36280002d3269002f800151
|
|
- Name: .debugx
|
|
Type: SHT_PROGBITS
|
|
Flags: [ SHF_COMPRESSED ]
|
|
Content: 010000000000000040000000000000000100000000000000789cd36280002d3269002f800151
|
|
- Name: nodebug
|
|
Type: SHT_PROGBITS
|
|
Flags: [ SHF_COMPRESSED ]
|
|
Content: 010000000000000040000000000000000100000000000000789cd36280002d3269002f800151
|