[docs]def__init__(self,kb):super().__init__(kb=kb)self._labels={}self._reverse_labels={}is_arm=is_arm_arch(kb._project.arch)forobjinkb._project.loader.all_objects:forvinobj.symbols:ifis_armandv.namein{"$d","$t","$a"}:continueif(v.nameandnotv.is_importandv.typenotin{cle.SymbolType.TYPE_OTHER,}):self._labels[v.rebased_addr]=v.nameself._reverse_labels[v.name]=v.rebased_addrtry:forv,kinobj.plt.items():self._labels[k]=vexceptAttributeError:pass# Artificial labels for the entry pointentry=kb._project.loader.main_object.entryifentrynotinself._labels:lbl="_start"self._labels[entry]=self.get_unique_label(lbl)
def__iter__(self):""" Iterate over all labels (the strings) Use .lookup(name) if you need to find the address to it. """returnself._reverse_labels.__iter__()def__getitem__(self,k):returnself._labels[k]def__setitem__(self,k,v):delself[k]self._labels[k]=vself._reverse_labels[v]=kifkinself._kb.functions:self._kb.functions[k]._name=vdef__delitem__(self,k):ifkinself._labels:l=self._labels[k]iflinself._reverse_labels:delself._reverse_labels[l]delself._labels[k]def__contains__(self,k):returnkinself._labels
[docs]defget(self,addr):""" Get a label as string for a given address Same as .labels[x] """returnself[addr]
[docs]deflookup(self,name):""" Returns an address to a given label To show all available labels, iterate over .labels or list(b.kb.labels) """returnself._reverse_labels[name]
[docs]defget_unique_label(self,label):""" Get a unique label name from the given label name. :param str label: The desired label name. :return: A unique label name. """iflabelnotinself._labels:returnlabel# use it as the prefixi=1whileTrue:new_label="%s_%d"%(label,i)ifnew_labelnotinself._labels:returnnew_labeli+=1