def instrument_init_array(self): section = self.rewriter.container.sections[".init_array"] constructor = DataCell.instrumented(".quad {}".format(sp.ASAN_INIT_FN), 8) section.cache.append(constructor) if ".fini_array" not in self.rewriter.container.sections: finiarr = DataSection(".fini_array", 0, 0, "") self.rewriter.container.add_section(finiarr) fini = self.rewriter.container.sections[".fini_array"] destructor = DataCell.instrumented( ".quad {}".format(sp.ASAN_DEINIT_FN), 8) fini.cache.append(destructor) initfn = Function(sp.ASAN_INIT_FN, ASAN_INIT_LOC, 0, "") initfn.set_instrumented() initcode = InstrumentedInstruction( '\n'.join(sp.MODULE_INIT).format(global_count=self.global_count), None, None) initfn.cache.append(initcode) self.rewriter.container.add_function(initfn) finifn = Function(sp.ASAN_DEINIT_FN, ASAN_DEINIT_LOC, 0, "") finifn.set_instrumented() finicode = InstrumentedInstruction( '\n'.join(sp.MODULE_DEINIT).format(global_count=self.global_count), None, None) finifn.cache.append(finicode) self.rewriter.container.add_function(finifn)
def to_instrumented(self): results = [ ".quad {}".format(self.location), ".quad {}".format(self.sz), ".quad {}".format(self.sz_with_rz), ".quad {}".format(self.name), ".quad {}".format(self.mod_name), ".quad {}".format(self.has_dynamic_init), ".quad {}".format(0), ] return list(map(lambda x: DataCell.instrumented(x, 8), results))
def instrument_globals(self): gmap = list() for _, sec in self.rewriter.container.sections.items(): location = sec.base appends = defaultdict(list) for idx, cell in enumerate(sec.cache): if cell.ignored or cell.is_instrumented: continue if location in sec.named_globals: self.global_count += 1 gobj = sec.named_globals[location][0] asan_global_meta = self.new_global_metadata(gobj) gmap.append(asan_global_meta) # Need to add padding. # Redzone below the global appends[location + gobj["sz"]].append( asan_global_meta.pad_down) location += cell.sz location = sec.base oldcache = copy.copy(sec.cache) for idx, cell in enumerate(oldcache): if cell.is_instrumented or cell.ignored: continue if location in appends: for pad in appends[location]: instrumented = DataCell.instrumented( ".zero {}".format(pad), pad) cell.instrument_after(instrumented) location += cell.sz ds = DataSection(".data.asan", ASAN_GLOBAL_DS_BASE, 0, None) ds.cache.append( DataCell.instrumented("{}:".format(sp.ASAN_GLOBAL_DS), 0)) for meta in gmap: ds.cache.extend(meta.to_instrumented()) self.rewriter.container.add_section(ds)