-
Notifications
You must be signed in to change notification settings - Fork 0
/
src2bin-ImageMagick.py
147 lines (123 loc) · 4.43 KB
/
src2bin-ImageMagick.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
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
import sys
import os
sys.path.append(os.path.abspath('../utils'))
import subprocess
import db_operation
import udload
import os
def process_with_nm(path):
try:
cmd = 'nm -l ' + path
process = subprocess.Popen(cmd, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# wait for the process to terminate
out, err = process.communicate()
errcode = process.returncode
if errcode != 0:
return []
lines = out.split('\n')
print len(lines)
records = []
for line in lines:
#print line
#break
elems = line.split(' ')
elems = [x for x in elems if x != '']
print len(elems), elems
addr = None
sym_type = None
func_name = None
src_file = None
src_lineno = -1
record = None
if len(elems) == 2 and elems[0] == 'U':
if '\t' not in elems[1]:
sym_type = elems[0]
func_name = elems[1]
else:
sym_type = elems[0]
members = elems[1].split('\t')
if len(members) == 1:
func_name = members[0]
else:
func_name = members[0]
src_file = members[1].split(':')[0]
if 'ImageMagick-' in src_file:
src_file = '/'.join(src_file.split('ImageMagick-')[1].split('/')[1:])
print src_file
src_lineno = int(members[1].split(':')[1])
#record = (addr, sym_type, func_name, src_file, src_lineno)
elif len(elems) == 3:
addr = elems[0]
sym_type = elems[1]
members = elems[2].split('\t')
if len(members) == 1:
func_name = members[0]
else:
func_name = members[0]
src_file = members[1].split(':')[0]
if 'ImageMagick-' in src_file:
src_file = '/'.join(src_file.split('ImageMagick-')[1].split('/')[1:])
src_lineno = int(members[1].split(':')[1])
elif len(elems) == 0:
continue
record = (addr, sym_type, func_name, src_file, src_lineno)
records.append(record)
#print record
#break
#print records
#print out
return records
except Exception, e:
print 'processing with nm failed [Exception]', e
return []
def save_to_db(records, bin_file):
try:
conn = db_operation.connect_to_db_simple()
#conn = db_operation.connect_to_db('172.18.100.125', 'lp_crawler', '_lp_crawler', '_launchpad_crawler')
for (function_addr, symbol_type, function_name, source_file, source_lineno) in records:
db_operation.add_ImageMagick_compile_src2bin(conn, str(function_addr), str(symbol_type), str(function_name), str(source_file), int(source_lineno), bin_file)
conn.close()
return True
except Exception, e:
print 'save to db [Exception]', e
return False
def clean(path):
try:
os.remove(path)
return True
except Exception, e:
print 'remove file failed [Exception]', e
return False
if __name__ == "__main__":
debug_files = db_operation.query_ImageMagick_compile_files()
print len(debug_files)
processed = db_operation.query_ImageMagick_processed_compile_files()
print processed
#exit(0)
i = 0
for id, unstripped_local_url, bin_filename, tag in debug_files:
#print id, bin_filename
if id in processed:
continue
#if int(id) != 48119:
# continue
if not bin_filename.endswith('.o'):
continue
path = unstripped_local_url
if not udload.download_from_ceph(unstripped_local_url, path):
print 'download failed [', unstripped_local_url, '], continue'
continue
records = process_with_nm(path)
if records == []:
continue
#print records
save_to_db(records, id)
clean(path)
'''
if i > 10:
break
print '[', i, '/', len(debug_files), ']', id, bin_filename
i = i + 1
'''