-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbinutils.py
45 lines (33 loc) · 1.2 KB
/
binutils.py
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
import subprocess
import os
def dump_asm(filename: str, objdump):
with open(filename+'.S', mode="w") as f:
subprocess.run([objdump, '--no-addresses',
'--symbolize-operands', '-S', filename], stdout=f)
def dump_bc(base, dis, count, data):
filename = "{}/seg{}.bc".format(base, count)
with open(filename, "wb") as f:
f.write(data)
subprocess.run([dis, "seg{}.bc".format(count)], cwd=base)
def extract_bc(filename: str, objcopy, dis):
bc_header = bytes([0x42, 0x43, 0xc0, 0xde])
basedir = filename+"_bc"
bc_filename = filename+".bc"
subprocess.run([objcopy, filename, "--dump-section",
".llvmbc={}".format(bc_filename)])
if not os.path.exists(bc_filename):
return
os.makedirs(basedir, exist_ok=True)
count = 0
with open(bc_filename, 'rb') as f:
data = f.read()
last_pos = 0
while True:
pos = data.find(bc_header, last_pos+4)
if pos == -1:
dump_bc(basedir, dis, count, data[last_pos:])
break
else:
dump_bc(basedir, dis, count, data[last_pos: pos])
last_pos = pos
count += 1