package elf import ( "encoding/binary" "io" ) const ( minAddress = 0x10000 baseAddress = 0x40 * minAddress ) // ELF64 represents an ELF 64-bit file. type ELF64 struct { Header ProgramHeader Code []byte } // New creates a new 64-bit ELF binary. func New(code []byte) *ELF64 { elf := &ELF64{ Header: Header{ Magic: [4]byte{0x7F, 'E', 'L', 'F'}, Class: 2, Endianness: LittleEndian, Version: 1, OSABI: 0, ABIVersion: 0, Type: TypeExecutable, Architecture: ArchitectureAMD64, FileVersion: 1, EntryPointInMemory: baseAddress + 0x80, ProgramHeaderOffset: HeaderSize, SectionHeaderOffset: 0, Flags: 0, Size: HeaderSize, ProgramHeaderEntrySize: ProgramHeaderSize, ProgramHeaderEntryCount: 1, SectionHeaderEntrySize: SectionHeaderSize, SectionHeaderEntryCount: 0, SectionNameStringTableIndex: 0, }, ProgramHeader: ProgramHeader{ Type: ProgramTypeLOAD, Flags: ProgramFlagsExecutable | ProgramFlagsReadable, Offset: 0x80, VirtualAddress: baseAddress + 0x80, PhysicalAddress: baseAddress + 0x80, SizeInFile: int64(len(code)), SizeInMemory: int64(len(code)), Align: Align, }, Code: code, } return elf } // Write writes the ELF64 format to the given writer. func (elf *ELF64) Write(writer io.Writer) { binary.Write(writer, binary.LittleEndian, &elf.Header) binary.Write(writer, binary.LittleEndian, &elf.ProgramHeader) writer.Write([]byte{0, 0, 0, 0, 0, 0, 0, 0}) writer.Write(elf.Code) }