rendered paste body def createLinkerscript(self): ldscript = os.popen('ld -zcombreloc --verbose', 'r').read() ldscript = ldscript.split('==================================================')[1] ldscript = ldscript[:ldscript.rfind('}')] # Chop off last curly brace phdrs = [] phdrs.append('headers PT_PHDR PHDRS;') phdrs.append('interp PT_INTERP;') phdrs.append('text PT_LOAD FILEHDR PHDRS;') phdrs.append('data PT_LOAD;') phdrs.append('dynamic PT_DYNAMIC;') seg_map = dict( interp=('.interp',), text=( '.interp', '.note.ABI-tag', '.hash', '.dynsym', '.dynstr', '.gnu.version', '.gnu.version_r', '.rel.got', '.rel.bss', '.rel.plt', '.init', '.plt', '.text', '.fini', '.rodata' ), data=('.dynamic', '.got', '.got.plt', '.data', '.bss'), dynamic=('.dynamic',), ) prev = ldscript.find('SECTIONS') while True: curly = ldscript.find('}', prev) if curly < 0: break lcurly = ldscript.rfind('{', 0, curly) colon = ldscript.rfind(':', 0, curly) dot = ldscript.rfind('.', 0, lcurly) slash = ldscript.rfind('/', 0, lcurly) semi = ldscript.rfind(';', 0, curly) curly += 1 prev = curly if slash > dot: continue while True: newdot = ldscript.rfind('.', 0, dot) cut = ldscript[newdot+1:dot].lower() right = True for char in cut: if char in loweralpha: continue else: right = False break if not right: break dot = newdot if not (curly > lcurly > colon > dot > semi): continue segname = ldscript[dot:colon].strip().split(' ', 1)[0] segstr = '' for seg in seg_map: seglist = seg_map[seg] if segname in seglist: segstr += ' :%s' % seg if segstr: ldscript = ldscript[:curly] + segstr + ldscript[curly:] prev += 6 segs = [] i = 0 for section in self.dest.sections: phdrs.append('alky%i PT_LOAD;' % i) segs.append(' %s 0x%08x : { *(%s) } :alky%i' % (section.name, section.addr, section.name, i)) i += 1 ldscript += '\n'.join(segs) ldscript += '\n}\n' ldscript = list(ldscript.split('SECTIONS', 1)) ldscript[0] += '\nPHDRS {\n %s\n}\n' % '\n '.join(phdrs) ldscript = 'SECTIONS'.join(ldscript) return ldscript