* GNU ld places non-SHF_ALLOC sections after SHF_ALLOC sections. This has the advantage that the file offsets of a non-SHF_ALLOC cannot be contained in a PT_LOAD. This patch matches the behavior. * For non-SHF_ALLOC non-orphan sections, GNU ld may assign non-zero sh_addr and treat them similar to SHT_NOBITS (not advance location counter). This is an alternative approach to what we have done in D85100. By placing non-SHF_ALLOC sections at the end, we can drop special cases in createSection and findOrphanPos added by D85100. Different from GNU ld, we set sh_addr to 0 for non-SHF_ALLOC sections. 0 arguably is better because non-SHF_ALLOC sections don't appear in the memory image. ELF spec says: > sh_addr - If the section will appear in the memory image of a process, this > member gives the address at which the section's first byte should > reside. Otherwise, the member contains 0. D85100 appeared to take a detour. If we take a combined view on D85100 and this patch, the overall complexity slightly increases (one more 3-line loop) and compatibility with GNU ld improves. The behavior we don't want to match is the special treatment of .symtab .shstrtab .strtab: they can be matched in LLD but not in GNU ld. Reviewed By: jhenderson, psmith Differential Revision: https://reviews.llvm.org/D85867
60 lines
1.3 KiB
Plaintext
60 lines
1.3 KiB
Plaintext
# REQUIRES: x86
|
|
# RUN: echo '.section .foo,"a"; .quad 0; .section .zed,"aM",@progbits,1; .byte 0' > %t.s
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t.s -o %t.o
|
|
|
|
MEMORY {
|
|
ram (rwx): org = 0x1, len = 96K
|
|
}
|
|
|
|
SECTIONS {
|
|
.foo : ALIGN(8) {
|
|
*(.foo)
|
|
} > ram
|
|
|
|
.zed : {
|
|
*(.zed)
|
|
} > ram
|
|
}
|
|
|
|
# RUN: ld.lld %t.o -o %t --script %s
|
|
# RUN: llvm-readobj --sections %t | FileCheck %s
|
|
|
|
# CHECK: Name: .foo
|
|
# CHECK-NEXT: Type: SHT_PROGBITS
|
|
# CHECK-NEXT: Flags [
|
|
# CHECK-NEXT: SHF_ALLOC
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: Address: 0x8
|
|
# CHECK-NEXT: Offset: 0x1008
|
|
# CHECK-NEXT: Size: 8
|
|
|
|
# CHECK: Name: .zed
|
|
# CHECK-NEXT: Type: SHT_PROGBITS
|
|
# CHECK-NEXT: Flags [
|
|
# CHECK-NEXT: SHF_ALLOC
|
|
# CHECK-NEXT: SHF_MERGE
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: Address: 0x10
|
|
# CHECK-NEXT: Offset: 0x1010
|
|
# CHECK-NEXT: Size: 1
|
|
|
|
# CHECK: Name: .text
|
|
# CHECK-NEXT: Type: SHT_PROGBITS
|
|
# CHECK-NEXT: Flags [
|
|
# CHECK-NEXT: SHF_ALLOC
|
|
# CHECK-NEXT: SHF_EXECINSTR
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: Address: 0x14
|
|
# CHECK-NEXT: Offset: 0x1014
|
|
# CHECK-NEXT: Size: 0
|
|
|
|
# CHECK: Name: .comment
|
|
# CHECK-NEXT: Type: SHT_PROGBITS
|
|
# CHECK-NEXT: Flags [
|
|
# CHECK-NEXT: SHF_MERGE
|
|
# CHECK-NEXT: SHF_STRINGS
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: Address: 0x0
|
|
# CHECK-NEXT: Offset: 0x1014
|
|
# CHECK-NEXT: Size: 8
|