Symbolic makes it easy to get information about an executable, shared object, or static library.
To dynamically load a shared object file, create a
SharedObject, passing in the file URL where the object resides.
You can also use
SharedObject.current() to get ahold of the object in which your code will reside once compiled.
let libFoo = SharedObject(object: URL(fileURLWithPath: "/usr/lib/libfoo.dylib")) let myExe = SharedObject.current()
From there, you can ask the object for the addresses of symbols in the object and (if you're adventurous) cast function addresses to
@convention(c) function pointers.
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
Additionally, if you have an address in mind that you've already linked, you can ask for it directly in your current address space:
let addrInfo = SymbolInfo(address: addr) addrInfo.symbolName // "sin"
Harlan Haskins (@harlanhaskins)
This project is released under the MIT license, a copy of which is avaialable in this repository.