1# REQUIRES: x86
2# RUN: rm -rf %t && split-file %s %t
3# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/a.s -o %t/a.o
4# RUN: llvm-mc -filetype=obj -triple=x86_64 %p/Inputs/shared.s -o %t/b.o
5# RUN: ld.lld -shared -soname=b %t/b.o -o %t/b.so
6
7## With relro or without DATA_SEGMENT_RELRO_END just aligns to
8## page boundary.
9
10# RUN: ld.lld --hash-style=sysv -z norelro %t/a.o %t/b.so -T %t/1.t -o %t/a1
11# RUN: llvm-readelf -S -l %t/a1 | FileCheck %s --check-prefixes=CHECK,CHECK1
12
13# RUN: ld.lld --hash-style=sysv -z relro %t/a.o %t/b.so -T %t/1.t -o %t/a2
14# RUN: llvm-readelf -S -l %t/a2 | FileCheck %s --check-prefixes=CHECK,CHECK2
15
16# CHECK:      Name           Type     Address          Off      Size ES Flg
17# CHECK-NEXT:                NULL     {{.*}}
18# CHECK:      .dynamic       DYNAMIC  0000000000001000 001000 0000f0 10  WA
19# CHECK-NEXT: .got           PROGBITS 00000000000010f0 0010f0 000008 00  WA
20# CHECK-NEXT: __libc_atexit  PROGBITS 0000000000002000 002000 000008 00  WA
21# CHECK-NEXT: .got.plt       PROGBITS 0000000000002008 002008 000020 00  WA
22
23# CHECK1:      Program Headers:
24# CHECK1-NOT:  GNU_RELRO
25
26# CHECK2:      Program Headers:
27# CHECK2-NEXT:   Type
28# CHECK2-NEXT:   PHDR
29# CHECK2-NEXT:   LOAD
30# CHECK2-NEXT:   LOAD
31# CHECK2-NEXT:   LOAD
32# CHECK2-NEXT:   LOAD
33# CHECK2-NEXT:   DYNAMIC
34# CHECK2-NEXT:   GNU_RELRO
35# CHECK2-NEXT:   GNU_STACK
36
37# CHECK2:      Section to Segment mapping:
38# CHECK2:        06     .dynamic .got {{$}}
39
40# RUN: sed '/DATA_SEGMENT_RELRO_END/d' %t/1.t > %t/2.t
41# RUN: ld.lld %t/a.o %t/b.so -T %t/2.t -o /dev/null
42
43#--- a.s
44.global _start
45_start:
46  .long bar
47  jmp *bar2@GOTPCREL(%rip)
48
49.section .data,"aw"
50.quad 0
51
52.zero 4
53.section .foo,"aw"
54.section .bss,"",@nobits
55
56.section __libc_atexit,"aw",@progbits
57.dc.a __libc_atexit
58
59#--- 1.t
60SECTIONS {
61  . = SIZEOF_HEADERS;
62
63  .plt  : { *(.plt) }
64  .text : { *(.text) }
65
66  . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
67
68  .dynamic : { *(.dynamic) }
69  .got : { *(.got) }
70
71  . = DATA_SEGMENT_RELRO_END (1 ? 24 : 0, .);
72
73  __libc_atexit : { *(__libc_atexit) }
74  .got.plt : { *(.got.plt) }
75  .data : { *(.data) }
76  .bss : { *(.bss) }
77
78  . = DATA_SEGMENT_END (.);
79
80  .comment 0 : { *(.comment) }
81}
82