def as_bytearray(self): from peachpy.formats.macho.file import MachHeader mach_header = MachHeader(self.abi) mach_header.command_size = self.segment_command.size + self.symbol_table_command.size mach_header.command_count = 2 data = mach_header.as_bytearray # Update section offsets data_offset = mach_header.size + \ self.segment_command.size + \ self.symbol_table_command.size self.segment_command.offset = data_offset for section in self.sections: if data_offset % self.abi.pointer_size != 0: padding_length = self.abi.pointer_size - data_offset % self.abi.pointer_size data_offset += padding_length section.header.offset = data_offset data_offset += section.header.content_size self.symbol_table_command.symbol_count = len(self.symbols) if len(self.symbols): if data_offset % self.abi.pointer_size != 0: padding_length = self.abi.pointer_size - data_offset % self.abi.pointer_size data_offset += padding_length self.symbol_table_command.symbol_offset = data_offset data_offset += sum([symbol.size for symbol in self.symbols]) self.symbol_table_command.string_size = self.string_table.size if self.string_table.size: self.symbol_table_command.string_offset = data_offset # Write commands data += self.segment_command.as_bytearray for section in self.sections: data += section.header.as_bytearray data += self.symbol_table_command.as_bytearray # Write section content for section in self.sections: if len(data) % self.abi.pointer_size != 0: padding_length = self.abi.pointer_size - len(data) % self.abi.pointer_size data += bytearray(padding_length) data += section.content # Write symbols if len(self.symbols): if len(data) % self.abi.pointer_size != 0: padding_length = self.abi.pointer_size - len(data) % self.abi.pointer_size data += bytearray(padding_length) for symbol in self.symbols: data += symbol.as_bytearray # Write string table data += self.string_table.as_bytearray return data