1
1
# REQUIRES: x86
2
- # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/data-segment-relro.s -o %t1.o
3
- # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/shared.s -o %t2.o
4
- # RUN: ld.lld -shared %t2.o -o %t2.so
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
5
6
6
7
## With relro or without DATA_SEGMENT_RELRO_END just aligns to
7
8
## page boundary.
8
9
9
- # RUN: ld.lld --hash-style=sysv -z norelro %t1 .o %t2 .so --script %s -o %t
10
- # RUN: llvm-readobj -S %t | FileCheck %s
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
11
12
12
- # RUN: ld.lld --hash-style=sysv -z relro %t1 .o %t2 .so --script %s -o %t2
13
- # RUN: llvm-readobj -S %t2 | FileCheck %s
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
14
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
15
60
SECTIONS {
16
61
. = SIZEOF_HEADERS;
17
62
@@ -25,42 +70,12 @@ SECTIONS {
25
70
26
71
. = DATA_SEGMENT_RELRO_END (1 ? 24 : 0, .);
27
72
73
+ __libc_atexit : { *(__libc_atexit) }
28
74
.got.plt : { *(.got.plt) }
29
75
.data : { *(.data) }
30
76
.bss : { *(.bss) }
31
77
32
78
. = DATA_SEGMENT_END (.);
33
- }
34
79
35
- # CHECK: Section {
36
- # CHECK: Index:
37
- # CHECK: Name: .got
38
- # CHECK-NEXT: Type: SHT_PROGBITS
39
- # CHECK-NEXT: Flags [
40
- # CHECK-NEXT: SHF_ALLOC
41
- # CHECK-NEXT: SHF_WRITE
42
- # CHECK-NEXT: ]
43
- # CHECK-NEXT: Address: 0x10F0
44
- # CHECK-NEXT: Offset: 0x10F0
45
- # CHECK-NEXT: Size:
46
- # CHECK-NEXT: Link:
47
- # CHECK-NEXT: Info:
48
- # CHECK-NEXT: AddressAlignment:
49
- # CHECK-NEXT: EntrySize:
50
- # CHECK-NEXT: }
51
- # CHECK-NEXT: Section {
52
- # CHECK-NEXT: Index:
53
- # CHECK-NEXT: Name: .got.plt
54
- # CHECK-NEXT: Type: SHT_PROGBITS
55
- # CHECK-NEXT: Flags [
56
- # CHECK-NEXT: SHF_ALLOC
57
- # CHECK-NEXT: SHF_WRITE
58
- # CHECK-NEXT: ]
59
- # CHECK-NEXT: Address: 0x2000
60
- # CHECK-NEXT: Offset: 0x2000
61
- # CHECK-NEXT: Size:
62
- # CHECK-NEXT: Link:
63
- # CHECK-NEXT: Info:
64
- # CHECK-NEXT: AddressAlignment:
65
- # CHECK-NEXT: EntrySize:
66
- # CHECK-NEXT: }
80
+ .comment 0 : { *(.comment) }
81
+ }
0 commit comments