aboutsummaryrefslogtreecommitdiff
path: root/lld/test/ELF/randomize-section-padding.test
blob: af8e4f14981cd1c046e3af4ee7c1d14c9d489617 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# REQUIRES: x86
# RUN: split-file %s %t
# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/a.s -o %t/a.o

## --randomize-section-padding= inserts segment offset padding and pre-section
## padding, and does not affect flags. Segment offset padding is only inserted
## when PT_LOAD changes, as shown by .bss size (.data and .bss share a PT_LOAD).

# RUN: ld.lld --randomize-section-padding=6 %t/a.o -o %t/a.out
# RUN: llvm-readelf -sS -x .rodata -x .text -x .data %t/a.out | FileCheck --check-prefix=PAD6 %s

# PAD6:      .rodata           PROGBITS        0000000000200158 000158 000b8d 00   A  0   0  1
# PAD6-NEXT: .text             PROGBITS        0000000000201ce8 000ce8 000270 00  AX  0   0  4
# PAD6-NEXT: .data             PROGBITS        0000000000202f58 000f58 000941 00  WA  0   0  1
# PAD6-NEXT: .bss              NOBITS          0000000000203899 001899 000003 00  WA  0   0  1

# PAD6: 0000000000203899     0 NOTYPE  LOCAL  DEFAULT     4 a
# PAD6: 000000000020389a     0 NOTYPE  LOCAL  DEFAULT     4 b
# PAD6: 000000000020389b     0 NOTYPE  LOCAL  DEFAULT     4 c

# PAD6: Hex dump of section '.rodata':
# PAD6: 0x00200cd8 00000000 00000000 00000102 03
# PAD6: Hex dump of section '.text':
# PAD6: 0x00201f48 cccccccc cccccccc cccccccc 0405cc06
# PAD6: Hex dump of section '.data':
# PAD6: 0x00203888 00000000 00000000 00000000 00000708
# PAD6: 0x00203898 09

## Size of segment offset padding and location of pre-section padding is
## dependent on the seed.

# RUN: ld.lld --randomize-section-padding=46 %t/a.o -o %t/a.out
# RUN: llvm-readelf -sS -x .rodata -x .text -x .data %t/a.out | FileCheck --check-prefix=PAD46 %s

# PAD46:      .rodata           PROGBITS        0000000000200158 000158 000cc0 00   A  0   0  1
# PAD46-NEXT: .text             PROGBITS        0000000000201e18 000e18 0009bf 00  AX  0   0  4
# PAD46-NEXT: .data             PROGBITS        00000000002037d7 0017d7 000540 00  WA  0   0  1
# PAD46-NEXT: .bss              NOBITS          0000000000203d17 001d17 000004 00  WA  0   0  1

# PAD46: 0000000000203d17     0 NOTYPE  LOCAL  DEFAULT     4 a
# PAD46: 0000000000203d18     0 NOTYPE  LOCAL  DEFAULT     4 b
# PAD46: 0000000000203d1a     0 NOTYPE  LOCAL  DEFAULT     4 c

# PAD46: Hex dump of section '.rodata':
# PAD46: 0x00200e08 00000000 00000000 00000000 00010203
# PAD46: Hex dump of section '.text':
# PAD46: 0x002027c8 cccccccc cccccccc cccccccc 040506
# PAD46: Hex dump of section '.data':
# PAD46: 0x00203d07 00000000 00000000 00000000 07000809

## When there are multiple InputSectionDescriptions for an output section,
## segment offset padding is inserted in the first InputSectionDescription.

# RUN: ld.lld --randomize-section-padding=46 %t/a.o %t/a.lds -o %t/a.out

# RUN: llvm-readelf -sS -x .rodata -x .text -x .data %t/a.out | FileCheck --check-prefix=PAD46-LDS %s

# PAD46-LDS:      .rodata           PROGBITS        0000000000000158 000158 000cc0 00   A  0   0  1
# PAD46-LDS-NEXT: .text             PROGBITS        0000000000001000 001000 0009c0 00  AX  0   0  4
# PAD46-LDS-NEXT: .data             PROGBITS        0000000000002000 002000 000540 00  WA  0   0  1
# PAD46-LDS-NEXT: .bss              NOBITS          0000000000002540 002540 000004 00  WA  0   0  1

# PAD46-LDS: 0000000000002543     0 NOTYPE  LOCAL  DEFAULT     4 a
# PAD46-LDS: 0000000000002541     0 NOTYPE  LOCAL  DEFAULT     4 b
# PAD46-LDS: 0000000000002540     0 NOTYPE  LOCAL  DEFAULT     4 c

# PAD46-LDS: Hex dump of section '.rodata':
# PAD46-LDS: 0x00000e08 00000000 00000000 00000000 00030201 ................
# PAD46-LDS: Hex dump of section '.text':
# PAD46-LDS: 0x000019b0 cccccccc cccccccc cccc0605 04cccccc ................
# PAD46-LDS: Hex dump of section '.data':
# PAD46-LDS: 0x00002530 00000000 00000000 00000000 09000807 ................

#--- a.s

.section .rodata.a,"a",@progbits
.byte 1

.section .rodata.b,"a",@progbits
.byte 2

.section .rodata.c,"a",@progbits
.byte 3

.section .text.a,"ax",@progbits
.byte 4

.section .text.b,"ax",@progbits
.byte 5

.section .text.c,"ax",@progbits
.byte 6

.section .data.a,"aw",@progbits
.byte 7

.section .data.b,"aw",@progbits
.byte 8

.section .data.c,"aw",@progbits
.byte 9

.section .bss.a,"a",@nobits
a:
.zero 1

.section .bss.b,"a",@nobits
b:
.zero 1

.section .bss.c,"a",@nobits
c:
.zero 1

#--- a.lds

SECTIONS {
  . = SIZEOF_HEADERS;
  .rodata : { *(.rodata.c) *(.rodata.b) *(.rodata.a) }
  . = ALIGN(CONSTANT(MAXPAGESIZE));
  .text : { *(.text.c) *(.text.b) *(.text.a) }
  . = ALIGN(CONSTANT(MAXPAGESIZE));
  .data : { *(.data.c) *(.data.b) *(.data.a) }
  .bss : { *(.bss.c) *(.bss.b) *(.bss.a) }
}