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 许可证发布,该许可证的副本可在本仓库中获取。