Skip to content

Instantly share code, notes, and snippets.

@mpfund
Last active June 1, 2025 05:58
Show Gist options
  • Save mpfund/bd9425fbb9960963dff74e82a4949d52 to your computer and use it in GitHub Desktop.
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
# 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