Last active
June 1, 2025 05:58
-
-
Save mpfund/bd9425fbb9960963dff74e82a4949d52 to your computer and use it in GitHub Desktop.
Aligns TLS section in elf binary to fix termux / ARM64 bionic error message: TLS Segement is underaligned
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# copied from https://github.com/Lzhiyong/termux-ndk/blob/master/patches/align_fix.py | |
# wiht small adjustments | |
import struct | |
import sys | |
import os | |
if len(sys.argv) < 2: | |
print('Usage: ' + os.path.basename(sys.argv[0]) + ' input_file') | |
exit(-1) | |
with open(sys.argv[1], 'r+b') as f: | |
f.seek(0) | |
hdr = f.read(16) | |
if hdr[0] != 0x7f or hdr[1] != ord('E') or hdr[2] != ord('L') or hdr[3] != ord('F'): | |
print('Not an elf file') | |
exit(-1) | |
if hdr[4] == 1: | |
# 32 bit code | |
# print('32 bit code') | |
f.seek(28) | |
offset = struct.unpack('<I', f.read(4))[0] | |
f.seek(42) | |
phsize = struct.unpack('<H', f.read(2))[0] | |
phnum = struct.unpack('<H', f.read(2))[0] | |
for i in range(0, phnum): | |
f.seek(offset + i * phsize) | |
t = struct.unpack('<I', f.read(4))[0] | |
if t == 7: | |
f.seek(28 - 4, 1) | |
align = struct.unpack('<I', f.read(4))[0] | |
# print('Found TLS segment with align = ' + str(align)) | |
if (align < 32): | |
# print('TLS segment is underaligned, patching') | |
f.seek(-4, 1) | |
f.write(struct.pack('<I', 32)) | |
elif hdr[4] == 2: | |
f.seek(32) | |
offset = struct.unpack('<Q', f.read(8))[0] | |
f.seek(54) | |
phsize = struct.unpack('<H', f.read(2))[0] | |
phnum = struct.unpack('<H', f.read(2))[0] | |
print(offset, phsize, phnum) | |
for i in range(0, phnum): | |
f.seek(offset + i * phsize) | |
t = struct.unpack('<I', f.read(4))[0] | |
if t == 7: | |
f.seek(48 - 4, 1) | |
align_pos = f.tell() | |
align = struct.unpack('<Q', f.read(8))[0] | |
print(f"Found TLS segment with align = {align} at offset {align_pos}") | |
if align < 4096: | |
print(f"TLS segment is underaligned ({align}), patching to 4096") | |
f.seek(-8, 1) | |
f.write(struct.pack('<Q', 4096)) | |
else: | |
print('Unknown file class') | |
exit(-1) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment