How to get the build UUID in runtime and the image base address

后端 未结 3 1021
臣服心动
臣服心动 2020-12-09 06:53

Is there away to get the build UUID, the one that you can check in the dSYM generated file and the image base address in iOS.

Not so good when it comes to low level

3条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-09 07:24

    Here is a solution similar to Kerni's answer but which works for any platform (iOS device + simulator and OS X) and any architecture (32-bit + 64-bit). It also returns a NSUUID instead of a NSString.

    #import 
    #import 
    
    static NSUUID *ExecutableUUID(void)
    {
        const struct mach_header *executableHeader = NULL;
        for (uint32_t i = 0; i < _dyld_image_count(); i++)
        {
            const struct mach_header *header = _dyld_get_image_header(i);
            if (header->filetype == MH_EXECUTE)
            {
                executableHeader = header;
                break;
            }
        }
    
        if (!executableHeader)
            return nil;
    
        BOOL is64bit = executableHeader->magic == MH_MAGIC_64 || executableHeader->magic == MH_CIGAM_64;
        uintptr_t cursor = (uintptr_t)executableHeader + (is64bit ? sizeof(struct mach_header_64) : sizeof(struct mach_header));
        const struct segment_command *segmentCommand = NULL;
        for (uint32_t i = 0; i < executableHeader->ncmds; i++, cursor += segmentCommand->cmdsize)
        {
            segmentCommand = (struct segment_command *)cursor;
            if (segmentCommand->cmd == LC_UUID)
            {
                const struct uuid_command *uuidCommand = (const struct uuid_command *)segmentCommand;
                return [[NSUUID alloc] initWithUUIDBytes:uuidCommand->uuid];
            }
        }
    
        return nil;
    }
    

提交回复
热议问题