📄 rlink.py
字号:
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 + -