Implemented basic data access
This commit is contained in:
@ -4,8 +4,9 @@ const (
|
||||
LittleEndian = 1
|
||||
TypeExecutable = 2
|
||||
ArchitectureAMD64 = 0x3E
|
||||
Align = 16
|
||||
HeaderSize = 64
|
||||
CacheLineSize = 64
|
||||
Align = CacheLineSize
|
||||
)
|
||||
|
||||
// Header contains general information.
|
||||
|
@ -6,15 +6,14 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
baseAddress = 0x10000
|
||||
baseAddress = 0x400000
|
||||
)
|
||||
|
||||
// ELF64 represents an ELF 64-bit file.
|
||||
type ELF64 struct {
|
||||
Header
|
||||
ProgramHeader
|
||||
Padding []byte
|
||||
Code []byte
|
||||
Code []byte
|
||||
}
|
||||
|
||||
// New creates a new 64-bit ELF binary.
|
||||
@ -43,7 +42,7 @@ func New(code []byte) *ELF64 {
|
||||
},
|
||||
ProgramHeader: ProgramHeader{
|
||||
Type: ProgramTypeLOAD,
|
||||
Flags: ProgramFlagsExecutable,
|
||||
Flags: ProgramFlagsExecutable | ProgramFlagsReadable,
|
||||
Offset: 0x80,
|
||||
VirtualAddress: baseAddress + 0x80,
|
||||
PhysicalAddress: baseAddress + 0x80,
|
||||
@ -51,8 +50,7 @@ func New(code []byte) *ELF64 {
|
||||
SizeInMemory: int64(len(code)),
|
||||
Align: Align,
|
||||
},
|
||||
Padding: []byte{0, 0, 0, 0, 0, 0, 0, 0},
|
||||
Code: code,
|
||||
Code: code,
|
||||
}
|
||||
|
||||
return elf
|
||||
@ -62,6 +60,6 @@ func New(code []byte) *ELF64 {
|
||||
func (elf *ELF64) Write(writer io.Writer) {
|
||||
binary.Write(writer, binary.LittleEndian, &elf.Header)
|
||||
binary.Write(writer, binary.LittleEndian, &elf.ProgramHeader)
|
||||
writer.Write(elf.Padding)
|
||||
writer.Write([]byte{0, 0, 0, 0, 0, 0, 0, 0})
|
||||
writer.Write(elf.Code)
|
||||
}
|
||||
|
@ -1,12 +1,26 @@
|
||||
# ELF
|
||||
|
||||
## File contents
|
||||
## Basic structure
|
||||
|
||||
- ELF header
|
||||
- Program headers
|
||||
- Sections
|
||||
- Section headers
|
||||
1. ELF header (0x00 - 0x40)
|
||||
2. Program header (0x40 - 0x78)
|
||||
3. Padding (0x78 - 0x80)
|
||||
4. Machine code (0x80)
|
||||
|
||||
## Entry point
|
||||
|
||||
The entry point is defined in the first 64 bytes (ELF header).
|
||||
|
||||
## Base address
|
||||
|
||||
The minimum base address is controlled by the `mmap` settings:
|
||||
|
||||
```shell
|
||||
sysctl vm.mmap_min_addr
|
||||
```
|
||||
|
||||
Usually, this value is 65536 (0x1000).
|
||||
|
||||
## Initialization in Linux
|
||||
|
||||
See `/lib/modules/$(uname -r)/build/arch/x86/include/asm/elf.h`.
|
||||
|
Reference in New Issue
Block a user