Skip to content

Instantly share code, notes, and snippets.

@tyrone-sudeium
Created January 21, 2015 12:37
Show Gist options
  • Save tyrone-sudeium/3dc668a714e4e8553c1e to your computer and use it in GitHub Desktop.
Save tyrone-sudeium/3dc668a714e4e8553c1e to your computer and use it in GitHub Desktop.
Get the current running executable's binary UUID
func binaryUUID() -> NSUUID? {
var executableHeader = UnsafePointer<mach_header>()
for var i = UInt32(0); i < _dyld_image_count(); i++ {
let header = _dyld_get_image_header(i)
if header.memory.filetype == UInt32(MH_EXECUTE) {
executableHeader = header
break
}
}
if executableHeader == nil {
return nil
}
let is64Bit = executableHeader.memory.magic == MH_MAGIC_64 || executableHeader.memory.magic == MH_CIGAM_64
var cursor = unsafeBitCast(executableHeader, UnsafePointer<UInt8>.self)
cursor = cursor.advancedBy(is64Bit ? sizeof(mach_header_64) : sizeof(mach_header))
var segCmd = UnsafePointer<segment_command>()
for var i = UInt32(0); i < executableHeader.memory.ncmds; i++ {
segCmd = unsafeBitCast(cursor, UnsafePointer<segment_command>.self)
if segCmd.memory.cmd == UInt32(LC_UUID) {
let uuidCmd = unsafeBitCast(segCmd, UnsafePointer<uuid_command>.self)
var uuidTuple = uuidCmd.memory.uuid
let uuid: NSUUID? = withUnsafePointer(&uuidTuple) {
NSUUID(UUIDBytes: UnsafePointer<UInt8>($0))
}
return uuid
}
cursor = cursor.advancedBy(Int(segCmd.memory.cmdsize))
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment