Skip to content

Commit 27bcf6a

Browse files
committed
Reland "[LLVM][llvm-objcopy] Added basic plumbing to get things started"
As discussed on llvm-dev I've implemented the first basic steps towards llvm-objcopy/llvm-objtool (name pending). This change adds the ability to copy (without modification) 64-bit little endian ELF executables that have SHT_PROGBITS, SHT_NOBITS, SHT_NULL and SHT_STRTAB sections. Patch by Jake Ehrlich Differential Revision: https://reviews.llvm.org/D33964 llvm-svn: 309249
1 parent 4eda756 commit 27bcf6a

11 files changed

+824
-0
lines changed

llvm/test/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ set(LLVM_TEST_DEPENDS
6161
llvm-modextract
6262
llvm-mt
6363
llvm-nm
64+
llvm-objcopy
6465
llvm-objdump
6566
llvm-opt-report
6667
llvm-pdbutil
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# RUN: yaml2obj %s > %t
2+
# RUN: llvm-objcopy %t %t2
3+
# RUN: llvm-readobj -sections %t2 | FileCheck %s
4+
5+
!ELF
6+
FileHeader:
7+
Class: ELFCLASS64
8+
Data: ELFDATA2LSB
9+
Type: ET_EXEC
10+
Machine: EM_X86_64
11+
Sections:
12+
- Name: .bss
13+
Type: SHT_NOBITS
14+
Flags: [ SHF_ALLOC ]
15+
AddressAlign: 0x0000000000000010
16+
Size: 64
17+
- Name: .text
18+
Type: SHT_PROGBITS
19+
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
20+
AddressAlign: 0x0000000000000010
21+
Content: "00000000"
22+
23+
# CHECK: Type: SHT_NULL
24+
25+
# CHECK: Name: .bss
26+
# CHECK-NEXT: Type: SHT_NOBITS
27+
# CHECK-NEXT: Flags [
28+
# CHECK-NEXT: SHF_ALLOC
29+
# CHECK-NEXT: ]
30+
# CHECK-NEXT: Address:
31+
# CHECK-NEXT: Offset: [[OFFSET:0x[0-9A-F]+]]
32+
# CHECK-NEXT: Size: 64
33+
34+
# CHECK: Name: .text
35+
# CHECK-NEXT: Type: SHT_PROGBITS
36+
# CHECK-NEXT: Flags [
37+
# CHECK-NEXT: SHF_ALLOC
38+
# CHECK-NEXT: SHF_EXECINSTR
39+
# CHECK-NEXT: ]
40+
# CHECK-NEXT: Address:
41+
# CHECK-NEXT: Offset: [[OFFSET]]
42+
# CHECK-NEXT: Size: 4
43+
44+
# CHECK: Name: .shstrtab
45+
# CHECK-NEXT: Type: SHT_STRTAB
46+
# CHECK-NEXT: Flags [
47+
# CHECK-NEXT: ]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# RUN: yaml2obj %s > %t
2+
# RUN: llvm-objcopy %t %t2
3+
# RUN: llvm-readobj -sections %t2 | FileCheck %s
4+
5+
!ELF
6+
FileHeader:
7+
Class: ELFCLASS64
8+
Data: ELFDATA2LSB
9+
Type: ET_EXEC
10+
Machine: EM_X86_64
11+
Sections:
12+
- Name: .text
13+
Type: SHT_PROGBITS
14+
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
15+
Address: 0x0
16+
AddressAlign: 0x0000000000001000
17+
Content: "00000000"
18+
- Name: .empty
19+
Type: SHT_PROGBITS
20+
Flags: [ SHF_ALLOC ]
21+
Address: 0x1000
22+
AddressAlign: 0x0000000000001000
23+
Content: ""
24+
- Name: .data
25+
Type: SHT_PROGBITS
26+
Flags: [ SHF_ALLOC ]
27+
Address: 0x1000
28+
AddressAlign: 0x0000000000001000
29+
Content: "00000000"
30+
31+
32+
# CHECK: Name: .text
33+
# CHECK-NEXT: Type: SHT_PROGBITS
34+
# CHECK-NEXT: Flags [
35+
# CHECK-NEXT: SHF_ALLOC
36+
# CHECK-NEXT: SHF_EXECINSTR
37+
# CHECK-NEXT: ]
38+
39+
# CHECK: Name: .empty
40+
# CHECK-NEXT: Type: SHT_PROGBITS
41+
# CHECK-NEXT: Flags [
42+
# CHECK-NEXT: SHF_ALLOC
43+
# CHECK-NEXT: ]
44+
# CHECK-NEXT: Address: 0x1000
45+
# CHECK-NEXT: Offset: 0x2000
46+
# CHECK-NEXT: Size: 0
47+
48+
# CHECK: Name: .data
49+
# CHECK-NEXT: Type: SHT_PROGBITS
50+
# CHECK-NEXT: Flags [
51+
# CHECK-NEXT: SHF_ALLOC
52+
# CHECK-NEXT: ]
53+
# CHECK-NEXT: Address: 0x1000
54+
# CHECK-NEXT: Offset: 0x2000
55+
# CHECK-NEXT: Size: 4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# RUN: yaml2obj %s -o %t
2+
# RUN: llvm-objcopy %t %t2
3+
# RUN: llvm-readobj -program-headers %t2 | FileCheck %s
4+
5+
!ELF
6+
FileHeader:
7+
Class: ELFCLASS64
8+
Data: ELFDATA2LSB
9+
Type: ET_EXEC
10+
Machine: EM_X86_64
11+
Sections:
12+
- Name: .text
13+
Type: SHT_PROGBITS
14+
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
15+
AddressAlign: 0x0000000000001000
16+
Content: "00000000"
17+
- Name: .init
18+
Type: SHT_PROGBITS
19+
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
20+
Content: "00000000"
21+
AddressAlign: 0x0000000000000010
22+
- Name: .data
23+
Type: SHT_PROGBITS
24+
Flags: [ SHF_ALLOC ]
25+
Content: "00000000"
26+
AddressAlign: 0x0000000000001000
27+
ProgramHeaders:
28+
- Type: PT_LOAD
29+
Flags: [ PF_X, PF_R ]
30+
VAddr: 0xAAAA1000
31+
PAddr: 0xFFFF1000
32+
Sections:
33+
- Section: .text
34+
- Section: .init
35+
- Type: PT_LOAD
36+
Flags: [ PF_R ]
37+
VAddr: 0xAAAA2000
38+
PAddr: 0xFFFF2000
39+
Sections:
40+
- Section: .data
41+
42+
#CHECK: ProgramHeaders [
43+
#CHECK-NEXT: ProgramHeader {
44+
#CHECK-NEXT: Type: PT_LOAD
45+
#CHECK-NEXT: Offset: 0x1000
46+
#CHECK-NEXT: VirtualAddress: 0xAAAA1000
47+
#CHECK-NEXT: PhysicalAddress: 0xFFFF1000
48+
#CHECK-NEXT: FileSize: 20
49+
#CHECK-NEXT: MemSize: 20
50+
#CHECK-NEXT: Flags [
51+
#CHECK-NEXT: PF_R
52+
#CHECK-NEXT: PF_X
53+
#CHECK-NEXT: ]
54+
#CHECK-NEXT: Alignment: 4096
55+
#CHECK-NEXT: }
56+
#CHECK-NEXT: ProgramHeader {
57+
#CHECK-NEXT: Type: PT_LOAD
58+
#CHECK-NEXT: Offset: 0x2000
59+
#CHECK-NEXT: VirtualAddress: 0xAAAA2000
60+
#CHECK-NEXT: PhysicalAddress: 0xFFFF2000
61+
#CHECK-NEXT: FileSize: 4
62+
#CHECK-NEXT: MemSize: 4
63+
#CHECK-NEXT: Flags [
64+
#CHECK-NEXT: PF_R
65+
#CHECK-NEXT: ]
66+
#CHECK-NEXT: Alignment: 4096
67+
#CHECK-NEXT: }
68+
#CHECK-NEXT:]

llvm/tools/LLVMBuild.txt

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ subdirectories =
4040
llvm-modextract
4141
llvm-mt
4242
llvm-nm
43+
llvm-objcopy
4344
llvm-objdump
4445
llvm-pdbutil
4546
llvm-profdata
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
set(LLVM_LINK_COMPONENTS
2+
Object
3+
Support
4+
MC
5+
)
6+
add_llvm_tool(llvm-objcopy
7+
llvm-objcopy.cpp
8+
Object.cpp
9+
)

llvm/tools/llvm-objcopy/LLVMBuild.txt

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
;===- ./tools/llvm-objcopy/LLVMBuild.txt -----------------------*- Conf -*--===;
2+
;
3+
; The LLVM Compiler Infrastructure
4+
;
5+
; This file is distributed under the University of Illinois Open Source
6+
; License. See LICENSE.TXT for details.
7+
;
8+
;===------------------------------------------------------------------------===;
9+
;
10+
; This is an LLVMBuild description file for the components in this subdirectory.
11+
;
12+
; For more information on the LLVMBuild system, please see:
13+
;
14+
; http://llvm.org/docs/LLVMBuild.html
15+
;
16+
;===------------------------------------------------------------------------===;
17+
[component_0]
18+
type = Tool
19+
name = llvm-objcopy
20+
parent = Tools
21+
required_libraries = Object MC

0 commit comments

Comments
 (0)