| FYI, here is a hacky script to locate self-PLT entries in x86_64
binaries. It depends on binutils and elfutils and clobbers a file called
'./syms' in order to avoid having to think about deadlocks in rw popen.
8<-----------------------------------
#!/usr/bin/python
import os,sys
def check_file(fn):
    f_plt = os.popen("eu-readelf --relocs %s| grep 'X86_64_JUMP_SLOT 0x' | awk 
'{print $5}'"%fn)
    plt = {}.fromkeys(map(lambda x:x.rstrip("\r\n"), f_plt.readlines()))
    del f_plt
    f_ref = os.popen("objdump -d %s | egrep '\<callq\>.*@plt' | awk '{print $1 
$9}'"%fn)
    tmp = map(lambda x:x.split(":"), f_ref.readlines())
    del f_ref
    refs = []
    for x in tmp:
        assert(len(x) == 2)
        (addr, sym) = x
        sym = sym.rstrip(">\r\n").lstrip("<")
        assert(len(sym) > 4 and sym[-4:] == '@plt')
        sym = sym[:-4]
        addr = int(addr, 16)
        refs.append((addr,sym))
    del tmp
    refs = filter(lambda x:plt.has_key(x[1]), refs)
    f_eu = os.popen("xargs eu-addr2line -e %s > syms"%fn, 'w')
    for (addr,sym) in refs:
        f_eu.write("0x%x\n"%addr)
        #print "0x%x %s"%(addr,sym)
    f_eu.close()
    f_eu = open("syms", 'r')
    os.unlink("syms")
    addrlines = map(lambda x:x.rstrip("\r\n"), f_eu.readlines())
    del f_eu
    assert(len(addrlines) == len(refs))
    for ((addr, sym), line) in zip(refs, addrlines):
        print "%s -> %s"%(line, sym)
    return True
if __name__ == '__main__':
    if len(sys.argv) != 2:
        print "Usage: %s <ELF-lib>"%sys.argv[0]
        raise SystemExit, 1
    if check_file(sys.argv[1]):
        raise SystemExit
    raise SystemExit, 1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
 |