Added exe package to manage sections

This commit is contained in:
Eduard Urbach 2025-03-08 22:14:24 +01:00
parent 955461d2de
commit 4faab9606c
Signed by: eduard
GPG key ID: 49226B848C78F6C8
16 changed files with 207 additions and 134 deletions

View file

@ -6,7 +6,7 @@ import (
"io"
"git.urbach.dev/cli/q/src/config"
"git.urbach.dev/cli/q/src/fs"
"git.urbach.dev/cli/q/src/exe"
)
const HeaderEnd = HeaderSize + ProgramHeaderSize*2
@ -21,19 +21,11 @@ type ELF struct {
}
// Write writes the ELF64 format to the given writer.
func Write(writer io.Writer, code []byte, data []byte) {
var (
codeStart, codePadding = fs.Align(HeaderEnd, config.Align)
dataStart, dataPadding = fs.Align(codeStart+len(code), config.Align)
arch int16
)
switch config.TargetArch {
case config.ARM:
arch = ArchitectureARM64
case config.X86:
arch = ArchitectureAMD64
}
func Write(writer io.Writer, codeBytes []byte, dataBytes []byte) {
sections := exe.MakeSections(HeaderEnd, codeBytes, dataBytes)
code := sections[0]
data := sections[1]
arch := cpu()
elf := &ELF{
Header: Header{
@ -46,7 +38,7 @@ func Write(writer io.Writer, code []byte, data []byte) {
Type: TypeExecutable,
Architecture: arch,
FileVersion: 1,
EntryPointInMemory: int64(config.BaseAddress + codeStart),
EntryPointInMemory: int64(config.BaseAddress + code.MemoryOffset),
ProgramHeaderOffset: HeaderSize,
SectionHeaderOffset: 0,
Flags: 0,
@ -58,24 +50,22 @@ func Write(writer io.Writer, code []byte, data []byte) {
SectionNameStringTableIndex: 0,
},
CodeHeader: ProgramHeader{
Type: ProgramTypeLOAD,
Flags: ProgramFlagsExecutable | ProgramFlagsReadable,
Offset: int64(codeStart),
VirtualAddress: int64(config.BaseAddress + codeStart),
PhysicalAddress: int64(config.BaseAddress + codeStart),
SizeInFile: int64(len(code)),
SizeInMemory: int64(len(code)),
Align: config.Align,
Type: ProgramTypeLOAD,
Flags: ProgramFlagsExecutable | ProgramFlagsReadable,
Offset: int64(code.FileOffset),
VirtualAddress: int64(config.BaseAddress + code.MemoryOffset),
SizeInFile: int64(len(code.Bytes)),
SizeInMemory: int64(len(code.Bytes)),
Align: config.MemoryAlign,
},
DataHeader: ProgramHeader{
Type: ProgramTypeLOAD,
Flags: ProgramFlagsReadable,
Offset: int64(dataStart),
VirtualAddress: int64(config.BaseAddress + dataStart),
PhysicalAddress: int64(config.BaseAddress + dataStart),
SizeInFile: int64(len(data)),
SizeInMemory: int64(len(data)),
Align: config.Align,
Type: ProgramTypeLOAD,
Flags: ProgramFlagsReadable,
Offset: int64(data.FileOffset),
VirtualAddress: int64(config.BaseAddress + data.MemoryOffset),
SizeInFile: int64(len(data.Bytes)),
SizeInMemory: int64(len(data.Bytes)),
Align: config.MemoryAlign,
},
}
@ -86,10 +76,10 @@ func Write(writer io.Writer, code []byte, data []byte) {
binary.Write(writer, binary.LittleEndian, &elf.Header)
binary.Write(writer, binary.LittleEndian, &elf.CodeHeader)
binary.Write(writer, binary.LittleEndian, &elf.DataHeader)
writer.Write(bytes.Repeat([]byte{0x00}, codePadding))
writer.Write(code)
writer.Write(bytes.Repeat([]byte{0x00}, dataPadding))
writer.Write(data)
writer.Write(bytes.Repeat([]byte{0x00}, code.Padding))
writer.Write(code.Bytes)
writer.Write(bytes.Repeat([]byte{0x00}, data.Padding))
writer.Write(data.Bytes)
if config.Sections {
writer.Write(elf.StringTable)

15
src/elf/cpu.go Normal file
View file

@ -0,0 +1,15 @@
package elf
import "git.urbach.dev/cli/q/src/config"
// cpu returns the CPU architecture used in the ELF header.
func cpu() int16 {
switch config.TargetArch {
case config.ARM:
return ArchitectureARM64
case config.X86:
return ArchitectureAMD64
default:
panic("unknown architecture")
}
}