Koraidon

Форк
0
/
fix_tls_alignment.py 
56 строк · 1.9 Кб
1
# Thank you: https://github.com/Lzhiyong/termux-ndk/blob/master/patches/align_fix.py
2

3
import struct
4
import sys
5
import os
6

7
if len(sys.argv) < 2:
8
    print('Usage: ' + os.path.basename(sys.argv[0]) + ' input_file')
9
    exit()
10

11
with open(sys.argv[1], 'r+b') as f:
12
    f.seek(0)
13
    hdr = f.read(16)
14
    if hdr[0] != 0x7f or hdr[1] != ord('E') or hdr[2] != ord('L') or hdr[3] != ord('F'):
15
        raise Exception('Not an elf file')
16

17
    if hdr[4] == 1:
18
        # 32 bit code
19
        f.seek(28)
20
        offset = struct.unpack('<I', f.read(4))[0]
21
        f.seek(42)
22
        phsize = struct.unpack('<H', f.read(2))[0]
23
        phnum = struct.unpack('<H', f.read(2))[0]
24
        for i in range(0, phnum):
25
            f.seek(offset + i * phsize)
26
            t = struct.unpack('<I', f.read(4))[0]
27
            if t == 7:
28
                f.seek(28 - 4, 1)
29
                align = struct.unpack('<I', f.read(4))[0]
30
                print('Found TLS segment with align = ' + str(align))
31
                if align < 32:
32
                    print('TLS segment is underaligned, patching')
33
                    f.seek(-4, 1)
34
                    f.write(struct.pack('<I', 32))
35

36
    elif hdr[4] == 2:
37
        # 64 bit code
38
        f.seek(32)
39
        offset = struct.unpack('<Q', f.read(8))[0]
40
        f.seek(54)
41
        phsize = struct.unpack('<H', f.read(2))[0]
42
        phnum = struct.unpack('<H', f.read(2))[0]
43
        for i in range(0, phnum):
44
            f.seek(offset + i * phsize)
45
            t = struct.unpack('<I', f.read(4))[0]
46
            if t == 7:
47
                f.seek(48 - 4, 1)
48
                align = struct.unpack('<Q', f.read(8))[0]
49
                print('Found TLS segment with align = ' + str(align))
50
                if align < 64:
51
                    print('TLS segment is underaligned, patching')
52
                    f.seek(-8, 1)
53
                    f.write(struct.pack('<H', 64))
54

55
    else:
56
        raise Exception('Unknown file class')
57

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.