119 lines
3.1 KiB
Plaintext
119 lines
3.1 KiB
Plaintext
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) }
|
|
}
|