A Swift library for parsing mach-o files to obtain Swift information. (Types/Protocol/ProtocolConformance info)
It may be the most powerful swift dump you can find so far, as it uses a custom Demangler to parse symbolic references and restore the original logic of the Swift Runtime as much as possible.
Note
This library is developed as an extension of MachOKit for Swift
- Protocol Descriptors
- Protocol Conformance Descriptors
- Type Context Descriptors
- Associated Type Descriptors
- Method Symbol For Dyld Caches
- Builtin Type Descriptors
- Swift Interface Support
- Type Member Layout (WIP, MachOImage only)
- Swift Section MCP
Swift information from MachOImage or MachOFile can be retrieved via the swift property.
import MachOKit
import MachOSwiftSection
let machO //` MachOFile` or `MachOImage`
// Protocol Descriptors
let protocolDescriptors = machO.swift.protocolDescriptors ?? []
for protocolDescriptor in protocolDescriptors {
    let protocolType = try Protocol(descriptor: protocolDescriptor, in: machO)
    // do somethings ...
}
// Protocol Conformance Descriptors
let protocolConformanceDescriptors = machO.swift.protocolConformanceDescriptors ?? []
for protocolConformanceDescriptor in protocolConformanceDescriptors {
    let protocolConformance = try ProtocolConformance(descriptor: protocolConformanceDescriptor, in: machO)
    // do somethings ...
}
// Type/Nominal Descriptors
let typeContextDescriptors = machO.swift.typesContextDescriptors ?? []
for typeContextDescriptor in typeContextDescriptors {
    switch typeContextDescriptor {
    case .type(let typeContextDescriptorWrapper):
        switch typeContextDescriptorWrapper {
        case .enum(let enumDescriptor):
            let enumType = try Enum(descriptor: enumDescriptor, in: machO)
            // do somethings ...
        case .struct(let structDescriptor):
            let structType = try Struct(descriptor: structDescriptor, in: machO)
            // do somethings ...
        case .class(let classDescriptor):
            let classType = try Class(descriptor: classDescriptor, in: machO)
            // do somethings ...
        }
    default:
        break
    }
}For generating complete Swift interface files, you can use the SwiftInterface library which provides a more comprehensive interface generation capability.
import MachOKit
import MachOSwiftSection
import SwiftInterface
let builder = try SwiftInterfaceBuilder(configuration: .init(), eventHandlers: [], in: machO)
try await builder.prepare()
let result = try builder.printRoot()You can get the swift-section CLI tool in three ways:
- GitHub Releases: Download from GitHub releases
- Homebrew: Install via brew install swift-section
- Build from Source: Build with ./build-executable-product.sh(requires Xcode 26.0 / Swift 6.2+ toolchain)
The swift-section CLI tool provides three main subcommands: dump, demangle, and interface.
Dump Swift information from a Mach-O file or dyld shared cache.
swift-section dump [options] [file-path]Basic usage:
# Dump all Swift information from a Mach-O file
swift-section dump /path/to/binary
# Dump only types and protocols
swift-section dump --sections types,protocols /path/to/binary
# Save output to file
swift-section dump --output-path output.txt /path/to/binary
# Use specific architecture
swift-section dump --architecture arm64 /path/to/binaryWorking with dyld shared cache:
# Dump from system dyld shared cache
swift-section dump --uses-system-dyld-shared-cache --cache-image-name UIKit
# Dump from specific dyld shared cache
swift-section dump --dyld-shared-cache --cache-image-path /path/to/cache /path/to/dyld_shared_cacheGenerate a complete Swift interface file from a Mach-O file, similar to Swift's generated interfaces.
swift-section interface [options] [file-path]Basic usage:
# Generate Swift interface from a Mach-O file
swift-section interface /path/to/binary
# Save interface to file
swift-section interface --output-path interface.swift /path/to/binaryMachOSwiftSection is released under the MIT License. See LICENSE