diff --git a/src/macho/ChainedStartsInImage.go b/src/macho/ChainedStartsInImage.go index 94a2465..ea026cf 100644 --- a/src/macho/ChainedStartsInImage.go +++ b/src/macho/ChainedStartsInImage.go @@ -1,5 +1,7 @@ package macho +const ChainedStartsInImageSize = 8 + // ChainedStartsInImage describes which segments contain fixups. type ChainedStartsInImage struct { SegCount uint32 diff --git a/src/macho/MachO.go b/src/macho/MachO.go index 73af1a4..c422087 100644 --- a/src/macho/MachO.go +++ b/src/macho/MachO.go @@ -128,7 +128,7 @@ func Write(writer io.WriteSeeker, build *config.Build, codeBytes []byte, dataByt LoadCommand: LcDyldChainedFixups, Length: LinkeditDataCommandSize, DataOffset: uint32(imports.FileOffset), - DataSize: ChainedFixupsHeaderSize + ChainedStartsInSegmentSize, + DataSize: ChainedFixupsHeaderSize + ChainedStartsInImageSize + ChainedStartsInSegmentSize, }, CodeSignature: LinkeditDataCommand{ LoadCommand: LcCodeSignature, diff --git a/src/macho/createLinkeditSegment.go b/src/macho/createLinkeditSegment.go index e4be5cd..4540457 100644 --- a/src/macho/createLinkeditSegment.go +++ b/src/macho/createLinkeditSegment.go @@ -10,8 +10,8 @@ import ( "git.urbach.dev/cli/q/src/exe" ) -// Code signing flags const ( + // Code signing flags CS_ADHOC = 0x00000002 CS_HARD = 0x00000100 CS_KILL = 0x00000200 @@ -29,6 +29,11 @@ const ( CS_MAGIC_EMBEDDED_SIGNATURE = 0xFADE0CC0 CS_SUPPORTSEXECSEG = 0x20400 CS_EXECSEG_MAIN_BINARY = 0x1 + + // Dyld + DYLD_CHAINED_IMPORT = 1 + DYLD_CHAINED_PTR_64 = 2 + DYLD_CHAINED_PTR_START_NONE = 0xFFFF ) // createLinkeditSegment creates the contents of the __LINKEDIT segment. @@ -36,12 +41,23 @@ func createLinkeditSegment(build *config.Build, code *exe.Section) []byte { buffer := bytes.Buffer{} // Chained fixups - binary.Write(&buffer, binary.LittleEndian, &ChainedFixupsHeader{StartsOffset: ChainedFixupsHeaderSize, ImportsFormat: 1}) - binary.Write(&buffer, binary.LittleEndian, &ChainedStartsInSegment{}) + binary.Write(&buffer, binary.LittleEndian, &ChainedFixupsHeader{ + StartsOffset: ChainedFixupsHeaderSize, + ImportsFormat: DYLD_CHAINED_IMPORT, + }) - for range 8 { - buffer.WriteByte(0) - } + binary.Write(&buffer, binary.LittleEndian, &ChainedStartsInImage{ + SegCount: 1, + SegInfoOffset: [1]uint32{ChainedStartsInImageSize}, + }) + + binary.Write(&buffer, binary.LittleEndian, &ChainedStartsInSegment{ + Size: ChainedStartsInSegmentSize, + PageSize: uint16(build.MemoryAlign()), + PageCount: 1, + PageStarts: [1]uint16{DYLD_CHAINED_PTR_START_NONE}, + PointerFormat: DYLD_CHAINED_PTR_64, + }) // Superblob superBlob := bytes.Buffer{}