Added a section for machine code instructions in Mach-O
All checks were successful
/ test (push) Successful in 15s
All checks were successful
/ test (push) Successful in 15s
This commit is contained in:
parent
f0d43bbee5
commit
4d3b47df32
5 changed files with 47 additions and 11 deletions
|
@ -3,6 +3,6 @@ package macho
|
||||||
const (
|
const (
|
||||||
BaseAddress = 0x1000000
|
BaseAddress = 0x1000000
|
||||||
NumCommands = 7
|
NumCommands = 7
|
||||||
SizeCommands = Segment64Size*3 + DyldInfoCommandSize + MainSize + DylinkerCommandSize + len(LinkerString) + DylibCommandSize + len(LibSystemString)
|
SizeCommands = Segment64Size*3 + Section64Size + DyldInfoCommandSize + MainSize + DylinkerCommandSize + len(LinkerString) + DylibCommandSize + len(LibSystemString)
|
||||||
HeaderEnd = HeaderSize + SizeCommands
|
HeaderEnd = HeaderSize + SizeCommands
|
||||||
)
|
)
|
|
@ -11,5 +11,5 @@ type Header struct {
|
||||||
NumCommands uint32
|
NumCommands uint32
|
||||||
SizeCommands uint32
|
SizeCommands uint32
|
||||||
Flags HeaderFlags
|
Flags HeaderFlags
|
||||||
Reserved uint32
|
_ uint32
|
||||||
}
|
}
|
|
@ -12,8 +12,9 @@ import (
|
||||||
type MachO struct {
|
type MachO struct {
|
||||||
Header
|
Header
|
||||||
PageZero Segment64
|
PageZero Segment64
|
||||||
CodeHeader Segment64
|
CodeSegment Segment64
|
||||||
DataHeader Segment64
|
CodeSection Section64
|
||||||
|
DataSegment Segment64
|
||||||
MainHeader Main
|
MainHeader Main
|
||||||
InfoHeader DyldInfoCommand
|
InfoHeader DyldInfoCommand
|
||||||
LinkerHeader DylinkerCommand
|
LinkerHeader DylinkerCommand
|
||||||
|
@ -36,7 +37,6 @@ func Write(writer io.WriteSeeker, b *build.Build, codeBytes []byte, dataBytes []
|
||||||
NumCommands: NumCommands,
|
NumCommands: NumCommands,
|
||||||
SizeCommands: uint32(SizeCommands),
|
SizeCommands: uint32(SizeCommands),
|
||||||
Flags: FlagNoUndefs | FlagDyldLink | FlagTwoLevel | FlagPIE | FlagNoHeapExecution,
|
Flags: FlagNoUndefs | FlagDyldLink | FlagTwoLevel | FlagPIE | FlagNoHeapExecution,
|
||||||
Reserved: 0,
|
|
||||||
},
|
},
|
||||||
PageZero: Segment64{
|
PageZero: Segment64{
|
||||||
LoadCommand: LcSegment64,
|
LoadCommand: LcSegment64,
|
||||||
|
@ -51,20 +51,29 @@ func Write(writer io.WriteSeeker, b *build.Build, codeBytes []byte, dataBytes []
|
||||||
MaxProt: 0,
|
MaxProt: 0,
|
||||||
InitProt: 0,
|
InitProt: 0,
|
||||||
},
|
},
|
||||||
CodeHeader: Segment64{
|
CodeSegment: Segment64{
|
||||||
LoadCommand: LcSegment64,
|
LoadCommand: LcSegment64,
|
||||||
Length: Segment64Size,
|
Length: Segment64Size + Section64Size,
|
||||||
Name: [16]byte{'_', '_', 'T', 'E', 'X', 'T'},
|
Name: [16]byte{'_', '_', 'T', 'E', 'X', 'T'},
|
||||||
Address: uint64(BaseAddress),
|
Address: uint64(BaseAddress),
|
||||||
SizeInMemory: uint64(code.MemoryOffset + len(code.Bytes)),
|
SizeInMemory: uint64(code.MemoryOffset + len(code.Bytes)),
|
||||||
Offset: 0,
|
Offset: 0,
|
||||||
SizeInFile: uint64(code.FileOffset + len(code.Bytes)),
|
SizeInFile: uint64(code.FileOffset + len(code.Bytes)),
|
||||||
NumSections: 0,
|
NumSections: 1,
|
||||||
Flag: 0,
|
Flag: 0,
|
||||||
MaxProt: ProtReadable | ProtExecutable,
|
MaxProt: ProtReadable | ProtExecutable,
|
||||||
InitProt: ProtReadable | ProtExecutable,
|
InitProt: ProtReadable | ProtExecutable,
|
||||||
},
|
},
|
||||||
DataHeader: Segment64{
|
CodeSection: Section64{
|
||||||
|
SectionName: [16]byte{'_', '_', 't', 'e', 'x', 't'},
|
||||||
|
SegmentName: [16]byte{'_', '_', 'T', 'E', 'X', 'T'},
|
||||||
|
Address: uint64(BaseAddress + code.MemoryOffset),
|
||||||
|
Size: uint64(len(code.Bytes)),
|
||||||
|
Offset: uint32(code.FileOffset),
|
||||||
|
Align: 6,
|
||||||
|
Flags: FlagPureInstructions,
|
||||||
|
},
|
||||||
|
DataSegment: Segment64{
|
||||||
LoadCommand: LcSegment64,
|
LoadCommand: LcSegment64,
|
||||||
Length: Segment64Size,
|
Length: Segment64Size,
|
||||||
Name: [16]byte{'_', '_', 'D', 'A', 'T', 'A', '_', 'C', 'O', 'N', 'S', 'T'},
|
Name: [16]byte{'_', '_', 'D', 'A', 'T', 'A', '_', 'C', 'O', 'N', 'S', 'T'},
|
||||||
|
@ -101,8 +110,9 @@ func Write(writer io.WriteSeeker, b *build.Build, codeBytes []byte, dataBytes []
|
||||||
|
|
||||||
binary.Write(writer, binary.LittleEndian, &m.Header)
|
binary.Write(writer, binary.LittleEndian, &m.Header)
|
||||||
binary.Write(writer, binary.LittleEndian, &m.PageZero)
|
binary.Write(writer, binary.LittleEndian, &m.PageZero)
|
||||||
binary.Write(writer, binary.LittleEndian, &m.CodeHeader)
|
binary.Write(writer, binary.LittleEndian, &m.CodeSegment)
|
||||||
binary.Write(writer, binary.LittleEndian, &m.DataHeader)
|
binary.Write(writer, binary.LittleEndian, &m.CodeSection)
|
||||||
|
binary.Write(writer, binary.LittleEndian, &m.DataSegment)
|
||||||
binary.Write(writer, binary.LittleEndian, &m.MainHeader)
|
binary.Write(writer, binary.LittleEndian, &m.MainHeader)
|
||||||
binary.Write(writer, binary.LittleEndian, &m.InfoHeader)
|
binary.Write(writer, binary.LittleEndian, &m.InfoHeader)
|
||||||
binary.Write(writer, binary.LittleEndian, &m.LinkerHeader)
|
binary.Write(writer, binary.LittleEndian, &m.LinkerHeader)
|
||||||
|
|
19
src/macho/Section64.go
Normal file
19
src/macho/Section64.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
package macho
|
||||||
|
|
||||||
|
const Section64Size = 80
|
||||||
|
|
||||||
|
// Section64 is one of multiple sections in a segment.
|
||||||
|
type Section64 struct {
|
||||||
|
SectionName [16]byte
|
||||||
|
SegmentName [16]byte
|
||||||
|
Address uint64
|
||||||
|
Size uint64
|
||||||
|
Offset uint32
|
||||||
|
Align uint32
|
||||||
|
RelocationOffset uint32
|
||||||
|
NumRelocations uint32
|
||||||
|
Flags SectionFlags
|
||||||
|
_ uint32
|
||||||
|
_ uint32
|
||||||
|
_ uint32
|
||||||
|
}
|
7
src/macho/SectionFlags.go
Normal file
7
src/macho/SectionFlags.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package macho
|
||||||
|
|
||||||
|
type SectionFlags uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
FlagPureInstructions SectionFlags = 0x80000000
|
||||||
|
)
|
Loading…
Add table
Add a link
Reference in a new issue