def add_function(self, function): import peachpy.x86_64.function assert isinstance(function, peachpy.x86_64.function.ABIFunction), \ "Function must be finalized with an ABI before its assembly can be used" from peachpy.formats.macho.symbol import Symbol, SymbolType, SymbolDescription, SymbolVisibility, \ Relocation, RelocationType from peachpy.util import roundup encoded_function = function.encode() code_offset = len(self.image.text_section.content) code_padding = bytearray([encoded_function.code_section.alignment_byte] * (roundup(code_offset, encoded_function.code_section.alignment) - code_offset)) self.image.text_section.content += code_padding code_offset += len(code_padding) self.image.text_section.content += encoded_function.code_section.content self.image.text_section.alignment = \ max(self.image.text_section.alignment, encoded_function.code_section.alignment) const_offset = self.image.const_section.content_size const_padding = bytearray([encoded_function.const_section.alignment_byte] * (roundup(const_offset, encoded_function.const_section.alignment) - const_offset)) self.image.const_section.content += const_padding const_offset += len(const_padding) self.image.const_section.content += encoded_function.const_section.content self.image.const_section.alignment = \ max(self.image.const_section.alignment, encoded_function.const_section.alignment) # Map from PeachPy symbol to Mach-O symbol symbol_map = dict() for symbol in encoded_function.const_section.symbols: macho_symbol = Symbol("_" + function.mangled_name + "." + symbol.name, SymbolType.section_relative, self.image.const_section, const_offset + symbol.offset) macho_symbol.description = SymbolDescription.defined self.image.symbol_table.add_symbol(macho_symbol) symbol_map[symbol] = macho_symbol for relocation in encoded_function.code_section.relocations: macho_relocation = Relocation(RelocationType.x86_64_signed, code_offset + relocation.offset, 4, symbol_map[relocation.symbol], is_pc_relative=True) relocation_addend = relocation.offset + 4 - relocation.program_counter if relocation_addend != 0: self.image.text_section.content[code_offset + relocation.offset] = relocation_addend & 0xFF self.image.text_section.content[code_offset + relocation.offset + 1] = (relocation_addend >> 8) & 0xFF self.image.text_section.content[code_offset + relocation.offset + 2] = (relocation_addend >> 16) & 0xFF self.image.text_section.content[code_offset + relocation.offset + 3] = (relocation_addend >> 24) & 0xFF self.image.text_section.relocations.append(macho_relocation) function_symbol = Symbol("_" + function.mangled_name, SymbolType.section_relative, self.image.text_section, value=code_offset) function_symbol.description = SymbolDescription.defined function_symbol.visibility = SymbolVisibility.external self.image.symbol_table.add_symbol(function_symbol)
def add_function(self, function): import peachpy.x86_64.function assert isinstance(function, peachpy.x86_64.function.ABIFunction), \ "Function must be bindinded to an ABI before its assembly can be used" from peachpy.util import roundup from peachpy.formats.mscoff import Symbol, SymbolType, StorageClass, Relocation, RelocationType encoded_function = function.encode() code_offset = len(self.text_section.content) code_padding = bytearray([encoded_function.code_section.alignment_byte] * (roundup(code_offset, encoded_function.code_section.alignment) - code_offset)) code_offset += len(code_padding) self.text_section.content += encoded_function.code_section.content self.text_section.alignment = \ max(self.text_section.alignment, encoded_function.code_section.alignment) rdata_offset = self.rdata_section.content_size rdata_padding = bytearray([encoded_function.const_section.alignment_byte] * (roundup(rdata_offset, encoded_function.const_section.alignment) - rdata_offset)) self.rdata_section.content += rdata_padding rdata_offset += len(rdata_padding) self.rdata_section.content += encoded_function.const_section.content self.rdata_section.alignment = \ max(self.rdata_section.alignment, encoded_function.const_section.alignment) # Map from PeachPy symbol to Mach-O symbol symbol_map = dict() for symbol in encoded_function.const_section.symbols: mscoff_symbol = Symbol() mscoff_symbol.name = symbol.name mscoff_symbol.value = rdata_offset + symbol.offset mscoff_symbol.section = self.rdata_section mscoff_symbol.symbol_type = SymbolType.non_function mscoff_symbol.storage_class = StorageClass.static self.image.add_symbol(mscoff_symbol) symbol_map[symbol] = mscoff_symbol for relocation in encoded_function.code_section.relocations: mscoff_relocation = Relocation(RelocationType.x86_64_relocation_offset32, code_offset + relocation.offset, symbol_map[relocation.symbol]) self.text_section.relocations.append(mscoff_relocation) function_symbol = Symbol() function_symbol.name = function.name function_symbol.value = code_offset function_symbol.section = self.text_section function_symbol.symbol_type = SymbolType.function function_symbol.storage_class = StorageClass.external self.image.add_symbol(function_symbol)