[docs]defresolve_symbol(self,solist,bypass_compatibility=False,extern_object=None,**kwargs):ifnotbypass_compatibility:solist=[xforxinsolistifself.resolvewith==x.provides]super().resolve_symbol(solist,bypass_compatibility=bypass_compatibility,extern_object=extern_object,**kwargs)ifself.resolvedbyisNone:return# handle symbol forwardersnewsym=self.resolvedby.resolve_forwarder()ifnewsymisNone:new_symbol=extern_object.make_extern(self.symbol.name,sym_type=self.symbol.type)self.resolvedby.resolvedby=new_symbolself.resolve(new_symbol)returnself.resolvedby=newsymself.symbol.resolvedby=newsym
[docs]defrelocate(self):ifself.symbolisNone:# relocation described in the DIRECTORY_ENTRY_BASERELOC tablevalue=self.valueifvalueisNone:log.debug("Unresolved relocation with no symbol.")returnself.owner.memory.store(self.relative_addr,value)else:super().relocate()
@propertydefvalue(self):ifself.resolved:returnself.resolvedby.rebased_addr@propertydefis_base_reloc(self):""" These relocations are ignored by the linker if the executable is loaded at its preferred base address. There is no associated symbol with base relocations. """returnTrueifself.symbolisNoneelseFalse@propertydefis_import(self):returnnotself.is_base_reloc