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
|
#!/usr/bin/env python3
from __future__ import print_function
import os
import sys
import subprocess
def run(*args):
return subprocess.check_output(list(args), shell=False).decode().strip()
def gen_renames_1(d):
for l in d.split('\n'):
l = l.strip()
if ' ' in l:
yield l.split(' ')[-1]
def have_prefix(l, p):
for x in l:
if not x.startswith(p):
return False
return True
def gen_renames_2(p, d):
l = list(gen_renames_1(d))
a = have_prefix(l, '_')
for s in l:
if 'asan_globals' in s:
continue
if s in ['HMAC', 'SHA1', 'SHA256', 'SHA256', 'SHA512', 'RC4', 'MD5', 'SHA384']:
continue
if a and s[1:] in ['HMAC', 'SHA1', 'SHA256', 'SHA256', 'SHA512', 'RC4', 'MD5', 'SHA384']:
continue
if a:
yield s + ' _' + p + s[1:]
else:
yield s + ' ' + p + s
def gen_renames(p, d):
return '\n'.join(gen_renames_2(p, d)).strip() + '\n'
def rename_syms(where, ret):
p = 'v1_'
# find symbols to rename
syms = run(where + 'llvm-nm', '--extern-only', '--defined-only', '-A', ret)
# prepare rename plan
renames = gen_renames(p, syms)
tmp = ret + '.syms'
with open(tmp, 'w') as f:
f.write(renames)
# rename symbols
run(where + 'llvm-objcopy', '--redefine-syms=' + tmp, ret)
os.unlink(tmp)
if __name__ == '__main__':
rename_syms(os.path.dirname(sys.argv[3]) + '/', sys.argv[1])
|