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) } }