import struct import pytest from frameport.analysis import elf from frameport.analysis.stubgen import build_stub_library @pytest.mark.parametrize("abi", ["arm64-v8a", "armeabi-v7a"]) def test_stub_library(abi): lib = build_stub_library(["ovr_B", "ovr_A", "ovrMessageType_ToString"], abi=abi) assert elf.is_elf(lib) assert elf.is_64bit(lib) == (abi == "arm64-v8a") assert elf.soname(lib) == "libovrstubs.so" assert elf.dyn_symbols(lib, True) == {"ovr_A", "ovr_B", "ovrMessageType_ToString"} assert elf.needed(lib) == [] # 16 KiB page-aligned loads, dynamic inside the RW load loads = elf.load_segments(lib) assert all(off % 16384 == va % 16384 for va, off, _ in loads) def _with_note(lib: bytes) -> bytes: """Turn the stub's PT_GNU_STACK into a PT_NOTE so add_needed can reuse it (the common case).""" buf = bytearray(lib) phoff = struct.unpack_from(" bytes: """Rotate every section's sh_name by one, like a shipped libOVRPlugin.so whose names are shifted (GitHub #349: .dynamic named "dding", .dynsym "text"); types and links stay right.""" buf = bytearray(lib) shoff = struct.unpack_from("