Skip to content

Commit ab08dc4

Browse files
committed
Dynamic data in dyld cache loaded
1 parent 7d65710 commit ab08dc4

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

Sources/MachOKit/DyldCacheLoaded.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,4 +392,14 @@ extension DyldCacheLoaded {
392392
.advanced(by: numericCast(header.swiftOptsOffset))
393393
.autoBoundPointee()
394394
}
395+
396+
public var dynamicData: DyldCacheDynamicData? {
397+
guard mainCacheHeader.dynamicDataOffset > 0,
398+
mainCacheHeader.hasProperty(\.dynamicDataMaxSize) else {
399+
return nil
400+
}
401+
return ptr
402+
.advanced(by: numericCast(header.dynamicDataOffset))
403+
.autoBoundPointee()
404+
}
395405
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//
2+
// DyldCacheDynamicData.swift
3+
// MachOKit
4+
//
5+
// Created by p-x9 on 2025/02/28
6+
//
7+
//
8+
9+
import Foundation
10+
11+
public struct DyldCacheDynamicData: LayoutWrapper {
12+
public typealias Layout = dyld_cache_dynamic_data_header
13+
14+
public var layout: Layout
15+
}
16+
17+
extension DyldCacheDynamicData {
18+
public var magic: String {
19+
.init(tuple: layout.magic)
20+
}
21+
}
22+
23+
#if canImport(Darwin)
24+
extension DyldCacheDynamicData {
25+
public var path: String {
26+
let path: UnsafeMutablePointer<CChar> = .allocate(capacity: Int(MAXPATHLEN))
27+
var fsid: UInt64 = numericCast(layout.fsId)
28+
return withUnsafeMutablePointer(to: &fsid) { fsid in
29+
fsgetpath(
30+
path,
31+
Int(MAXPATHLEN),
32+
UnsafeMutableRawPointer(fsid).assumingMemoryBound(to: fsid_t.self),
33+
layout.fsObjId
34+
)
35+
return String(cString: path)
36+
}
37+
}
38+
}
39+
#endif

Tests/MachOKitTests/DyldCacheLoadedPrintTests.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,14 @@ final class DyldCacheLoadedPrintTests: XCTestCase {
318318
print("Metadata Conformance Hash Table Cache Offset:", swiftOptimization.metadataConformanceHashTableCacheOffset)
319319
print("Foreign Type Conformance Hash Table Cache Offset:", swiftOptimization.foreignTypeConformanceHashTableCacheOffset)
320320
}
321+
322+
func testDynamicData() throws {
323+
guard let dynamicData = cache.dynamicData else { return }
324+
print("Magic:", dynamicData.magic)
325+
print("fsId:", dynamicData.fsId)
326+
print("fsObjId:", dynamicData.fsObjId)
327+
print("path:", dynamicData.path)
328+
}
321329
}
322330

323331
#endif

0 commit comments

Comments
 (0)