@include @define dumpmap(ctl) { printf("dumpmap\n"); foreach(@lambda(dll){ printf("%16x %16x %s\n", dll.id, dll.base, dll.path); }, ctl.statunix()[1]); } @define printlist(dom) { @local p; p = dom`head; while(p){ printf("%d ", p->v); p = p->next; } printf("\n"); } @define manglelist(dom) { @local p; p = dom`head; while(p){ printf("%d ", p->v++); p = p->next; } printf("\n"); } @define mode32() { return "./list32"; } @define mode32s() { return "./list32stat"; } @define modenat() { return "./list"; } @define dumpsym(ss) { foreach(@lambda(sym){ printf("%016x %016x %10e %10e\t%s\n", sym.val, sym.sz, (enum ctlmux`ELF_ST_BIND)sym.bind, (enum ctlmux`Stype)(sym.type>>1), sym.id); }, ss); } @define dumpseg(gs) { foreach(@lambda(seg){ printf("%016x %016x %s\n", seg.addr, seg.len, seg.name); }, gs); } // test printlist @define test1(cmd, n) { @local ctl, mux, ns, as, dom, bs, ms, sym; printf("** test1 %s **\n", cmd); mux = mkctlmux_local(); ctl = mux.launch([cmd, sprintfa("%d", n)], 0); as = ctl.mem(); ns = ctl.ns(); dom = mkdom(ns, as); dom.trace(ctlmux`Eload, @lambda(ctl, path, base){ ms = []; bs = ctl.statunix()[1]; foreach(@lambda(dll){ if(strstr(dll.path, "libc") != nil){ sym = mux.looksym(dll.id, 'malloc); if(sym.val) append(ms, sym.val); // dumpseg(mux.enumseg(dll.id)); // dumpsym(mux.enumsym(dll.id)); } if(strstr(dll.path, "list") != nil){ sym = mux.looksym(dll.id, 'malloc); if(sym.val) append(ms, sym.val); // dumpseg(mux.enumseg(dll.id)); // dumpsym(mux.enumsym(dll.id)); } }, bs); foreach(@lambda(off){ dom.xtrap(off, @lambda(ctl){ printf("called malloc @ %x\n", off); }); }, ms); }); dom.xtrap((void*)&dom`insert, @lambda(ctl){ @local ss, regs, nsid; regs = ctl.reg(); printf("insert rsp=%p rbp=%p rip=%p\n", regs->rsp, regs->rbp, regs->rip); nsid = 0; /* FIXME: don't hardcode name space */ ss = mux.enumloc(nsid, regs->rip); if(ss == nil){ printf("no location information for %p\n", {dom}regs->rip); return; } foreach(@lambda(l){ printf("\t%s\t%t\n", l.id, l.type); }, ss); printlist(dom); }); dom.xtrap(&dom`main, @lambda(ctl){ @local regs; regs = ctl.reg(); printf("main: rsp=%p rbp=%p rip=%p\n", regs->rsp, regs->rbp, regs->rip); }); dom.xcont(); mux.run(); } // test manglelist @define test2(cmd, n) { @local ctl, mux, ns, as, dom; printf("** test2 %s **\n", cmd); mux = mkctlmux_local(); ctl = mux.launch([cmd, sprintfa("%d", n)], 0); as = ctl.mem(); ns = ctl.ns(); dom = mkdom(ns, as); dom.xtrap(&dom`insert, @lambda(ctl){ manglelist(dom); return nil; }); dom.xcont(); mux.run(); } cmds = [ "./list32", "./list32stat", "./list" ]; printf("** test1 **\n"); foreach(@lambda(cmd){ test1(cmd, 10); }, cmds); printf("** test2 **\n"); foreach(@lambda(cmd){ test2(cmd, 10); }, cmds);