REQUIRES: x86
RUN: split-file %s %ts
RUN: llvm-mc -filetype=obj -triple=x86_64 %ts/s -o %t.o
## Check that despite having a lower sort rank, an orphan section '.init_array'
## is placed after '.data' and '.data2' and in the same memory region.
## Also check that a non-SHF_ALLOC orphan section '.nonalloc' is not placed in
## a memory region. Both defined memory regions are exhausted after all expected
## sections are added, thus, trying to put any unexpected section would lead to
## an error.
RUN: ld.lld -o %t -T %ts/t %t.o
RUN: llvm-readelf -S %t | FileCheck %s
CHECK: Name Type Address Off Size
CHECK: .text PROGBITS 0000000000008000 {{[0-9a-f]+}} 000004
CHECK: .data PROGBITS 0000000000009000 {{[0-9a-f]+}} 000008
CHECK: .data2 PROGBITS 0000000000009008 {{[0-9a-f]+}} 00000c
CHECK: .init_array INIT_ARRAY 0000000000009014 {{[0-9a-f]+}} 000010
CHECK: .nonalloc PROGBITS 0000000000000000 {{[0-9a-f]+}} 000010
## Check that attributes of memory regions are ignored for orphan sections when
## the anchor section specifies the memory region explicitly, This seems to
## contradict https://sourceware.org/binutils/docs/ld/MEMORY.html, but better
## resembles the way GNU ld actually works.
RUN: ld.lld -o %t2 -T %ts/t2 %t.o
RUN: llvm-readelf -S %t2 | FileCheck %s
## Same as the previous case, but now properties of sections conflict with
## memory region attributes. Still, orphan sections are placed in the same
## regions as their anchors.
RUN: ld.lld -o %t3 -T %ts/t3 %t.o
RUN: llvm-readelf -S %t3 | FileCheck %s
## Check that when memory regions for anchor sections are not specified
## explicitly and are selected by attributes, orphan sections are also assigned
## to memory regions by matching properties.
RUN: ld.lld -o %t4 -T %ts/t4 %t.o
RUN: llvm-readelf -S %t4 | FileCheck %s --check-prefix=CHECK4
CHECK4: Name Type Address Off Size
CHECK4: .text PROGBITS 0000000000008000 {{[0-9a-f]+}} 000004
CHECK4: .init_array INIT_ARRAY 0000000000009000 {{[0-9a-f]+}} 000010
CHECK4: .data PROGBITS 0000000000009010 {{[0-9a-f]+}} 000008
CHECK4: .data2 PROGBITS 0000000000009018 {{[0-9a-f]+}} 00000c
CHECK4: .nonalloc PROGBITS 0000000000000000 {{[0-9a-f]+}} 000010
#--- s
.text
.zero 4
.data
.zero 8
.section .data2,"aw",@progbits
.zero 0xc
.section .init_array,"aw",@init_array
.zero 0x10
.section .nonalloc,""
.zero 0x10
#--- t
MEMORY
{
TEXT : ORIGIN = 0x8000, LENGTH = 0x4
DATA : ORIGIN = 0x9000, LENGTH = 0x24
}
SECTIONS
{
.text : { *(.text) } > TEXT
.data : { *(.data) } > DATA
}
#--- t2
MEMORY
{
TEXT (rwx) : ORIGIN = 0x8000, LENGTH = 0x4
DATA (rwx) : ORIGIN = 0x9000, LENGTH = 0x24
}
SECTIONS
{
.text : { *(.text) } > TEXT
.data : { *(.data) } > DATA
}
#--- t3
MEMORY
{
TEXT (!w) : ORIGIN = 0x8000, LENGTH = 0x4
DATA (!w) : ORIGIN = 0x9000, LENGTH = 0x24
}
SECTIONS
{
.text : { *(.text) } > TEXT
.data : { *(.data) } > DATA
}
#--- t4
MEMORY
{
TEXT (rx) : ORIGIN = 0x8000, LENGTH = 0x4
DATA (w!x) : ORIGIN = 0x9000, LENGTH = 0x24
}
SECTIONS
{
.text : { *(.text) }
}