Skip to content

Commit 6e1f438

Browse files
committed
[ELF] Improve --ro-rosegment/--omagic/--nmagic tests
Notably, test that --ro-rosegment with a linker script may unnecessarily make a read-only PT_LOAD executable.
1 parent 4759890 commit 6e1f438

File tree

1 file changed

+59
-141
lines changed

1 file changed

+59
-141
lines changed

lld/test/ELF/segments.s

Lines changed: 59 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -1,157 +1,75 @@
11
# REQUIRES: x86
2-
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
2+
# RUN: rm -rf %t && split-file %s %t && cd %t
3+
# RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o
34

4-
# RUN: ld.lld %t -o %t1
5-
# RUN: llvm-readobj --program-headers %t1 | FileCheck --check-prefix=ROSEGMENT %s
6-
# RUN: ld.lld --no-rosegment --rosegment %t -o - | cmp - %t1
7-
# RUN: ld.lld --omagic --no-omagic %t -o - | cmp - %t1
5+
# RUN: ld.lld a.o -o a
6+
# RUN: llvm-readelf -l a | FileCheck --check-prefix=ROSEGMENT %s
7+
# RUN: ld.lld --no-rosegment --rosegment a.o -o - | cmp - a
8+
# RUN: ld.lld --omagic --no-omagic a.o -o - | cmp - a
89

9-
# ROSEGMENT: ProgramHeader {
10-
# ROSEGMENT: Type: PT_LOAD
11-
# ROSEGMENT-NEXT: Offset: 0x0
12-
# ROSEGMENT-NEXT: VirtualAddress:
13-
# ROSEGMENT-NEXT: PhysicalAddress:
14-
# ROSEGMENT-NEXT: FileSize:
15-
# ROSEGMENT-NEXT: MemSize:
16-
# ROSEGMENT-NEXT: Flags [
17-
# ROSEGMENT-NEXT: PF_R
18-
# ROSEGMENT-NEXT: ]
19-
# ROSEGMENT-NEXT: Alignment: 4096
20-
# ROSEGMENT-NEXT: }
21-
# ROSEGMENT-NEXT: ProgramHeader {
22-
# ROSEGMENT-NEXT: Type: PT_LOAD
23-
# ROSEGMENT-NEXT: Offset: 0x15C
24-
# ROSEGMENT-NEXT: VirtualAddress:
25-
# ROSEGMENT-NEXT: PhysicalAddress:
26-
# ROSEGMENT-NEXT: FileSize:
27-
# ROSEGMENT-NEXT: MemSize:
28-
# ROSEGMENT-NEXT: Flags [
29-
# ROSEGMENT-NEXT: PF_R
30-
# ROSEGMENT-NEXT: PF_X
31-
# ROSEGMENT-NEXT: ]
32-
# ROSEGMENT-NEXT: Alignment: 4096
33-
# ROSEGMENT-NEXT: }
34-
# ROSEGMENT-NEXT: ProgramHeader {
35-
# ROSEGMENT-NEXT: Type: PT_LOAD
36-
# ROSEGMENT-NEXT: Offset: 0x15E
37-
# ROSEGMENT-NEXT: VirtualAddress:
38-
# ROSEGMENT-NEXT: PhysicalAddress:
39-
# ROSEGMENT-NEXT: FileSize: 1
40-
# ROSEGMENT-NEXT: MemSize: 1
41-
# ROSEGMENT-NEXT: Flags [
42-
# ROSEGMENT-NEXT: PF_R
43-
# ROSEGMENT-NEXT: PF_W
44-
# ROSEGMENT-NEXT: ]
45-
# ROSEGMENT-NEXT: Alignment: 4096
46-
# ROSEGMENT-NEXT: }
10+
# ROSEGMENT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
11+
# ROSEGMENT-NEXT: PHDR 0x000040 0x0000000000200040 0x0000000000200040 0x000118 0x000118 R 0x8
12+
# ROSEGMENT-NEXT: LOAD 0x000000 0x0000000000200000 0x0000000000200000 0x00015a 0x00015a R 0x1000
13+
# ROSEGMENT-NEXT: LOAD 0x00015c 0x000000000020115c 0x000000000020115c 0x000003 0x000003 R E 0x1000
14+
# ROSEGMENT-NEXT: LOAD 0x00015f 0x000000000020215f 0x000000000020215f 0x000002 0x000002 RW 0x1000
15+
# ROSEGMENT-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0
4716

48-
# RUN: ld.lld --no-rosegment %t -o %t2
49-
# RUN: llvm-readobj --program-headers %t2 | FileCheck --check-prefix=NOROSEGMENT %s
17+
# RUN: ld.lld --no-rosegment a.o -o noro
18+
# RUN: llvm-readelf -l noro | FileCheck --check-prefix=NOROSEGMENT %s
5019

51-
# NOROSEGMENT: ProgramHeader {
52-
# NOROSEGMENT: Type: PT_LOAD
53-
# NOROSEGMENT-NEXT: Offset: 0x0
54-
# NOROSEGMENT-NEXT: VirtualAddress:
55-
# NOROSEGMENT-NEXT: PhysicalAddress:
56-
# NOROSEGMENT-NEXT: FileSize:
57-
# NOROSEGMENT-NEXT: MemSize:
58-
# NOROSEGMENT-NEXT: Flags [
59-
# NOROSEGMENT-NEXT: PF_R
60-
# NOROSEGMENT-NEXT: PF_X
61-
# NOROSEGMENT-NEXT: ]
62-
# NOROSEGMENT-NEXT: Alignment: 4096
63-
# NOROSEGMENT-NEXT: }
64-
# NOROSEGMENT-NEXT: ProgramHeader {
65-
# NOROSEGMENT-NEXT: Type: PT_LOAD
66-
# NOROSEGMENT-NEXT: Offset: 0x126
67-
# NOROSEGMENT-NEXT: VirtualAddress:
68-
# NOROSEGMENT-NEXT: PhysicalAddress:
69-
# NOROSEGMENT-NEXT: FileSize:
70-
# NOROSEGMENT-NEXT: MemSize:
71-
# NOROSEGMENT-NEXT: Flags [
72-
# NOROSEGMENT-NEXT: PF_R
73-
# NOROSEGMENT-NEXT: PF_W
74-
# NOROSEGMENT-NEXT: ]
75-
# NOROSEGMENT-NEXT: Alignment: 4096
76-
# NOROSEGMENT-NEXT: }
77-
# NOROSEGMENT-NEXT: ProgramHeader {
78-
# NOROSEGMENT-NEXT: Type: PT_GNU_STACK
20+
# NOROSEGMENT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
21+
# NOROSEGMENT-NEXT: PHDR 0x000040 0x0000000000200040 0x0000000000200040 0x0000e0 0x0000e0 R 0x8
22+
# NOROSEGMENT-NEXT: LOAD 0x000000 0x0000000000200000 0x0000000000200000 0x000127 0x000127 R E 0x1000
23+
# NOROSEGMENT-NEXT: LOAD 0x000127 0x0000000000201127 0x0000000000201127 0x000002 0x000002 RW 0x1000
24+
# NOROSEGMENT-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0
7925

80-
# RUN: ld.lld -N %t -o %t3
81-
# RUN: llvm-readobj --program-headers %t3 | FileCheck --check-prefix=OMAGIC %s
82-
# RUN: ld.lld --omagic %t -o %t3
83-
# RUN: llvm-readobj --program-headers %t3 | FileCheck --check-prefix=OMAGIC %s
26+
# RUN: ld.lld --no-rosegment a.o -T a.lds -o noro1
27+
# RUN: llvm-readelf -l noro1 | FileCheck --check-prefix=NOROSEGMENT1 %s
8428

85-
# OMAGIC: ProgramHeader {
86-
# OMAGIC: Type: PT_LOAD
87-
# OMAGIC-NEXT: Offset: 0xB0
88-
# OMAGIC-NEXT: VirtualAddress:
89-
# OMAGIC-NEXT: PhysicalAddress:
90-
# OMAGIC-NEXT: FileSize:
91-
# OMAGIC-NEXT: MemSize:
92-
# OMAGIC-NEXT: Flags [
93-
# OMAGIC-NEXT: PF_R
94-
# OMAGIC-NEXT: PF_W
95-
# OMAGIC-NEXT: PF_X
96-
# OMAGIC-NEXT: ]
97-
# OMAGIC-NEXT: Alignment: 4
98-
# OMAGIC-NEXT: }
99-
# OMAGIC-NEXT: ProgramHeader {
100-
# OMAGIC-NEXT: Type: PT_GNU_STACK
29+
# NOROSEGMENT1: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
30+
# NOROSEGMENT1-NEXT: LOAD 0x001000 0x0000000000000000 0x0000000000000000 0x000007 0x000007 R E 0x1000
31+
# NOROSEGMENT1-NEXT: LOAD 0x001007 0x0000000000000007 0x0000000000000007 0x000001 0x000001 RW 0x1000
32+
# NOROSEGMENT1-NEXT: LOAD 0x001008 0x0000000000000008 0x0000000000000008 0x000001 0x000001 R E 0x1000
33+
# NOROSEGMENT1-NEXT: LOAD 0x001009 0x0000000000000009 0x0000000000000009 0x000001 0x000001 RW 0x1000
34+
# NOROSEGMENT1-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0
10135

102-
# RUN: ld.lld -n %t -o %t4
103-
# RUN: llvm-readobj --program-headers %t4 | FileCheck --check-prefix=NMAGIC %s
104-
# RUN: ld.lld --nmagic %t -o %t4
105-
# RUN: llvm-readobj --program-headers %t4 | FileCheck --check-prefix=NMAGIC %s
36+
# RUN: ld.lld -N a.o -o omagic
37+
# RUN: llvm-readelf -l omagic | FileCheck --check-prefix=OMAGIC %s
38+
# RUN: ld.lld --omagic a.o -o - | cmp - omagic
10639

107-
# NMAGIC: ProgramHeader {
108-
# NMAGIC-NEXT: Type: PT_LOAD
109-
# NMAGIC-NEXT: Offset: 0x120
110-
# NMAGIC-NEXT: VirtualAddress:
111-
# NMAGIC-NEXT: PhysicalAddress:
112-
# NMAGIC-NEXT: FileSize: 1
113-
# NMAGIC-NEXT: MemSize: 1
114-
# NMAGIC-NEXT: Flags [
115-
# NMAGIC-NEXT: PF_R
116-
# NMAGIC-NEXT: ]
117-
# NMAGIC-NEXT: Alignment: 1
118-
# NMAGIC-NEXT: }
119-
# NMAGIC-NEXT: ProgramHeader {
120-
# NMAGIC-NEXT: Type: PT_LOAD
121-
# NMAGIC-NEXT: Offset: 0x124
122-
# NMAGIC-NEXT: VirtualAddress:
123-
# NMAGIC-NEXT: PhysicalAddress:
124-
# NMAGIC-NEXT: FileSize: 2
125-
# NMAGIC-NEXT: MemSize: 2
126-
# NMAGIC-NEXT: Flags [
127-
# NMAGIC-NEXT: PF_R
128-
# NMAGIC-NEXT: PF_X
129-
# NMAGIC-NEXT: ]
130-
# NMAGIC-NEXT: Alignment: 4
131-
# NMAGIC-NEXT: }
132-
# NMAGIC-NEXT: ProgramHeader {
133-
# NMAGIC-NEXT: Type: PT_LOAD (0x1)
134-
# NMAGIC-NEXT: Offset: 0x126
135-
# NMAGIC-NEXT: VirtualAddress:
136-
# NMAGIC-NEXT: PhysicalAddress:
137-
# NMAGIC-NEXT: FileSize: 1
138-
# NMAGIC-NEXT: MemSize: 1
139-
# NMAGIC-NEXT: Flags [
140-
# NMAGIC-NEXT: PF_R
141-
# NMAGIC-NEXT: PF_W
142-
# NMAGIC-NEXT: ]
143-
# NMAGIC-NEXT: Alignment: 1
144-
# NMAGIC-NEXT: }
40+
# OMAGIC: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
41+
# OMAGIC-NEXT: LOAD 0x0000b0 0x00000000002000b0 0x00000000002000b0 0x000009 0x000009 RWE 0x4
42+
# OMAGIC-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0
14543

44+
# RUN: ld.lld -n a.o -o nmagic
45+
# RUN: llvm-readelf -l nmagic | FileCheck --check-prefix=NMAGIC %s
46+
# RUN: ld.lld --nmagic a.o -o - | cmp nmagic -
47+
48+
# NMAGIC: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
49+
# NMAGIC-NEXT: LOAD 0x000120 0x0000000000200120 0x0000000000200120 0x000002 0x000002 R 0x1
50+
# NMAGIC-NEXT: LOAD 0x000124 0x0000000000200124 0x0000000000200124 0x000003 0x000003 R E 0x4
51+
# NMAGIC-NEXT: LOAD 0x000127 0x0000000000200127 0x0000000000200127 0x000002 0x000002 RW 0x1
52+
# NMAGIC-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0
53+
54+
#--- a.s
14655
.global _start
14756
_start:
14857
nop
14958

150-
.section .ro,"a"
151-
nop
59+
.section .ro1,"a"; .byte 1
60+
.section .rw1,"aw"; .byte 3
61+
.section .rx1,"ax"; .byte 2
15262

153-
.section .rw,"aw"
154-
nop
63+
.section .ro2,"a"; .byte 1
64+
.section .rw2,"aw"; .byte 3
65+
.section .rx2,"ax"; .byte 2
15566

156-
.section .rx,"ax"
157-
nop
67+
#--- a.lds
68+
SECTIONS {
69+
.ro1 : {}
70+
.text : {}
71+
.rx : { *(.rx*) }
72+
.rw1 : {}
73+
.ro2 : {}
74+
.rw2 : {}
75+
}

0 commit comments

Comments
 (0)