removeEmptyPTLoad() removes empty (p_memsz=0) PT_LOAD segments. In assignFileOffsets(), setFileOffset() unnecessarily advances file offsets for containing empty sections. This is exposed by arm Linux kernel's multi_v5_defconfig (see https://bugs.llvm.org/show_bug.cgi?id=45632) ``` ld.lld (max-page-size=65536): [34] .init.data PROGBITS c0c24000 c34000 0128ac 00 WA 0 0 4096 [35] .text_itcm PROGBITS fffe0000 c50000 000000 00 WA 0 0 1 [36] .data_dtcm PROGBITS fffe8000 c58000 000000 00 WA 0 0 1 [37] .data PROGBITS c0c38000 c58000 0647a0 00 WA 0 0 32 arm-linux-gnueabi-ld (max-page-size=65536): [23] .init.data PROGBITS c0c12000 c22000 0128ac 00 WA 0 0 4096 [24] .text_itcm PROGBITS fffe0000 ca2558 000000 00 W 0 0 1 [25] .data_dtcm PROGBITS fffe8000 ca2558 000000 00 W 0 0 1 [26] .data PROGBITS c0c26000 c36000 0647a0 00 WA 0 0 32 ``` This patch clears OutputSection::ptLoad if ptLoad is removed by removeEmptyPTLoad(). Conceptually this removes "dangling" references. Reviewed By: psmith Differential Revision: https://reviews.llvm.org/D79254
29 lines
1.1 KiB
ArmAsm
29 lines
1.1 KiB
ArmAsm
# REQUIRES: x86
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
|
|
# RUN: echo "SECTIONS { \
|
|
# RUN: .sec1 (NOLOAD) : { . += 1; } \
|
|
# RUN: .bss : { *(.bss) } \
|
|
# RUN: };" > %t.script
|
|
# RUN: ld.lld %t.o -T %t.script -o %t
|
|
# RUN: llvm-readelf -S -l %t | FileCheck %s
|
|
|
|
## If a SHT_NOBITS section is the only section of a PT_LOAD segment,
|
|
## p_offset will be set to the sh_offset field of the section. Check we align
|
|
## sh_offset to sh_addr modulo max-page-size, so that p_vaddr=p_offset (mod
|
|
## p_align).
|
|
|
|
# CHECK: Name Type Address Off Size
|
|
# CHECK-NEXT: NULL 0000000000000000 000000 000000
|
|
# CHECK-NEXT: .text PROGBITS 0000000000000000 000158 000000
|
|
# CHECK-NEXT: .sec1 NOBITS 0000000000000000 000158 000001
|
|
# CHECK-NEXT: .bss NOBITS 0000000000000400 000400 000001
|
|
|
|
# CHECK: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
|
|
# CHECK-NEXT: LOAD 0x000400 0x0000000000000400 0x0000000000000400 0x000000 0x000001 RW 0x1000
|
|
|
|
# CHECK: 00 .bss {{$}}
|
|
|
|
.bss
|
|
.p2align 10
|
|
.byte 0
|