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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
| partitions.elf is a file containing a main partition and two loadable
partitions "part1" and "part2" (see https://lld.llvm.org/Partitions.html
for a description of partitions). This file tests that extracting the main
and loadable partitions produces a file with the correct headers and sections.
RUN: llvm-objcopy --extract-main-partition %p/Inputs/partitions.elf %t1
RUN: llvm-objcopy --extract-partition=part1 %p/Inputs/partitions.elf %t2
RUN: llvm-objcopy --extract-partition=part2 %p/Inputs/partitions.elf %t3
RUN: llvm-readelf --headers --sections --symbols %t1 | FileCheck --check-prefix=MAIN %s
RUN: llvm-readelf --headers --sections --symbols %t2 | FileCheck --check-prefix=PART1 %s
RUN: llvm-readelf --headers --sections --symbols %t3 | FileCheck --check-prefix=PART2 %s
MAIN: ELF Header:
MAIN-NEXT: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
MAIN-NEXT: Class: ELF64
MAIN-NEXT: Data: 2's complement, little endian
MAIN-NEXT: Version: 1 (current)
MAIN-NEXT: OS/ABI: UNIX - System V
MAIN-NEXT: ABI Version: 0x0
MAIN-NEXT: Type: EXEC (Executable file)
MAIN-NEXT: Machine: Advanced Micro Devices X86-64
MAIN-NEXT: Version: 0x1
MAIN-NEXT: Entry point address: 0x201000
MAIN-NEXT: Start of program headers: 64 (bytes into file)
MAIN-NEXT: Start of section headers: 12488 (bytes into file)
MAIN-NEXT: Flags: 0x0
MAIN-NEXT: Size of this header: 64 (bytes)
MAIN-NEXT: Size of program headers: 56 (bytes)
MAIN-NEXT: Number of program headers: 8
MAIN-NEXT: Size of section headers: 64 (bytes)
MAIN-NEXT: Number of section headers: 13
MAIN-NEXT: Section header string table index: 11
MAIN: Section Headers:
MAIN-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
MAIN-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
MAIN-NEXT: [ 1] .dynsym DYNSYM 0000000000200200 000200 000030 18 A 4 1 8
MAIN-NEXT: [ 2] .gnu.hash GNU_HASH 0000000000200230 000230 000020 00 A 1 0 8
MAIN-NEXT: [ 3] .hash HASH 0000000000200250 000250 000018 04 A 1 0 4
MAIN-NEXT: [ 4] .dynstr STRTAB 0000000000200268 000268 000014 00 A 0 0 1
MAIN-NEXT: [ 5] .rodata PROGBITS 000000000020027c 00027c 000018 00 A 0 0 4
MAIN-NEXT: [ 6] .text0 PROGBITS 0000000000201000 001000 000001 00 AX 0 0 1
MAIN-NEXT: [ 7] .dynamic DYNAMIC 0000000000202000 002000 000080 10 WA 4 0 8
MAIN-NEXT: [ 8] .part.end NOBITS 0000000000209000 003000 001000 00 WA 0 0 1
MAIN-NEXT: [ 9] .comment PROGBITS 0000000000000000 003000 000008 01 MS 0 0 1
MAIN-NEXT: [10] .symtab SYMTAB 0000000000000000 003008 000048 18 12 2 8
MAIN-NEXT: [11] .shstrtab STRTAB 0000000000000000 003050 000060 00 0 0 1
MAIN-NEXT: [12] .strtab STRTAB 0000000000000000 0030b0 000011 00 0 0 1
MAIN: Symbol table '.dynsym' contains 2 entries:
MAIN-NEXT: Num: Value Size Type Bind Vis Ndx Name
MAIN-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
MAIN-NEXT: 1: 0000000000201000 0 NOTYPE GLOBAL DEFAULT 6 _start
MAIN: Symbol table '.symtab' contains 3 entries:
MAIN-NEXT: Num: Value Size Type Bind Vis Ndx Name
MAIN-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
MAIN-NEXT: 1: 0000000000202000 0 NOTYPE LOCAL HIDDEN 7 _DYNAMIC
MAIN-NEXT: 2: 0000000000201000 0 NOTYPE GLOBAL DEFAULT 6 _start
MAIN: Program Headers:
MAIN-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
MAIN-NEXT: PHDR 0x000040 0x0000000000200040 0x0000000000200040 0x0001c0 0x0001c0 R 0x8
MAIN-NEXT: LOAD 0x000000 0x0000000000200000 0x0000000000200000 0x000294 0x000294 R 0x1000
MAIN-NEXT: LOAD 0x001000 0x0000000000201000 0x0000000000201000 0x000001 0x000001 R E 0x1000
MAIN-NEXT: LOAD 0x002000 0x0000000000202000 0x0000000000202000 0x000080 0x000080 RW 0x1000
MAIN-NEXT: LOAD 0x003000 0x0000000000209000 0x0000000000209000 0x000000 0x001000 RW 0x1000
MAIN-NEXT: DYNAMIC 0x002000 0x0000000000202000 0x0000000000202000 0x000080 0x000080 RW 0x8
MAIN-NEXT: GNU_RELRO 0x002000 0x0000000000202000 0x0000000000202000 0x000080 0x001000 R 0x1
MAIN-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x0
PART1: ELF Header:
PART1-NEXT: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
PART1-NEXT: Class: ELF64
PART1-NEXT: Data: 2's complement, little endian
PART1-NEXT: Version: 1 (current)
PART1-NEXT: OS/ABI: UNIX - System V
PART1-NEXT: ABI Version: 0x0
PART1-NEXT: Type: DYN (Shared object file)
PART1-NEXT: Machine: Advanced Micro Devices X86-64
PART1-NEXT: Version: 0x1
PART1-NEXT: Entry point address: 0x0
PART1-NEXT: Start of program headers: 64 (bytes into file)
PART1-NEXT: Start of section headers: 8336 (bytes into file)
PART1-NEXT: Flags: 0x0
PART1-NEXT: Size of this header: 64 (bytes)
PART1-NEXT: Size of program headers: 56 (bytes)
PART1-NEXT: Number of program headers: 7
PART1-NEXT: Size of section headers: 64 (bytes)
PART1-NEXT: Number of section headers: 11
PART1-NEXT: Section header string table index: 9
PART1: Section Headers:
PART1-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
PART1-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
PART1-NEXT: [ 1] .dynsym DYNSYM 00000000002031c8 0001c8 000030 18 A 4 1 8
PART1-NEXT: [ 2] .gnu.hash GNU_HASH 00000000002031f8 0001f8 000020 00 A 1 0 8
PART1-NEXT: [ 3] .hash HASH 0000000000203218 000218 000018 04 A 1 0 4
PART1-NEXT: [ 4] .dynstr STRTAB 0000000000203230 000230 00000a 00 A 0 0 1
PART1-NEXT: [ 5] .dynamic DYNAMIC 0000000000204000 001000 000090 10 WA 4 0 8
PART1-NEXT: [ 6] .bss1 NOBITS 0000000000205000 002000 000008 00 WA 0 0 1
PART1-NEXT: [ 7] .comment PROGBITS 0000000000000000 002000 000008 01 MS 0 0 1
PART1-NEXT: [ 8] .symtab SYMTAB 0000000000000000 002008 000030 18 10 1 8
PART1-NEXT: [ 9] .shstrtab STRTAB 0000000000000000 002038 00004d 00 0 0 1
PART1-NEXT: [10] .strtab STRTAB 0000000000000000 002085 000004 00 0 0 1
PART1: Symbol table '.dynsym' contains 2 entries:
PART1-NEXT: Num: Value Size Type Bind Vis Ndx Name
PART1-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
PART1-NEXT: 1: 0000000000205000 0 NOTYPE GLOBAL DEFAULT 15 g1
PART1: Symbol table '.symtab' contains 2 entries:
PART1-NEXT: Num: Value Size Type Bind Vis Ndx Name
PART1-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
PART1-NEXT: 1: 0000000000205000 0 NOTYPE GLOBAL DEFAULT 6 g1
PART1: Program Headers:
PART1-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PART1-NEXT: PHDR 0x000040 0x0000000000203040 0x0000000000203040 0x000188 0x000188 R 0x1
PART1-NEXT: LOAD 0x000000 0x0000000000203000 0x0000000000203000 0x00023a 0x00023a R 0x1000
PART1-NEXT: LOAD 0x001000 0x0000000000204000 0x0000000000204000 0x000090 0x000090 RW 0x1000
PART1-NEXT: LOAD 0x002000 0x0000000000205000 0x0000000000205000 0x000000 0x000008 RW 0x1000
PART1-NEXT: DYNAMIC 0x001000 0x0000000000204000 0x0000000000204000 0x000090 0x000090 RW 0x8
PART1-NEXT: GNU_RELRO 0x001000 0x0000000000204000 0x0000000000204000 0x000090 0x001000 R 0x1
PART1-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x0
PART2: ELF Header:
PART2-NEXT: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
PART2-NEXT: Class: ELF64
PART2-NEXT: Data: 2's complement, little endian
PART2-NEXT: Version: 1 (current)
PART2-NEXT: OS/ABI: UNIX - System V
PART2-NEXT: ABI Version: 0x0
PART2-NEXT: Type: DYN (Shared object file)
PART2-NEXT: Machine: Advanced Micro Devices X86-64
PART2-NEXT: Version: 0x1
PART2-NEXT: Entry point address: 0x0
PART2-NEXT: Start of program headers: 64 (bytes into file)
PART2-NEXT: Start of section headers: 8336 (bytes into file)
PART2-NEXT: Flags: 0x0
PART2-NEXT: Size of this header: 64 (bytes)
PART2-NEXT: Size of program headers: 56 (bytes)
PART2-NEXT: Number of program headers: 7
PART2-NEXT: Size of section headers: 64 (bytes)
PART2-NEXT: Number of section headers: 11
PART2-NEXT: Section header string table index: 9
PART2: Section Headers:
PART2-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
PART2-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
PART2-NEXT: [ 1] .dynsym DYNSYM 00000000002061c8 0001c8 000030 18 A 4 1 8
PART2-NEXT: [ 2] .gnu.hash GNU_HASH 00000000002061f8 0001f8 000020 00 A 1 0 8
PART2-NEXT: [ 3] .hash HASH 0000000000206218 000218 000018 04 A 1 0 4
PART2-NEXT: [ 4] .dynstr STRTAB 0000000000206230 000230 00000a 00 A 0 0 1
PART2-NEXT: [ 5] .dynamic DYNAMIC 0000000000207000 001000 000090 10 WA 4 0 8
PART2-NEXT: [ 6] .bss2 NOBITS 0000000000208000 002000 000010 00 WA 0 0 1
PART2-NEXT: [ 7] .comment PROGBITS 0000000000000000 002000 000008 01 MS 0 0 1
PART2-NEXT: [ 8] .symtab SYMTAB 0000000000000000 002008 000030 18 10 1 8
PART2-NEXT: [ 9] .shstrtab STRTAB 0000000000000000 002038 00004d 00 0 0 1
PART2-NEXT: [10] .strtab STRTAB 0000000000000000 002085 000004 00 0 0 1
PART2: Symbol table '.dynsym' contains 2 entries:
PART2-NEXT: Num: Value Size Type Bind Vis Ndx Name
PART2-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
PART2-NEXT: 1: 0000000000208000 0 NOTYPE GLOBAL DEFAULT 23 g2
PART2: Symbol table '.symtab' contains 2 entries:
PART2-NEXT: Num: Value Size Type Bind Vis Ndx Name
PART2-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
PART2-NEXT: 1: 0000000000208000 0 NOTYPE GLOBAL DEFAULT 6 g2
PART2: Program Headers:
PART2-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PART2-NEXT: PHDR 0x000040 0x0000000000206040 0x0000000000206040 0x000188 0x000188 R 0x1
PART2-NEXT: LOAD 0x000000 0x0000000000206000 0x0000000000206000 0x00023a 0x00023a R 0x1000
PART2-NEXT: LOAD 0x001000 0x0000000000207000 0x0000000000207000 0x000090 0x000090 RW 0x1000
PART2-NEXT: LOAD 0x002000 0x0000000000208000 0x0000000000208000 0x000000 0x000010 RW 0x1000
PART2-NEXT: DYNAMIC 0x001000 0x0000000000207000 0x0000000000207000 0x000090 0x000090 RW 0x8
PART2-NEXT: GNU_RELRO 0x001000 0x0000000000207000 0x0000000000207000 0x000090 0x001000 R 0x1
PART2-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x0
RUN: not llvm-objcopy --extract-partition=part3 %p/Inputs/partitions.elf %t4 2>&1 | FileCheck --check-prefix=ERROR1 %s
ERROR1: error: could not find partition named 'part3'
RUN: not llvm-objcopy --extract-main-partition --extract-partition=part2 %p/Inputs/partitions.elf %t4 2>&1 | FileCheck --check-prefix=ERROR2 %s
ERROR2: error: cannot specify --extract-partition together with --extract-main-partition
|