* 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
23 lines
660 B
Plaintext
23 lines
660 B
Plaintext
# REQUIRES: x86
|
|
## The address of a symbol assignment after a non-SHF_ALLOC section equals the
|
|
## end address of the last SHF_ALLOC section.
|
|
|
|
# RUN: echo '.section .nonalloc,""; .quad 0' \
|
|
# RUN: | llvm-mc -filetype=obj -triple=x86_64-unknown-linux - -o %t
|
|
# RUN: ld.lld -o %t2 --script %s %t
|
|
# RUN: llvm-objdump --section-headers -t %t2 | FileCheck %s
|
|
|
|
# CHECK: Sections:
|
|
# CHECK: .text 00000000 0000000000000120
|
|
# CHECK: .nonalloc 00000008 0000000000000000
|
|
|
|
# CHECK: SYMBOL TABLE:
|
|
# CHECK: 0000000000000120 g .nonalloc 0000000000000000 Sym
|
|
|
|
SECTIONS {
|
|
. = SIZEOF_HEADERS;
|
|
.text : { *(.text) }
|
|
.nonalloc : { *(.nonalloc) }
|
|
Sym = .;
|
|
}
|