1 changed files with 86 additions and 0 deletions
@ -0,0 +1,86 @@ |
|||
import zipfile |
|||
import struct |
|||
import sys |
|||
import os |
|||
|
|||
def check_so_alignment(aab_path): |
|||
print(f"Checking AAB: {aab_path}") |
|||
|
|||
try: |
|||
with zipfile.ZipFile(aab_path, 'r') as z: |
|||
so_files = [f for f in z.namelist() if f.endswith('.so') and 'arm64-v8a' in f] |
|||
|
|||
if not so_files: |
|||
print("No arm64-v8a .so files found in the AAB.") |
|||
return |
|||
|
|||
print(f"Found {len(so_files)} arm64-v8a .so files.") |
|||
|
|||
issues = [] |
|||
|
|||
for so_name in so_files: |
|||
with z.open(so_name) as f: |
|||
data = f.read() |
|||
|
|||
# Check ELF magic |
|||
if data[:4] != b'\x7fELF': |
|||
print(f"Skipping {so_name}: Not an ELF file") |
|||
continue |
|||
|
|||
# Check class (64-bit) |
|||
if data[4] != 2: |
|||
print(f"Skipping {so_name}: Not a 64-bit ELF") |
|||
continue |
|||
|
|||
# Parse ELF Header (Elf64_Ehdr) |
|||
# e_phoff is at offset 32 (0x20), 64-bit unsigned |
|||
e_phoff = struct.unpack('<Q', data[32:40])[0] |
|||
# e_phentsize is at offset 54 (0x36), 16-bit unsigned |
|||
e_phentsize = struct.unpack('<H', data[54:56])[0] |
|||
# e_phnum is at offset 56 (0x38), 16-bit unsigned |
|||
e_phnum = struct.unpack('<H', data[56:58])[0] |
|||
|
|||
max_align = 0 |
|||
is_aligned = True |
|||
|
|||
for i in range(e_phnum): |
|||
offset = e_phoff + i * e_phentsize |
|||
# Parse Program Header (Elf64_Phdr) |
|||
# p_type is at offset 0, 32-bit unsigned |
|||
p_type = struct.unpack('<I', data[offset:offset+4])[0] |
|||
|
|||
# PT_LOAD is 1 |
|||
if p_type == 1: |
|||
# p_align is at offset 48 (0x30), 64-bit unsigned |
|||
p_align = struct.unpack('<Q', data[offset+48:offset+56])[0] |
|||
max_align = max(max_align, p_align) |
|||
|
|||
if p_align < 0x4000: |
|||
is_aligned = False |
|||
|
|||
if not is_aligned: |
|||
issues.append((so_name, max_align)) |
|||
print(f"[FAIL] {so_name}: Max alignment is {max_align} (needs 16384/0x4000)") |
|||
else: |
|||
# print(f"[PASS] {so_name}: Aligned to {max_align}") |
|||
pass |
|||
|
|||
if issues: |
|||
print("\nSummary of non-compliant libraries (arm64-v8a):") |
|||
for name, align in issues: |
|||
print(f" - {name} (Align: {align})") |
|||
sys.exit(1) |
|||
else: |
|||
print("\nAll arm64-v8a shared libraries are 16KB aligned!") |
|||
sys.exit(0) |
|||
|
|||
except Exception as e: |
|||
print(f"Error checking AAB: {e}") |
|||
sys.exit(1) |
|||
|
|||
if __name__ == "__main__": |
|||
if len(sys.argv) < 2: |
|||
print("Usage: python check_16kb.py <path_to_aab>") |
|||
sys.exit(1) |
|||
|
|||
check_so_alignment(sys.argv[1]) |
|||
Loading…
Reference in new issue