Reduced number of load commands
This commit is contained in:
parent
35eeb420e1
commit
fe1b353fe6
@ -32,8 +32,9 @@ const (
|
|||||||
X26
|
X26
|
||||||
X27
|
X27
|
||||||
X28
|
X28
|
||||||
X29
|
FP // Frame pointer
|
||||||
X30
|
LR // Link register
|
||||||
|
SP // Stack pointer
|
||||||
)
|
)
|
||||||
|
|
||||||
var SyscallInputRegisters = []cpu.Register{X8, X0, X1, X2, X3, X4, X5}
|
var SyscallInputRegisters = []cpu.Register{X8, X0, X1, X2, X3, X4, X5}
|
||||||
|
@ -45,7 +45,7 @@ func New(code []byte, data []byte) *ELF {
|
|||||||
Size: HeaderSize,
|
Size: HeaderSize,
|
||||||
ProgramHeaderEntrySize: ProgramHeaderSize,
|
ProgramHeaderEntrySize: ProgramHeaderSize,
|
||||||
ProgramHeaderEntryCount: 2,
|
ProgramHeaderEntryCount: 2,
|
||||||
SectionHeaderEntrySize: SectionHeaderSize,
|
SectionHeaderEntrySize: 0,
|
||||||
SectionHeaderEntryCount: 0,
|
SectionHeaderEntryCount: 0,
|
||||||
SectionNameStringTableIndex: 0,
|
SectionNameStringTableIndex: 0,
|
||||||
},
|
},
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package macho
|
package macho
|
||||||
|
|
||||||
|
const HeaderSize = 32
|
||||||
|
|
||||||
// Header contains general information.
|
// Header contains general information.
|
||||||
type Header struct {
|
type Header struct {
|
||||||
Magic uint32
|
Magic uint32
|
||||||
|
@ -24,9 +24,9 @@ func New(code []byte, data []byte) *MachO {
|
|||||||
Architecture: CPU_X86_64,
|
Architecture: CPU_X86_64,
|
||||||
MicroArchitecture: 3 | 0x80000000,
|
MicroArchitecture: 3 | 0x80000000,
|
||||||
Type: TypeExecute,
|
Type: TypeExecute,
|
||||||
NumCommands: 5,
|
NumCommands: 4,
|
||||||
SizeCommands: 72*4 + 184,
|
SizeCommands: Segment64Size*3 + ThreadSize,
|
||||||
Flags: FlagNoUndefs,
|
Flags: FlagNoUndefs | FlagNoHeapExecution,
|
||||||
Reserved: 0,
|
Reserved: 0,
|
||||||
},
|
},
|
||||||
Code: code,
|
Code: code,
|
||||||
@ -52,33 +52,19 @@ func (m *MachO) Write(writer io.Writer) {
|
|||||||
InitProt: 0,
|
InitProt: 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
codePadding := common.Padding(32+m.Header.SizeCommands, config.Align)
|
codePadding := common.Padding(HeaderSize+m.Header.SizeCommands, config.Align)
|
||||||
codeEnd := uint64(config.CodeOffset + len(m.Code))
|
codeEnd := uint64(config.CodeOffset + len(m.Code))
|
||||||
dataPadding := common.Padding(codeEnd, config.Align)
|
dataPadding := common.Padding(codeEnd, config.Align)
|
||||||
dataStart := codeEnd + dataPadding
|
dataStart := codeEnd + dataPadding
|
||||||
|
|
||||||
binary.Write(writer, binary.LittleEndian, &Segment64{
|
|
||||||
LoadCommand: LcSegment64,
|
|
||||||
Length: 72,
|
|
||||||
Name: [16]byte{'_', '_', 'H', 'E', 'A', 'D'},
|
|
||||||
Address: config.BaseAddress,
|
|
||||||
SizeInMemory: config.CodeOffset,
|
|
||||||
Offset: 0,
|
|
||||||
SizeInFile: config.CodeOffset,
|
|
||||||
NumSections: 0,
|
|
||||||
Flag: 0,
|
|
||||||
MaxProt: ProtReadable | ProtExecutable,
|
|
||||||
InitProt: ProtReadable | ProtExecutable,
|
|
||||||
})
|
|
||||||
|
|
||||||
binary.Write(writer, binary.LittleEndian, &Segment64{
|
binary.Write(writer, binary.LittleEndian, &Segment64{
|
||||||
LoadCommand: LcSegment64,
|
LoadCommand: LcSegment64,
|
||||||
Length: 72,
|
Length: 72,
|
||||||
Name: [16]byte{'_', '_', 'T', 'E', 'X', 'T'},
|
Name: [16]byte{'_', '_', 'T', 'E', 'X', 'T'},
|
||||||
Address: config.BaseAddress + config.CodeOffset,
|
Address: config.BaseAddress,
|
||||||
SizeInMemory: uint64(len(m.Code)),
|
SizeInMemory: config.CodeOffset + uint64(len(m.Code)),
|
||||||
Offset: config.CodeOffset,
|
Offset: 0,
|
||||||
SizeInFile: uint64(len(m.Code)),
|
SizeInFile: config.CodeOffset + uint64(len(m.Code)),
|
||||||
NumSections: 0,
|
NumSections: 0,
|
||||||
Flag: 0,
|
Flag: 0,
|
||||||
MaxProt: ProtReadable | ProtExecutable,
|
MaxProt: ProtReadable | ProtExecutable,
|
||||||
@ -103,31 +89,30 @@ func (m *MachO) Write(writer io.Writer) {
|
|||||||
LoadCommand: LcUnixthread,
|
LoadCommand: LcUnixthread,
|
||||||
Len: 184,
|
Len: 184,
|
||||||
Type: 0x4,
|
Type: 0x4,
|
||||||
})
|
Data: [43]uint32{
|
||||||
|
42,
|
||||||
binary.Write(writer, binary.LittleEndian, []uint32{
|
0, 0,
|
||||||
42,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
config.BaseAddress + config.CodeOffset, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
config.BaseAddress + config.CodeOffset, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
0, 0,
|
||||||
0, 0,
|
},
|
||||||
0, 0,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
writer.Write(bytes.Repeat([]byte{0}, int(codePadding)))
|
writer.Write(bytes.Repeat([]byte{0}, int(codePadding)))
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package macho
|
package macho
|
||||||
|
|
||||||
|
const Segment64Size = 72
|
||||||
|
|
||||||
// Segment64 is a segment load command.
|
// Segment64 is a segment load command.
|
||||||
type Segment64 struct {
|
type Segment64 struct {
|
||||||
LoadCommand
|
LoadCommand
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
package macho
|
package macho
|
||||||
|
|
||||||
|
const ThreadSize = 184
|
||||||
|
|
||||||
// Thread is a thread state load command.
|
// Thread is a thread state load command.
|
||||||
type Thread struct {
|
type Thread struct {
|
||||||
LoadCommand
|
LoadCommand
|
||||||
Len uint32
|
Len uint32
|
||||||
Type uint32
|
Type uint32
|
||||||
|
Data [43]uint32
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user