Added exe package to manage sections
This commit is contained in:
parent
955461d2de
commit
4faab9606c
16 changed files with 207 additions and 134 deletions
|
@ -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
15
src/elf/cpu.go
Normal 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")
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue