import struct, sys, os

def needed(path):
    """Return DT_NEEDED names from a 32-bit little-endian ARM ELF."""
    try:
        d = open(path, "rb").read()
    except Exception:
        return []
    if d[:4] != b"\x7fELF" or d[4] != 1:      # 32-bit only
        return []
    e_phoff, = struct.unpack_from("<I", d, 28)
    e_phentsize, e_phnum = struct.unpack_from("<HH", d, 42)
    dyn_off = dyn_sz = None
    for i in range(e_phnum):
        o = e_phoff + i * e_phentsize
        p_type, p_offset, p_vaddr, p_paddr, p_filesz = struct.unpack_from("<IIIII", d, o)
        if p_type == 2:                        # PT_DYNAMIC
            dyn_off, dyn_sz = p_offset, p_filesz
    if dyn_off is None:
        return []
    # find DT_STRTAB (5) and DT_NEEDED (1)
    entries, strtab = [], None
    for o in range(dyn_off, dyn_off + dyn_sz, 8):
        tag, val = struct.unpack_from("<Ii", d, o)
        if tag == 0: break
        if tag == 1: entries.append(val)
        if tag == 5: strtab = val
    if strtab is None: return []
    # map vaddr->offset via PT_LOAD
    def v2o(v):
        for i in range(e_phnum):
            o = e_phoff + i * e_phentsize
            p_type, p_offset, p_vaddr, _, p_filesz = struct.unpack_from("<IIIII", d, o)
            if p_type == 1 and p_vaddr <= v < p_vaddr + p_filesz:
                return p_offset + (v - p_vaddr)
        return None
    so = v2o(strtab)
    if so is None: return []
    out = []
    for off in entries:
        end = d.index(b"\x00", so + off)
        out.append(d[so + off:end].decode("ascii", "replace"))
    return out

if __name__ == "__main__":
    for p in sys.argv[1:]:
        print(p, "->", ", ".join(needed(p)) or "(none)")
