Skip to content

Commit b424ba6

Browse files
authored
Merge pull request #189 from p-x9/feature/dyld-cache-dynamic-data
[dyld cache] Dynamic data in dyld cache loaded
2 parents 9506bc5 + ed3ab3e commit b424ba6

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed

Sources/MachOKit/DyldCacheLoaded.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,16 @@ extension DyldCacheLoaded {
393393
.autoBoundPointee()
394394
}
395395

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+
}
405+
396406
public var tproMappings: MemorySequence<DyldCacheTproMappingInfo>? {
397407
guard mainCacheHeader.tproMappingsOffset > 0,
398408
mainCacheHeader.hasProperty(\.tproMappingsCount) else {
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: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,15 @@ final class DyldCacheLoadedPrintTests: XCTestCase {
319319
print("Foreign Type Conformance Hash Table Cache Offset:", swiftOptimization.foreignTypeConformanceHashTableCacheOffset)
320320
}
321321

322+
323+
func testDynamicData() throws {
324+
guard let dynamicData = cache.dynamicData else { return }
325+
print("Magic:", dynamicData.magic)
326+
print("fsId:", dynamicData.fsId)
327+
print("fsObjId:", dynamicData.fsObjId)
328+
print("path:", dynamicData.path)
329+
}
330+
322331
func testTproMappings() throws {
323332
guard let mappings = cache.tproMappings else { return }
324333
for mapping in mappings {

0 commit comments

Comments
 (0)