Symbolic

Symbolic 使得获取关于可执行文件、共享对象或静态库的信息变得容易。

用法

注意

⚠️这个库非常不安全。请谨慎使用!⚠️

要动态加载共享对象文件,请创建一个 SharedObject,并传入对象所在的文件 URL。

你也可以使用 SharedObject.current() 来获取代码编译后将要驻留的对象。

let libFoo = SharedObject(object: URL(fileURLWithPath: "/usr/lib/libfoo.dylib"))
let myExe = SharedObject.current()

从那里,你可以向对象请求对象中符号的地址,并且(如果你够大胆)可以将函数地址强制转换为 @convention(c) 函数指针。

let libcURL = URL(fileURLWithPath: "/usr/lib/libc.dylib")
let libc = SharedObject(object: libcURL)

let addr = libc.address(forSymbol: "sin") // will not be `nil`

typealias SinFn = @convention(c) (Double) -> Double

// Will perform an unsafeBitCast on your behalf!
let sinFn = libc.function(forSymbol: "sin", ofType: SinFn.self)

sinFn?(0.5) // 0.4794255386

此外,如果你心中已经有一个你已链接的地址,你可以直接在当前地址空间中请求它。

let addrInfo = SymbolInfo(address: addr)
addrInfo.symbolName // "sin"

作者

Harlan Haskins (@harlanhaskins)

许可协议

本项目根据 MIT 许可证发布,该许可证的副本可在本仓库中获取。