Skip to content

Commit

Permalink
Merge pull request #50 from p-x9/feature/fix-address-range
Browse files Browse the repository at this point in the history
Fix calculation of segment address range
  • Loading branch information
p-x9 authored Feb 17, 2024
2 parents be22ad9 + fe7837b commit 307fec4
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 6 deletions.
15 changes: 12 additions & 3 deletions Sources/MachOKit/LoadCommand/SegmentCommand.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
//
//
// Created by p-x9 on 2023/11/28.
//
//
//

import Foundation
Expand All @@ -12,6 +12,7 @@ public protocol SegmentCommandProtocol: LoadCommandWrapper {
associatedtype SectionType: LayoutWrapper
var segmentName: String { get }
var virtualMemoryAddress: Int { get }
var virtualMemorySize: Int { get }
var fileOffset: Int { get }
var fileSize: Int { get }
var maxProtection: VMProtection { get }
Expand All @@ -26,15 +27,15 @@ public protocol SegmentCommandProtocol: LoadCommandWrapper {

extension SegmentCommandProtocol {
public func startPtr(vmaddrSlide: Int) -> UnsafeRawPointer? {
let address = vmaddrSlide + virtualMemoryAddress - fileOffset
let address = vmaddrSlide + virtualMemoryAddress
return UnsafeRawPointer(bitPattern: address)
}

public func endPtr(vmaddrSlide: Int) -> UnsafeRawPointer? {
guard let start = startPtr(vmaddrSlide: vmaddrSlide) else {
return nil
}
return start + fileSize
return start + virtualMemorySize
}
}

Expand All @@ -53,6 +54,10 @@ public struct SegmentCommand: SegmentCommandProtocol {
numericCast(layout.vmaddr)
}

public var virtualMemorySize: Int {
numericCast(layout.vmsize)
}

public var fileOffset: Int {
numericCast(layout.fileoff)
}
Expand Down Expand Up @@ -94,6 +99,10 @@ public struct SegmentCommand64: SegmentCommandProtocol {
numericCast(layout.vmaddr)
}

public var virtualMemorySize: Int {
numericCast(layout.vmsize)
}

public var fileOffset: Int {
numericCast(layout.fileoff)
}
Expand Down
2 changes: 2 additions & 0 deletions Sources/MachOKit/MachOImage+DyldChainedFixups..swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ extension MachOImage.DyldChainedFixups {
}

let start = linkeditStartPtr
.advanced(by: -numericCast(linkedit.fileoff))
.advanced(by: numericCast(dyldChainedFixups.dataoff))
.assumingMemoryBound(to: UInt8.self)
let size: Int = numericCast(dyldChainedFixups.datasize)
Expand All @@ -52,6 +53,7 @@ extension MachOImage.DyldChainedFixups {
}

let start = linkeditStartPtr
.advanced(by: -numericCast(linkedit.fileoff))
.advanced(by: numericCast(dyldChainedFixups.dataoff))
.assumingMemoryBound(to: UInt8.self)
let size: Int = numericCast(dyldChainedFixups.datasize)
Expand Down
6 changes: 3 additions & 3 deletions Sources/MachOKit/MachOImage+static.swift
Original file line number Diff line number Diff line change
Expand Up @@ -109,12 +109,12 @@ extension MachOImage {

fileprivate extension MachOImage {
var addressRange: ClosedRange<Int>? {
let segments = self.segments
guard let slide = vmaddrSlide,
let text: any SegmentCommandProtocol = loadCommands.text64 ?? loadCommands.text,
let start = text.startPtr(vmaddrSlide: slide) else {
let start = segments.first?.startPtr(vmaddrSlide: slide),
let end = segments.last?.endPtr(vmaddrSlide: slide) else {
return nil
}
let end = start.advanced(by: text.fileSize)
return Int(bitPattern: start) ... Int(bitPattern: end)
}

Expand Down
1 change: 1 addition & 0 deletions Sources/MachOKit/MachOImage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,7 @@ extension MachOImage {
}

let start = linkeditStartPtr
.advanced(by: -numericCast(linkedit.fileoff))
.advanced(by: numericCast(dataInCode.dataoff))
.assumingMemoryBound(to: DataInCodeEntry.self)
let size: Int = numericCast(dataInCode.datasize) / MemoryLayout<DataInCodeEntry>.size
Expand Down

0 comments on commit 307fec4

Please sign in to comment.