⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rlink.py

📁 linux下的一款播放器
💻 PY
📖 第 1 页 / 共 2 页
字号:
            debug("section: %s symbol: %s status: %s", repr(sec and sec.name), repr(symname), repr(status))            if sec:                if status == "global":                    s=global_symbols.get(symname)                    if not s:                        s=Symbol(symname)                        global_symbols[symname]=s                                            self.symbols[symname]=s                    s.sections.append(sec)                else:                    s=Symbol(symname)                    self.symbols[symname]=s                    self.symbols[symname].sections.append(sec)    def read_relocs(self, data):        for l in string.split(data,"\n"):            debug("read_relocs: %s", l)            w=string.split(l)            if len(w) < 3:                continue            if w[0] == "RELOCATION":                sec=w[3][1:-2]                current_sec=self.sections_byname[sec]                continue                        if w[0] == "OFFSET":                continue            if not current_sec:                continue            sym=w[2]            sym=string.split(sym,"+")[0]            current_sec.relocs.append(self.symbols.get(sym,sym))        def mark(exported_symbols):    next_batch = exported_symbols[:]    while len(next_batch):        batch=next_batch        next_batch=[]        for sym in batch:            if type(sym) == types.StringType:                symbol=global_symbols.get(sym)                if symbol:                    debug("GSYM: %s",repr(sym))                else:                    debug("USYM: %s",repr(sym))            else:                symbol = sym                debug("LSYM: %s",repr(symbol.name))            if not symbol or symbol.done:                continue            for sec in symbol.sections:                debug("%s => %s:%s", symbol.name, sec.object.name, sec.name)                if not sec.mark:                    sec.mark=1                    next_batch.extend(sec.relocs)            symbol.done=1def mangle(filename):    filename=string.replace(filename,":","_")    filename=string.replace(filename,"/","_")    filename=string.replace(filename,"\\","_")    return filename    def mangle_obj(filename):    return "rlink/"+mangle("@OUTPUT_NAME@_"+ filename)def mangle2(s):    s=string.replace(s,"@OUTPUT_NAME@",mangle(output_name))    return sdef rdel(f):    #debug("rdel(%s)",f)    if os.path.isdir(f):        for l in os.listdir(f):            rdel(os.path.join(f,l))        os.rmdir(f)    elif os.path.exists(f):        os.unlink(f)#### This is a rather stupid link script reader##def read_linker_script(file):    syms=[]    data=open(file,"r").read()    tmp=string.split("EXTERN")    for x in tmp[1:]:        i1=string.find(x,"(")        if i1==-1:            continue        i2=string.find(x,")",i1)        if i2==-1:            continue        syms.append(string.split(x[i1+1:i2-1]))    return symsdef juggle_args(args):    global output_name        if not os.path.exists('rlink'):        os.mkdir('rlink')    objects = []    archives = []    expfiles = []    ofiles = []    symbols = [ "_start", "E32Dll__F10TDllReason","main","__init","__exit" ]    newargs = args[:1]    state = None    for a in args[1:]:        if state:            if state == "SYMBOL":                symbols.append(a)                        if state == "OUTPUT":                output_name = a            state = None            newargs.append(a)            continue        if a[0] == '-':            if a[:2] == '-u':                if a[2:]:                    symbols.append(a[2:])                else:                    state="SYMBOL"            if a[:2] == '-o':                debug("-o found!")                if a[2:]:                    output_name=a[2:]                else:                    state="OUTPUT"                debug("state=%s" % repr(state))            if a[:12] == '--undefined=':                symbols.append(a[12:])            newargs.append(a)            continue        al=string.lower(a)        ext=string.split(al,".")[-1]        if ext == 'o' or ext == 'obj':            objects.append(a)            newargs.append(mangle_obj(a))            ofiles.append(mangle_obj(a))            continue        if ext == 'a' or ext == 'lib':            ## FIXME: This isabs is actually not supposed to be here,            ## without it, this program becomes extremely painfully slow            ## when linking symbian binaries. A neater solution would be            ## very handy..            if not os.path.isabs(a):                archives.append(a)                xa="rlink/@OUTPUT_NAME@_archives.a"                try:                    newargs.remove(xa)                except ValueError:                    ofiles.append(xa)                    pass                newargs.append(xa)                continue        ## Read all relocs in an .exp file        ## Hopt this is a reasonably correct way to handle these files..        if ext == 'exp':            expfiles.append(a)        if ext == 'lnk':            ## Linker script            symbols.extend(read_linker_script(a))        newargs.append(a)    print "RLINK: Reading objects..."    for a in expfiles:        for sec in Object(a).sections:            sec.mark=1            symbols.extend(sec.relocs)    ## Read objects    for o in objects:        all_objects.append(Object(o))    print "RLINK: Reading archives..."    ## Read archives    aobj = []    cdir=os.getcwd()    for a in archives:        tmpdir=mangle2("rlink/rlink_@OUTPUT_NAME@_"+mangle(a)+"_dir")        debug("PWD=%s", os.getcwd())        rdel(tmpdir)        os.mkdir(tmpdir)        os.chdir(tmpdir)        archive_path = os.path.join(cdir, a)        run("ar x %s" % quote(archive_path))        os.chdir(cdir)        for x in os.listdir(tmpdir):            oname=os.path.join(tmpdir, x)            all_objects.append(Object(oname))            aobj.append(mangle_obj(oname))    print "RLINK: Computing dependencies..."    mark(symbols)    # sweep    print "RLINK: Translating object files..."    for o in all_objects:        o.translate(mangle2(mangle_obj(o.name)))    ## re-create archives    atmp=mangle2("rlink/@OUTPUT_NAME@_archives.a")    rdel(atmp)    xcmd="ar cq %s" % quote(atmp)    cmd=xcmd    for f in aobj:        f=quote(mangle2(f))        if len(cmd) + len(f) + 1 >= maxcmdlen:            run(cmd)            cmd=xcmd        cmd = cmd + " " + f    run(cmd)    run("ranlib %s" % quote(atmp))    #newargs.append(atmp)    return map(mangle2, newargs)    def main(args):    args=args[1:]    if not os.environ.get("RLINK_DISABLE"):        args = juggle_args(args)    run2(args)    ## Delete temp files?    sys.exit(0)if __name__ == "__main__":    #import profile    #profile.run('main()', 'makedepprof')    main(sys.argv)    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -