aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/openssl/ar.pyplugin
blob: a778d066fa39dbbbe6f4ada787b48d5207c79d55 (plain) (blame)
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])